Fundamentos de
Sistemas Operativos
Clase 4: “Procesos. Planificación de la
CPU.
Introducción
El PCB. Ciclos de vida y estados de un
proceso
Planificación de procesos: Planificadores y
despachador
Objetivos de la planificación de la CPU
Operaciones sobre procesos.
Comunicación entre procesos.
Introducción
• Cuando se habla de programa se está haciendo referencia
a un algoritmo (o un sistema de algoritmos) que está
codificado en algún lenguaje de programación, mientras
que cuando se habla de proceso se refiere a ese mismo
programa (ya quizás codificado en binario) cargado en
memoria y compitiendo o siendo propietario del procesador
(se dice que está en ejecución).
• Las primeras computadoras solo podían manipular un
proceso a la vez, el cual tenía control absoluto sobre todo
el sistema.
• El desarrollo vertiginoso del hardware hizo cambiar el
panorama y hoy en día es posible cargar varios programas
en memoria para que se ejecuten concurrentemente.
Introducción
• En los SO de la familia Windows se puede usar el
Administrador de Tareas para ver los procesos que se
están ejecutando y en los SO de la familia UNIX se puede
usar el comando ps –A.
• Se podrá observar que hay una buena cantidad de
procesos ejecutando, aún cuando el usuario de la
computadora no haya ordenado la ejecución de programa
alguno, el problema es que el propio SO, desde su
arranque, pone a ejecutar procesos propios para llevar a
cabo diversas tareas.
Introducción
• También cualquier usuario puede notar que en una
máquina con un solo procesador puede estar editando un
texto, imprimiendo un archivo, navegando por Internet,
oyendo música, etc., y esas acciones las están haciendo
varios procesos que de cierta forma comparten el tiempo
del único procesador que existe en el sistema de cómputo
sobre el que actúan.
• La situación anterior ha obligado a establecer un control
más estricto sobre los recursos ya que, al ser estos finitos y
tener que compartirse, surgen diferentes conflictos que
pueden entorpecer la idea de realizar más tareas en el
mismo tiempo físico.
El cómo se logra eso, es el objetivo de esta clase.
Proceso
“Es un programa en ejecución” que necesita
ciertos recursos los cuales pueden ser, entre otros:
tiempo de CPU, memoria, archivos abiertos,
equipos de entrada/salida, etc.
Los recursos se pueden asignar al proceso cuando
se crea (cuando nace) o en cualquier instante de la
ejecución de su código.
Proceso
La unidad de trabajo en la mayoría de los
sistemas operativos de tiempo compartido
actuales es el proceso, los cuales pueden ser del
SO o de los usuarios y pueden realizar sus taras
concurrentemente.
El SO es el responsable de la creación y
eliminación de los procesos, así como otras
actividades entre las que se destaca la de
planificarlos.
Proceso
En las primeras computadoras solo se podía tener un
programa en ejecución, el cual disponía de todos los
recursos del sistema.
Ese panorama ha cambiado drásticamente y ahora es
posible tener varios procesos que se ejecutan
concurrentemente en el tiempo e incluso a la vez de
forma real.
Un programa se convierte en proceso cuando el SO
carga el código de un archivo ejecutable en memoria,
en ese instante aún cuando no comience a ejecutarse
de forma inmediata (tendrá que esperar a que el SO le
asigne el procesador), el proceso cobra vida y se dice
que está en ejecución.
Proceso
El bloque de control de proceso
Cada proceso se representa dentro del SO por
una estructura de datos que se denomina Bloque
de Control de Programa (PCB, del inglés, Process
Control Block), la cual contiene información acerca
del proceso.
Esta estructura de datos debe controlar los
recursos del proceso, así como su estado.
El bloque de control de proceso
La multiprogramación permite que varios procesos
ejecuten “a la vez” aún en máquinas que poseen
un solo procesador.
La palabra a la vez está entrecomillada porque en
realidad el SO lo que hace es compartir el tiempo
del procesador y dar la idea (los procesadores
modernos son veloces) de que todo se hace al
mismo tiempo.
El bloque de control de proceso
Para poder hacer lo descrito anteriormente, el SO
debe interrumpir el proceso que se está
ejecutando y “marcar por donde iba” (tal y como se
hace cuando se está leyendo un libro y alguien
interrumpe).
La “marca”, en este caso, no puede ser física
(como en el libro cuando se pone un marcador) y
por eso los SO guardan, en el PCB, la información
de los procesos interrumpidos, de forma que
puedan reiniciarse cuando se les vuelva a asignar
el procesador.
El bloque de control de proceso
La información en el PCB puede variar de un
sistema operativo a otro pero, en términos
generales, deben estar presentes los campos que
se aprecian en la siguiente figura:
El bloque de control de proceso
El campo Estado, describe, con una palabra, lo
que está haciendo el proceso en ese instante
(esperando, ejecutando, bloqueado, etc.).
El campo Identificación es, usualmente, un
número que identifica al proceso unívocamente
dentro del sistema y se conoce, muchas veces
como PID (process identification por sus siglas en
inglés).
El bloque de control de proceso
El campo contador de programa (PC, program
counter) contiene el valor del registro contador de
programa del procesador (EIP para el caso de las
máquinas con procesadores Intel) para ese
proceso y permite determinar por dónde va la
ejecución del proceso (cuál instrucción se está
ejecutando en cada instante de tiempo).
El bloque de control de proceso
El campo Registros contiene los valores de todos
los registros del procesador para ese proceso. En
la figura ese campo se ha representado con más
espacio para dar esa idea.
Debe observarse que el registro contador de
programa podría estar en este campo (como un
registro mas) pero, debido a su importancia,
muchos SO lo sitúan en una posición especial
dentro del PCB.
El bloque de control de proceso
El campo Límites de memoria indican la parte de
memoria que tiene reservado el proceso y
dependerá del esquema de asignación de memoria
que use el SO. Este aspecto será tratado en otras
clases.
El campo Archivos abiertos puede ser un puntero
a una tabla que contiene la lista de los archivos
abiertos por el proceso. En dicha tabla se controlan
cosas tales como el lugar desde o hacia donde se
leerá o escribirá la próxima información, en qué
posición está la próxima lectura o escritura, etc. El
sistema de archivos se tratará en otras clases.
Ciclo de vida y estados de un proceso
Cuando muchos procesos están activos dentro de
un sistema multiprogramado (multitarea), se puede
afirmar que cada uno tiene su CPU virtual, lo que
significa que cada proceso tiene una copia de la
CPU. Esa copia se guarda en el Bloque de Control
de Proceso (PCB).
La idea básica para detener procesos e
intercambiar las tareas de forma que teniendo una
sola CPU parezca que se ejecutan varias tareas a
la vez, se basa en los dos aspectos siguientes:
Ciclo de vida y estados de un proceso
Cada vez que un proceso sea detenido, por
cualquier motivo (se le terminó el ciclo de CPU,
hizo una petición de E/S, etc.), se tomarán los
valores de la CPU para guardarlos en su PCB (la
CPU virtual de ese proceso).
Cada vez que un proceso vaya a entrar en estado
de ejecución, se toman los valores de su PCB (su
CPU virtual) y se carga la CPU real con esos
valores, con lo cual esta última queda tal y como
estaba cuando el proceso que se va ejecutar fue
interrumpido en el pasado.
Ciclo de vida y estados de un proceso
Ciclo de vida y estados de un proceso
En un sistema multiprogramado no se puede programar
haciendo suposiciones acerca de la velocidad de ejecución,
ya que no todos los procesos ejecutan sus cálculos a igual
velocidad e incluso, en el caso que se ejecuten varias
veces, en las diferentes ocasiones no tienen que
comportarse igual.
Ciclo de vida y estados de un proceso
La vida de un proceso pasa por diferentes estados (ver
figura) que describen, de cierta forma, la actividad que están
realizando en cada instante de tiempo. En general esos
estados pueden ser los siguientes (los nombres pueden
variar de un SO a otro):
Ciclo de vida y estados de un proceso
Nuevo (NEW). El estado ocurre cuando se crea el proceso,
es el momento en que ocurre la transición de programa a
proceso y debe crearse el PCB, asignarle memoria, etc.
Listo o Preparado (READY). Describe el estado de un
proceso que está listo para ejecutar y sólo espera a que le
asignen la CPU para poderlo hacer. Se puede llegar a este
estado por varias razones:
Un proceso (Nuevo) es admitido en el sistema y ya está listo para
ejecutar.
Un proceso terminó un evento externo a la CPU y necesita volver a
ejecutar.
Un proceso fue desalojado de la CPU (interrumpido) sin haber
terminado y por tanto necesita más tiempo y pasa a la cola de listos
esperando por su próximo turno.
Ciclo de vida y estados de un proceso
Cada vez que un proceso vaya a entrar en estado de
ejecución, se toman los valores de su PCB (su CPU virtual)
y se carga la CPU real con esos valores, con lo cual esta
última queda tal y como estaba cuando el proceso que se
va ejecutar fue interrumpido en el pasado o sea:
el valor adecuado del registro contador de programa,
para saber cuál es la próxima instrucción a ejecutar,
los valores de los registros asociados a las direcciones
de memoria del proceso, para saber en qué parte de la
memoria están sus instrucciones,
Los valores de los registros asociados a las tablas de
archivos abiertos para poder continuar leyendo o
escribiendo desde o hacia ellos, etc.
Ciclo de vida y estados de un proceso
Corriendo (RUNNING). Un proceso que tiene la CPU
asignada.
Bloqueado (BLOCKED) o Esperando (WAITING). En
espera de algún evento externo.
Terminado (TERMINATED) cuando el proceso terminó
completamente su trabajo.
Hilos o procesos ligeros
Los procesos, se conocen también por el nombre de
procesos pesados, la denominación de pesado viene dada
por el hecho de que ellos no comparten nada y la única
forma de comunicarse entre sí es a través del paso de
mensajes o por otras técnicas, tales como las tuberías, pero
no usando memoria común porque no la comparten.
El modelo de proceso posee una secuencia simple (un hilo)
de ejecución que solo permite hacer una tarea a la vez.
El modelo de hilo posee varias secuencias de control o
ejecución lo que permite que un solo proceso esté haciendo
varias tareas a la vez, esta facilidad es muy apreciada en los
sistemas de cómputo multinúcleos (multicore) para correr
varios hilos en paralelo. En este caso el PCB debe contener
también información de los hilos.
Hilos o procesos ligeros
Hilos o procesos ligeros
Hilos o procesos ligeros
Hilos o procesos ligeros
Hilos o procesos ligeros
Planificación de procesos
El SO planifica la ejecución de los procesos (ya sean ligeros
o pesados) y por eso se puede introducir una nueva
definición de proceso como “un proceso es un programa
en ejecución y una unidad de control, planificación y
despacho”.
El objetivo de la multiprogramación es tener varios
procesos ejecutando a la vez con el propósito de maximizar
el uso de la CPU, por otra parte el objetivo de los sistemas
de tiempo compartido (time sharing) es intercambiar la
CPU entre distintos procesos tan frecuentemente que los
usuarios perciban la idea de que todos los procesos están
ejecutándose a la vez.
Planificación de procesos
Con el fin de lograr estos objetivos el SO cuenta con un
componente denominado planificador de procesos, el cual
tiene la tarea de seleccionar (entre los procesos que están
en el estado Listo) el próximo proceso al que se le asignará
la CPU.
Obsérvese que en un sistema con un solo procesador, hay
en realidad solo un proceso ejecutando en cada instante de
tiempo.
Para lograr sus propósitos el SO debe mantener una o
varias colas de planificación.
Cuando los procesos entran al sistema, sus PCB se ponen
en una cola de trabajos que contiene todos los procesos
del sistema, los procesos que ya tienen todo lo necesario
para ejecutar se ponen en la cola de listos (ready queue).
Planificación de procesos
En general existen diversas colas dentro del sistema, por
ejemplo una por cada equipo de entrada salida. Observe la
figura, en las colas se encuentran los PCB que son los
representantes de los procesos que esperan por los
servicios del módulo correspondiente.
Planificación de procesos
La figura, presenta una idea, de conjunto, de algunas de las
colas y su interacción.
Tipos de planificadores
Dependiendo del SO, pueden existir varios planificadores, en
general se distinguen tres:
Planificador de período largo.
Planificador de período corto.
Planificador de período medio.
Tipos de planificadores
Planificador de periodo largo.
En los sistemas operativos de tratamiento por lotes (batch) es muy
frecuente que se escojan más trabajos para ser sometidos a
tratamiento que los que realmente pueden ejecutarse
inmediatamente. Esos trabajos se pasan a un equipo de
almacenamiento masivo (típicamente un disco) donde se mantienen
para su posterior ejecución.
La tarea del planificador de periodo largo es escoger trabajos desde
ese lugar y cargarlos a memoria para ponerlos como candidatos a
ejecutar.
El planificador de periodo largo (conocido también como planificador
de trabajos) se ejecuta con menor frecuencia que los demás
planificadores y es el responsable de mantener una buena mezcla de
trabajos lo que significa que se combinen procesos que usan mucho
la CPU (se denominan acotados a CPU) con procesos que hacen
muchas entradas salidas (conocidos como acotados a entrada salida
E/S).
Tipos de planificadores
El planificador de periodo corto.
Su tarea es escoger, de la cola de listos, cuál será el próximo
proceso a ejecutar para después comunicarle su decisión al
despachador.
Este planificador (conocido, además, como planificador de la CPU)
se ejecuta con mucha frecuencia y por eso su código debe ser
eficiente.
La transición de listo a corriendo que se puede observar en la figura
Transición de estados de un proceso, vista anteriormente, es
responsabilidad de este planificador. Nótese la relación planificador
(scheduler), despachador (dispatcher).
Tipos de planificadores
El planificador de periodo medio.
Algunos sistemas operativos, por ejemplo algunos de tiempo
compartido, adicionan este planificador que tiene la función de
disminuir el grado de multiprogramación cuando así lo entiende, para
lo cual extrae algún proceso de memoria y de su actividad con la
CPU para reincorpóralo más adelante cuando haya menos
sobrecarga.
También puede enviar al disco procesos bloqueados, para liberar
memoria principal de otros procesos. Esto es conocido como
intercambio o swapping.
Planificación de procesos
El despachador
El despachador, es otro componente del SO y tiene la
responsabilidad de darle el control de la CPU al proceso escogido
por el planificador de periodo corto (en algunos sistemas el
trabajo del despachador lo hace el mismo planificador de período
corto). Entre sus tareas se incluye:
el cambio de contexto:
guardar, en el PCB del proceso interrumpido, los valores de la
CPU y toda la información necesaria para poder seguir
ejecutándolo cuando le asignen de nuevo la CPU,
copiar, desde el PCB del proceso escogido para ejecutar, los
valores de la CPU y de las demás estructuras de datos
asociadas con el proceso,
cambiar el procesador a modo usuario,
saltar a la localización de la próxima instrucción a ejecutar por el
nuevo proceso.
El despachador. Cambio de contexto
El despachador. Cambio de contexto
Objetivos de la planificación
La planificación de la CPU es la tarea primordial en los
sistemas multiprogramados, los planificadores se encargan
de realizarla de manera que el procesador se comparta
entre los distintos procesos e hilos que se ejecutan en el
sistema.
Una vez que el planificador de periodo corto selecciona el
próximo proceso a ejecutar, el despachador (si existe, sino
lo hace el mismo planificador de periodo corto), se encarga
de cambiar (switch) de contexto.
El cambio de contexto consiste en cambiar la ocupación del
procesador: del proceso que está ejecutando al proceso
escogido para ejecutar durante el próximo ciclo de CPU.
Objetivos de la planificación
Existen diversos criterios que deben tomarse en cuenta para
comparar los algoritmos de planificación de la CPU, entre otros
se pueden citar:
Eficacia. Mantener la CPU utilizada el mayor tiempo posible.
Es prácticamente imposible lograr todos
Equidad. Garantizar que cada proceso obtenga un tiempo
esos objetivos en conjunto, de ahí que la
de CPU que se pueda considerar justo.
mayoría de las veces se asume una
Tiempo solución
de respuesta. Minimizar que
de compromiso el tiempo
toma en
en que
comienzan
cuentaa las
darprioridades
respuesta los procesos
de lo interactivos y el
que se desea
tiempo que deben esperar los usuarios de procesamientos
obtener.
por lote.
Rendimiento. Maximizar la cantidad de tareas procesadas
por unidad de tiempo.
Operaciones sobre los procesos
El SO de forma directa y los usuarios a través del SO pueden
realizar diversas operaciones sobre los procesos, entre ellas
se puede citar las siguientes:
Creación de proceso.
Un proceso, denominado padre, puede crear varios procesos
hijos, los cuales a su vez pueden tener otros hijos formando un
árbol de procesos.
Operaciones sobre los procesos
Cuando un proceso crea un hijo, existen dos posibilidades en
relación a la ejecución:
El padre continúa ejecutando concurrentemente con el hijo.
El padre espera a que el hijo termine.
También existen dos posibilidades con relación a la memoria:
El proceso hijo es un duplicado del padre porque tiene el
mismo código y los mismos datos que el padre
El proceso hijo carga un nuevo programa.
Operaciones sobre los procesos
Para crear procesos en los SO Windows se usa la llamada
al sistema CreateProcess() de Windows API.
El nuevo proceso creado necesita la carga de un programa
nuevo (no hereda el código del padre como lo hacen los
procesos creados con fork() en UNIX).
Operaciones sobre los procesos
Ejemplo de fork() y execlp()
Operaciones sobre los procesos
Terminación de procesos.
Un proceso termina cuando ejecuta su última sentencia y le
pide al SO que lo elimine para lo cual usa una llamada al
sistema, el SO le retira todos los recursos asignados. Un
proceso también puede terminar la ejecución de otro (si es
que se le permite). La terminación de procesos en UNIX se
hace usando la llamada al sistema exit(), mientras en
Windows es la llamada al sistema TerminateProcess().
Cuando un proceso termina, el SO libera los recursos que
adquirió durante su vida, sin embargo su entrada en la tabla
de procesos debe permanecer hasta que el padre llame a
wait() debido a esa tabla contiene el estado del proceso que
terminó.
Operaciones sobre los procesos
Ejemplo de wait()
Comunicación entre procesos
Los procesos que ejecutan en un SO pueden ser
independientes o cooperantes:
Un proceso es independiente si no afecta o no es afectado
por ningún otro proceso. Los procesos que no comparten
nada con otros procesos son independientes.
Un proceso es cooperante si afecta o es afectado por otro
proceso, queda claro que los procesos que comparten datos
con otros son cooperantes.
Comunicación entre procesos
Existen varias razones para facilitar un ambiente en el que los
procesos puedan cooperar:
Compartir información. Distintos usuarios pueden estar
interesados en la misma información y será necesario
proveer una forma de compartirla.
Aumento de la velocidad. Si se desea que una aplicación
ejecute más rápido, deberá dividirse en partes que se
ejecuten en paralelo (si existen varios núcleos), lo cual
ocasionará que las partes cooperen entre sí.
Modularidad. Cuando se hace un sistema debe procurarse
que el diseño sea modular, para lo cual debe dividirse en
partes que hacen funciones específicas que son llevadas a
cabo por procesos o hilos separados.
Comunicación entre procesos
Los procesos cooperantes necesitan algún mecanismo de
comunicación o IPC (Interprocess Communication Mechanism)
que le permita el intercambio de información, existen dos
modelos fundamentales:
Memoria compartida. Una región de memoria común que
usan varios procesos para escribir y leer datos. Es un
método rápido pero trae asociadas otras complejidades.
Paso de mensajes. Útil para intercambiar pequeños
volúmenes de información y fácil de implementar.
Estos mecanismos se muestran en la siguiente figura.
Comunicación entre procesos
Comunicación entre procesos: a) paso de mensajes, b) memoria
compartida.
Comunicación entre procesos
Sistemas de memoria compartida
Estos sistemas necesitan la comunicación entre procesos
para establecer, de forma precisa, la memoria común a
compartir (normalmente el SO no permite que un proceso
acceda a la memoria de otro), una vez establecido el
acuerdo entre los procesos, el SO no tiene participación del
problema.
Comunicación entre procesos
Sistemas de memoria compartida
Considérese un problema clásico conocido con el nombre
de “el problema del productor-consumidor” en el cual un
proceso, denominado productor, produce información que
es consumida por otro proceso, que se llama consumidor.
Una solución para tratar el problema anterior puede ser usar
un espacio de memoria común donde el productor pone la
información para que el consumidor la extraiga.
Comunicación entre procesos
Sistemas de memoria compartida
El productor puede estar produciendo mientras el
consumidor consume con el único cuidado de no estar
usando exactamente las mismas direcciones de la memoria
compartida, la cual se puede ver como un buffer.
Este buffer va a residir en una zona de la memoria que es
compartida por los procesos productor y consumidor.
El productor puede producir un artículo mientras el
consumidor está consumiendo otro artículo.
El productor y el consumidor necesitan estar sincronizados,
de manera que el consumidor no trate de consumir un
artículo que han no se ha producido.
Comunicación entre procesos
Sistemas de memoria compartida
Existen dos posibilidades con relación al buffer:
Que sea no acotado (prácticamente sin limitación de
espacio), en ese caso el productor nunca tendrá que
esperar (siempre hay donde poner lo que se produce),
pero el consumidor tendrá que esperar por nuevos
artículos.
Que sea acotado. En este caso, el consumidor tendrá
que esperar si el buffer está vació, y si todos los buffer
están llenos, el productor tendrá que esperar.
Comunicación entre procesos
Paso de mensajes
El paso de mensajes provee un mecanismo de
comunicación que es útil en ambientes distribuidos donde
los procesos que se comunican están en diferentes
computadoras conectadas por una red, por ejemplo los chat
de Internet deben proveer, al menos, dos operaciones:
send(message)
receive(message)
Los mensajes enviados pueden ser de tamaño fijo o de
tamaño variable.
Comunicación entre procesos
Nombramientos en pasos de mensajes
Los procesos que desean comunicarse deben referirse a los
otros de alguna forma. La comunicación puede ser directa o
indirecta.
En la comunicación directa, cada proceso que desee
comunicarse debe especificar el nombre de su contraparte:
send(P, message), enviar un mensaje al proceso P.
receive(Q, message), recibir un mensaje del proceso Q.
En este caso se establece un enlace, automáticamente,
entre los pares y cada uno sólo necesita conocer al otro.
Comunicación entre procesos
Nombramientos en pasos de mensajes
En la comunicación indirecta los mensajes se envían a un
buzón o puerto que se puede ver, abstractamente, como
un objeto dentro del cual se depositan o se extraen los
mensajes. Cada buzón tiene un identificador único y los
procesos solo necesitan compartir el buzón. La forma que
adoptan las primitivas de envío – recepción son:
send(A, message), enviar un mensaje al buzón A.
receive(A, message), recibir un mensaje del buzón A.
Comunicación entre procesos
Sincronización con pasos de mensajes
La comunicación entre dos procesos se hace a través de
las primitivas send() y receive() y existen diseños
diferentes para implementar esas primitivas.
El paso de mensajes puede ser con bloqueo (sincrónico) o
sin bloqueo (asincrónico).
Envío con bloqueo. En este caso el proceso que envía el
mensaje se bloquea hasta que el receptor lo reciba o hasta
que se deposite en el buzón.
Comunicación entre procesos
Sincronización con pasos de mensajes
Envío sin bloqueo. En esta situación el proceso envía el
mensaje y continua su operación
Recepción con bloqueo. Cuando el proceso receptor
solicita un mensaje, se bloquea para esperar su arribo.
Recepción sin bloqueo. El proceso receptor solicita un
mensaje y continúa haciendo su trabajo
Conclusiones
La multiprogramación es uno de los objetivos primordiales
de los sistemas operativos actuales, con el fin de lograrla
debe compartirse la CPU y para hacerlo se usa una
estructura de datos conocida como PCB que permite
guardar los valores de los diferentes componentes de los
procesos interrumpidos para después poder continuar por el
mismo lugar donde fueron detenidos (forzosamente o por
una necesidad externa a la CPU).
Conclusiones
El concepto de proceso como “programa en ejecución” debe
ampliarse para decir que es, además, “una unidad de
planificación y de despacho” ya que los planificadores
(periodo corto, largo y medio) deciden con cuál de ellos
interactúan, muy en particular, el planificador de periodo
corto decide cuál proceso (o hilo) será el elegido para entrar
a usar la CPU y le comunica su decisión al despachador que
se encargará de realizar el cambio de contexto para lo cual
usa el PCB.
Conclusiones
Los procesos necesitan comunicarse para lo cual usan dos
formas básicas: a través de una memoria compartida o a
través de paso de mensajes.
Bibliografía
Fundamentos de Sistemas Operativos, Abraham
Silberchatz, et. al. (7ma ed).
Capítulo 3. Procesos
epígrafes 3,1, 3.2, 3.3, 3.4 (excepto 3.5 y 3.6)
Sistemas Operativos. Aspectos internos y de
diseño. William Stalings (5ta ed).
Capítulo 3. (excepto 3.5).
Ver videos instructivos sobre Procesos del sistema
operativo en el tema 2.