Planificador de monoprocesadores

Anuncio
Seminario “Diseño y construcción de microrrobots”
Marzo 2006
Planificador de monoprocesadores
SEMINARIO
“DISEÑO Y CONSTRUCCIÓN DE
MICRORROBOTS”
Planificador de monoprocesadores
Miguel Escudero Carpintero 03123016 F
Ingeniería Técnica en Informática de Gestión
Universidad de Alcalá
Departamento de Electrónica
Resumen. El objetivo de este trabajo consiste en familiarizar a todos los alumnos
interesados en la creación de un microrrobot, en la parte del software que deberán
programar para darle cierta inteligencia a su robot. Para ello me he querido centrar en una
herramienta muy importante que se incluye en todos los sistemas UNIX, denominada
VisualOS, la cual nos permite comprobar la planificación que realiza un algoritmo sobre los
procesos en un sistema operativo. Esta herramienta nos permite comprobar el resulta
obtenido al seleccionar un determinado algoritmo y así mismo, podemos contrastar dichos
resultados con los descritos en teoría. Este trabajo sólo tiene por objetivo conocer el
funcionamiento del planificador de procesos en un sistema operativo y algunos algoritmos
que se utilizan para ello.
1 Introducción:
El programa VisualOS que se presenta permite observar los aspectos más relevantes de un
sistema operativo en funcionamiento. También permite ver cómo funcionan y cómo interactúan
los tres sistemas más importantes: planificación de procesos, gestión de memoria y
Entrada/Salida. Las representaciones son dinámicas pudiendo capturarse algunas de las gráficas,
nos muestra el funcionamiento del sistema en "vivo" o experimenta directamente con él.
Un sistema operativo consta de muchas partes íntimamente relacionadas, de manera que su
buen funcionamiento depende tanto del correcto funcionamiento de cada una de ellas como de
su correcta interacción. Este programa permite tanto su estudio global como el estudio concreto
de alguna de sus partes.
Tradicionalmente cada parte de un sistema operativo se estudia por separado, siendo muy
difícil ofrecer una visión global e integrada de todas ellas, así como de los problemas de la
concurrencia, debido a la difícil representación del sistema en funcionamiento.
1
Seminario “Diseño y construcción de microrrobots”
Marzo 2006
Planificador de monoprocesadores
Facilita el trabajo de realizar gráficas y otras representaciones que expliquen los conceptos
importantes del sistema operativo, y permite que se vea más claramente, porque podrá
realmente ver, por ejemplo, cómo los distintos procesos se disputan el procesador y la memoria
a la vez que pretenden ser los primeros en leer del disco y cómo es el sistema el que gestiona
estos recursos. Todo lo verán en conjunto y no fragmentado como se puede explicar en una
clase tradicional.
Por supuesto también se pueden desactivar algunas de las partes para poder ver más
claramente el funcionamiento de las demás. Incluso se pueden mostrar los distintos subsistemas
en máquinas diferentes para realizar prácticas en las que cada uno, eligiendo el algoritmo que
quiere utilizar o incluso tomando las decisiones manualmente.
En un sistema multiprogramado la memoria principal contiene varios procesos. Cada
proceso alterna entre el procesador y esperar que se realice una operación de E/S o que ocurra
algún otro suceso. El procesador o los procesadores se mantienen ocupados ejecutando un
proceso mientras los demás esperan.
La clave de la multiprogramación esta en la planificación, normalmente son cuatro los tipos
de planificación que entran en juego. Una de ellas es la planificación de E/S, las otras tres son
clases de planificación del procesador.
La planificación del procesador consiste en asignar procesos al procesador o los
procesadores para que sean ejecutados a lo largo del tiempo, de forma que se cumplan objetivos
del sistema tales como el tiempo de respuesta, la productividad y la eficiencia del procesado. En
muchos sistemas, la actividad de planificación se divide en tres funciones independientes:
planificación a largo, medio y corto plazo.
El esquema muestra la relación de las funciones de planificación con el diagrama de
transición de estados de un proceso.
2
Seminario “Diseño y construcción de microrrobots”
Marzo 2006
Planificador de monoprocesadores
•
•
•
La planificación a largo plazo se lleva a cabo al crear un proceso nuevo. Se corresponde
con la decisión de añadir un nuevo proceso al conjunto de procesos que ya están
activos.
La planificación a medio plazo forma parte de la función de intercambio.
Esta es la decisión de añadir un proceso a los que se encuentran, al menos parcialmente,
en la memoria principal y por lo tanto disponible para la ejecución.
La planificación a corto plazo consiste en decidir que proceso en estado de listo será el
que se ejecute a continuación
La figura muestra las colas involucradas en las transiciones de estados de un proceso.
La planificación afecta el rendimiento del sistema, pues determina que proceso esperará y
cual continuará.
Fundamentalmente, la planificación no es sino una gestión de dichas colas que minimice la
espera y optimice el rendimiento del entorno.
2 Descripción de los algoritmos:
A continuación explicamos y describimos el funcionamiento de los algoritmos estudiados
con la herramienta VisualOS: First Come First Server, Round Robin, Highest Response Ratio
Next, Shortest Process Next y Shortest Remaining Time.
1.- First Come First Served (Primero en entrar primero en salir)
El primer proceso en condiciones de ejecutarse será el asignado al procesador y permanece
asignado hasta no poder ejecutarse más por tener que esperar a algún evento o por haber
3
Seminario “Diseño y construcción de microrrobots”
Marzo 2006
Planificador de monoprocesadores
terminado. Se “roban” los fragmentos de memoria de forma cíclica sin tener en cuenta a quién
pertenecen o su frecuencia de utilización. Se realizan los accesos en el mismo orden en que son
solicitados.
La política más simple de planificación es la de primero en llegar/primero en servirse (FCFS,
First-come, First-served), también llamada primero en entrar/primero en salir (FIFO, First-in,
First-out). Cada vez que un proceso esté listo para ejecutarse, se incorpora a la cola de listos.
Cuando el proceso actual cesa su ejecución, se selecciona el proceso más antiguo de la cola.
La figura siguiente muestra las pautas de ejecución del ejemplo propuesto para un ciclo.
Primero, se determina el tiempo de finalización de cada proceso. A partir de él, es posible
determinar el tiempo de retorno. En términos del modelo de colas, el tiempo de retorno (TAT)
es el tiempo de estancia Tr, o tiempo total que el elemento consume en el sistema (tiempo de
espera más tiempo de servicio). Un valor más útil es el tiempo de retorno normalizado, que es la
razón entre el tiempo de retorno y el tiempo de servicio. Este valor indica el retardo relativo
experimentado por un proceso. Normalmente, cuanto mayor es el tiempo de ejecución, mayor es
el retardo absoluto que puede tolerarse. El valor mínimo para esta proporción es de 1.0; los
valores mayores corresponden a niveles decrecientes del servicio.
Ejemplo de planificación de procesos
Proceso
A
B
C
D
E
Instante de llegada
0
2
4
6
8
Tiempo de servicio
3
6
4
5
2
FCFS rinde mucho mejor con procesos largos que con procesos cortos. Considérese el
siguiente ejemplo, basado en uno propuesto en [FINK88]:
Proceso
Instante
de llegada
W
X
Y
Z
0
1
2
3
Tiempo
de servicio
(Ts)
1
100
1
100
Instante
de
comienzo
0
1
101
102
Media
Instante
de
finalización
1
101
102
202
Tiempo
de retorno
(Tr)
1
100
100
199
Tr/Ts
100
26
1
1
100
1,99
El tiempo de espera normalizado para el proceso Y es intolerable comparado con los otros: el
tiempo total que pasa en el sistema es 100 veces el tiempo de procesamiento necesario. Esto
ocurre siempre que un proceso corto llega justo después de uno largo. Por otro lado, incluso en
este ejemplo extremo, a los procesos largos no les va del todo mal. El proceso Z obtiene un
tiempo de retorno que es aproximadamente el doble que el de Y, pero su tiempo de espera
normalizado está por debajo de 2,0.
Otro problema del FCFS es que tiende a favorecer a los procesos con carga de CPU frente a
los que tienen carga de E/S. Supóngase un conjunto de procesos, uno de los cuales usa
principalmente la CPU (carga de CPU) y los otros se dedican a hacer E/S (carga de E/S).
4
Seminario “Diseño y construcción de microrrobots”
Marzo 2006
Planificador de monoprocesadores
Cuando un proceso con carga de CPU se está ejecutando, todos los que tienen carga de E/S
deben esperar. Algunos de ellos pueden estar en colas de E/S (estado bloqueado) pero puede ser
que regresen a la cola de listos mientras el de la carga de CPU todavía se está ejecutando.
Llegado ese momento, todos o la mayoría de los dispositivos de E/S estarán ociosos, a pesar de
que, posiblemente, haya trabajo para ellos. Cuando el proceso que está actualmente en ejecución
abandone el estado Ejecutando, los procesos listos con carga de E/S pasarán rápidamente por el
estado de Ejecución y volverán a bloquearse por sucesos de E/S. Si el proceso con carga de
CPU también está bloqueado, el procesador pasa a estar desocupado. Así pues, FCFS puede dar
como resultado un uso ineficiente tanto del procesador como de los dispositivos de E/S.
FCFS no es una alternativa atractiva por sí misma para un sistema monoprocesador. Sin
embargo, se combina a menudo con un esquema de prioridades para obtener un planificador
efectivo. Así pues, el planificador puede mantener un conjunto de colas, una para cada nivel de
prioridad y expedir cada cola con un algoritmo primero en llegar/primero en servirse.
Cuando se tiene que elegir a qué proceso asignar la CPU se escoge al que llevara más tiempo
listo. El proceso se mantiene en la CPU hasta que se bloquea voluntariamente.
La ventaja de este algoritmo es su fácil implementación, sin embargo, no es válido para
entornos interactivos ya que un proceso de mucho cálculo de CPU hace aumentar el tiempo de
espera de los demás procesos. Para implementar el algoritmo (ver figura 2) sólo se necesita
mantener una cola con los procesos listos ordenada por tiempo de llegada. Cuando un proceso
pasa de bloqueado a listo se sitúa el último de la cola.
En a) el proceso P7 ocupa la CPU, los procesos P2, P4 y P8 se mantienen en la lista de
preparados. En b) P7 se bloquea (ya sea al realizar una E/S, una operación wait (espera) sobre
un semáforo a cero u otra causa) y P2 pasa a ocupar la CPU. En c) ocurre un evento
(finalización de la operación de E/S, operación signal, ...) que desbloquea a P7, esto lo vuelve
listo, pasando al final de la cola de procesos listos.
Algunas de las características de este algoritmo es que es no apropiativo y justo en el sentido
formal, aunque injusto en el sentido de que: los trabajos largos hacen esperar a los cortos y los
trabajos sin importancia hacen esperar a los importantes. Por otro lado es predecible pero no
garantiza buenos tiempos de respuesta y por ello se emplea como esquema secundario.
FCFS rinde mucho mejor con procesos largos que con procesos cortos. Sin embargo, las
prestaciones del FCFS son, con frecuencia, bastante pobres.
5
Seminario “Diseño y construcción de microrrobots”
Marzo 2006
Planificador de monoprocesadores
Los problemas que presenta son:
¾ El tiempo medio de espera suele ser elevado.
¾ Bajo nivel de utilización de la CPU.
¾ Pobre tiempo de respuesta en procesos cortos en esquemas con mucha carga.
¾ Tiende a favorecer a los procesos con carga de CPU frente a los que tienen carga de
E/S.
¾ Uso ineficiente de los dispositivos de E/S.
2.- Round Robin (Turno rotatorio)
Se establece un tiempo máximo de ejecución o cuanto y se ejecuta cada proceso hasta que
exceda su cuanto o no quiera ejecutarse más, entonces se asigna otro y así sucesivamente. Los
procesos en espera de ejecución forman una cola circular.
Este algoritmo, no apropiativo de planificación round-robin, fue especialmente diseñado para
sistemas en tiempo compartido. Se define una pequeña unidad de tiempo común llamada
quantum de tiempo o time slice, que generalmente tiene un valor entre 10 y 100 milisegundos.
La cola de listos se trata como una cola circular. El planificador de CPU recorre la cola
asignando el procesador a cada proceso durante un intervalo de tiempo de hasta un quantum.
Este es uno de los algoritmos más antiguos, sencillos y equitativos en el reparto de la CPU entre
los procesos, muy válido para entornos de tiempo compartido. Si el proceso agota su cuantum
de tiempo, se elige a otro proceso para ocupar la CPU. Si el proceso se bloquea o termina antes
de agotar su cuantum también se alterna el uso de la CPU. El round robin es muy fácil de
implementar. Todo lo que necesita el planificador es mantener una lista de los procesos listos.
Este algoritmo presupone la existencia de un reloj en el sistema. Un reloj es un dispositivo
que genera periódicamente interrupciones. Esto es muy importante, pues garantiza que el
sistema operativo (en concreto la rutina de servicio de interrupción del reloj) coge el mando de
la CPU periódicamente. El cuantum de un proceso equivale a un número fijo de pulsos o ciclos
de reloj. Al ocurrir una interrupción de reloj que coincide con la agotación del cuantum se llama
al dispatcher.
Para implementar la planificación RR, la cola se mantiene como una cola de procesos FIFO.
El planificador de la CPU selecciona el primer proceso de la cola, y únicamente puede salir del
estado de ejecución por tres motivos: que termine su ejecución, se proceda a la llamada de una
E/S y el proceso se quede bloqueado o que se genere una interrupción por haber superado un
quantum de ejecución del proceso.
Si hay n procesos en la cola y el quantum de tiempo es q, entonces cada proceso obtiene 1/n
del tiempo de CPU en fragmentos de al menos q unidades de tiempo cada vez. Cada proceso
tiene que esperar no más de (n-1) x q unidades de tiempo hasta su quantum de tiempo siguiente.
El conflicto surge en el momento de decidir la duración del quantum de tiempo para cada
proceso. Si el quantum es muy pequeño, produce mucho overhead por la gran cantidad de
cambios de contexto de ejecución que hace el sistema operativo. Si por el contrario, el quantum
es muy grande produce un tiempo de reacción muy pobre porque los procesos en cola de listos
esperan demasiado y si es infinito se convierte en FCFS. Es decir que para que sea eficiente, la
duración del contexto switch debe ser mucho menor que el time slice.
6
Seminario “Diseño y construcción de microrrobots”
Marzo 2006
Planificador de monoprocesadores
Una desventaja del turno rotatorio es el tratamiento que hace si existe una mezcla de
procesos limitados por CPU y procesos limitados por E/S. Los procesos con carga de
procesador tienden a recibir una porción desigual de tiempo de procesador, lo que origina un
rendimiento pobre de los procesos con carga de E/S, un mal aprovechamiento de los
dispositivos de E/S y un incremento de la variabilidad del tiempo de respuesta.
3.- Highest Response Ratio Next (El de mayor tasa de respuesta el siguiente)
Brinch Hansen desarrolló la estrategia de prioridad a la tasa de respuesta más alta (HRN,
highest-response-ratio-next) que corrige algunas deficiencias de SJF, particularmente el retraso
excesivo de trabajos largos y el favoritismo excesivo para los trabajos cortos. HRN es un
disciplina de planificación no apropiativa en la cual la prioridad de cada proceso no sólo se
calcula en función del tiempo de servicio, sino también del tiempo que ha esperado para ser
atendido. Cuando un trabajo obtiene el procesador, se ejecuta hasta terminar. Las prioridades
dinámicas en HRN se calculan de acuerdo con la siguiente expresión:
Prioridad = (tiempo de espera + tiempo de servicio) / tiempo de servicio
Como el tiempo de servicio aparece en el denominador, los procesos cortos tendrán
preferencia. Pero como el tiempo de espera aparece en el numerador, los procesos largos que
han esperado también tendrán un trato favorable. Obsérvese que la suma tiempo de espera +
tiempo de servicio es el tiempo de respuesta del sistema para el proceso si éste se inicia de
inmediato.
Para cada proceso, basado en el tiempo que va a ocupar el procesador(s) y el tiempo que
lleva esperando para ocuparlo (w), Se calcula w+s/s, una vez echo esto el proceso que tenga un
valor mayor será asignado al procesador. Este algoritmo es bastante bueno, por que además de
dar preferencia a los procesos cortos también tiene en cuenta el envejecimiento de los procesos
para evitar así la "inanición". Cuando el proceso actual termina o se bloquea, se elige el proceso
listo con un mayor valor de R. Donde R es:
R = (w + s) / s
R = tasa de respuesta.
w = tiempo consumido esperando al procesador.
s = tiempo de servicio esperado.
La decisión de planificación se basa en una estimación del tiempo de retorno normalizado.
Lo que se intenta es reducir al máximo las proporciones de tiempo R.
Este método es atractivo porque tiene en cuenta la edad del proceso. Aunque se favorece a
los trabajos más cortos (un denominador menor produce una razón mayor), el envejecimiento de
un proceso sin que haya sido servido incrementa el valor de la razón, de forma que los procesos
más largos puedan pasar, en competición con los más cortos. El tiempo esperado de servicio
debe estimarse antes de emplear la técnica de la mayor tasa de respuesta.
7
Seminario “Diseño y construcción de microrrobots”
Marzo 2006
Planificador de monoprocesadores
4.- Shortest Process Next (El proceso más corto el próximo)
Este algoritmo consiste en seleccionar el proceso con menor tiempo esperado de ejecución.
La mejora del rendimiento global es significativa en términos de tiempo de respuesta, sin
embargo, se incrementa la variabilidad de los tiempos de respuesta, especialmente para procesos
largos, reduciendo así la previsibilidad.
Una dificultad que plantea SPN es la necesidad de conocer o estimar el tiempo exigido por
cada proceso. Para ello, generalmente se toma el promedio exponencial que permite predecir
valores futuros a partir de una serie de valores pasados.
Sn+1 = α Tn + (1 - α )Sn
Donde:
Ti = Tiempo de ejecución en el procesador para el i-ésimo caso del proceso (tiempo total de
ejecución para un trabajo por lotes; tiempo de ráfaga de procesador para trabajos interactivos).
Si = Valor pronosticado para el caso i-ésimo.
α = Factor constante de ponderación. (0 <= α <= 1) (generalmente se utiliza 0,5)
α determina el peso relativo dado a las observaciones más y menos recientes. Utilizando un
valor constante de α , independiente del número de observaciones pasadas, se llega a una
situación en la que se tienen en cuenta todos los valores pasados, pero los más distantes reciben
un peso menor. Para verlo con más claridad, consideremos el siguiente desarrollo de la ecuación
anterior:
Sn+1 = α Tn + (1 - α ) α Tn-1 + … + (1 - α )1α Tn-i + ... + (1 - α )nS1
S1 = Valor pronosticado para el primer caso; no calculado.
La ventaja de emplear un valor α cercano a 1 es que la media reflejará rápidamente los
cambios repentinos en la cantidad observada. La desventaja es que si se produce un breve
aumento en los valores observados y después se vuelve a estabilizar en algún valor medio, el
empleo de un valor grande a α generará cambios bruscos en la media.
Un riesgo que existe en SPN es la posibilidad de inanición para los procesos largos mientras
exista un flujo continuo de procesos más cortos. Por otro lado no es conveniente para entornos
de tiempo compartido o de procesamiento de transacciones, debido a que es un algoritmo
apropiativo.
Otra observación importante es que se emplea una gran pérdida de tiempo para efectuar este
cálculo por lo que no se utiliza este algoritmo.
La ventaja que presenta este algoritmo sobre el algoritmo FIFO es que minimiza el tiempo de
finalización promedio, como puede verse en el siguiente ejemplo:
Ej: Supongamos que en un momento dado existen tres ráfagas listos R1, R2 y R3, sus
tiempos de ejecución respectivos son 24, 3 y 3 ms. El proceso al que pertenece la ráfaga R1 es
8
Seminario “Diseño y construcción de microrrobots”
Marzo 2006
Planificador de monoprocesadores
la que lleva más tiempo ejecutable, seguido del proceso al que pertenece R2 y del de R3.
Veamos el tiempo medio de finalización (F) de las ráfagas aplicando FIFO y SJF:
FIFO F = (24 + 27 + 30) / 3 = 27 ms.
SJF F = (3 + 6 + 30) / 3 = 13 ms.
Se puede demostrar que este algoritmo es el óptimo. Para ello, consideremos el caso de
cuatro ráfagas, con tiempos de ejecución de a, b, c y d. La primera ráfaga termina en el tiempo
a, la segunda termina en el tiempo a+b, etc. El tiempo promedio de finalización es
(4a+3b+2c+d)/4. Es evidente que a contribuye más al promedio que los demás tiempos, por lo
que debe ser la ráfaga más corta, b la siguiente, y así sucesivamente. El mismo razonamiento se
aplica a un número arbitrario de ráfagas.
No obstante, este algoritmo sólo es óptimo cuando se tienen simultáneamente todas las
ráfagas. Como contraejemplo, considérense cinco ráfagas desde A hasta E, con tiempo se
ejecución de 2, 4, 1, 1 y 1 respectivamente. Sus tiempos de llegada son 0, 0, 3, 3 y 3. Primero se
dispone de A y B, puesto que las demás ráfagas no han llegado aún. Con el algoritmo SJF las
ejecutaríamos en orden A, B, C, D, y E con un tiempo de finalización promedio de 4.6. Sin
embargo, al ejecutarlas en orden B, C, D, E y A se tiene un promedio de finalización de 4.4.
5.- Shortest Remaining Time (El tiempo restante mas corto)
Este algoritmo es la versión no apropiativa o espulsiva del algoritmo Shortest Process Next
(SPN) o también llamado Shortest Job First (SJF).
Con el algoritmo SPN, el planificador elige el proceso más breve, es decir, el de menor
tiempo de ejecución de los que están preparados. Este proceso permanecerá asignado hasta que
éste termine, momento en el cuál se volverá a elegir el proceso más corto. Como el planificador
realiza una estimación del tiempo de proceso, para así poder llevar a cabo la función de
selección, existe el riesgo de inanición para los procesos largos.
En el algoritmo Shortest Remaining Time el planificador selecciona el proceso más corto, al
igual que antes, pero en este caso el cambio se controla cada vez que un proceso llega a la cola.
Es decir, cuando un proceso se desbloquea o se crea uno nuevo y el tiempo de ráfaga es menor
que el tiempo de ráfaga del proceso que se está ejecutando, entonces se realiza un cambio de
contexto, el bloqueado se ejecuta y el que se estaba ejecutando pasa a la cola de procesos listos.
De este modo cuando se desbloquea o entra un proceso nuevo, se calcula su tiempo de ráfaga. Si
el proceso que se está ejecutando le queda más tiempo de ráfaga que nuestro tiempo de ráfaga
calculado entonces se procede a realizar el cambio de contexto.
Este algoritmo es más eficiente debido a que no se produce overhead muy frecuente ya que
las interrupciones no son producidas por el reloj del sistema. Aunque por otro lado se deben de
tener en cuenta los tiempos de servicio transcurridos, lo cual contribuye a la sobrecarga.
El SRT produce tiempos de retorno mejores que los del SPN, ya que los procesos cortos
reciben atención inmediata y preferente frente a los procesos largos.
En la figura podemos observar el funcionamiento del algoritmo SRT en el que se penalizan
las ráfagas largas.
9
Seminario “Diseño y construcción de microrrobots”
Marzo 2006
Planificador de monoprocesadores
¾ Ventajas:
o Se ejecutan primero los procesos con ráfagas de CPU más cortas.
o Se minimiza el tiempo de espera medio.
o No hay tanto riesgo de overhead.
¾ Desventajas:
o Existe riesgo de inanición para los procesos con tiempos de CPU más largos.
o Los tiempos de servicio aumentan la sobrecarga.
10
Seminario “Diseño y construcción de microrrobots”
Marzo 2006
Planificador de monoprocesadores
A modo de conclusión diremos que el algoritmo SRT es la versión no apropiativa o
expulsiva del algoritmo SPN o SJF, en el que el proceso que hay en CPU es desalojado si llega
a la cola un proceso con una duración más corta.
3 Conclusiones:
El propósito de este trabajo es conocer el funcionamiento de los principales algoritmos de
planificación de procesos. Del mismo modo, aprender a utilizar herramientas visuales las cuales
nos permiten una mejor percepción y comprensión de los mismos.
Contrastando la información teórica que poseíamos acerca del funcionamiento de cada uno
de los algoritmos con nuestra herramienta visual, hemos conseguido a base de comparar y
comprobar resultados, entender y comprender el correcto funcionamiento de dichos algoritmos,
todo gracias a la utilización de la herramienta VisualOS.
4 Bibliografía:
ƒ
Escuela Universitaria de Informática (Segovia)
Planificación de procesos.
ƒ
Universidad Carlos III (Madrid) – Departamento de Telemática.
Planificación de procesos. Autor: Abelardo Pardo.
ƒ
Universidad Rey Juan Carlos – Ing. Técn. de Informática de Gestión y de Sistemas.
Sistemas Operativos – Planificación de procesos.
11
Descargar