PROCESOS
Definición de Proceso
•El principal concepto en cualquier sistema operativo es el de proceso.
•Un proceso es un programa en ejecución, incluyendo el valor del program counter, los
registros y las variables.
•Conceptualmente, cada proceso tiene un hilo (thread) de ejecución que es visto como un
CPU virtual.
•El recurso procesador es alternado entre los diferentes procesos que existan en el
sistema, dando la idea de que ejecutan en paralelo (multiprogramación)
Contador de programa
Cada proceso tiene su program counter, y avanza cuando el proceso tiene asignado el
recurso procesador. A su vez, a cada proceso se le asigna un número que lo identifica entre
los demás: identificador de proceso (process id)
Memoria de los procesos
Un proceso en memoria se constituye de varias secciones:
• Código (text): Instrucciones del proceso. • Datos (data): Variables globales del proceso.
• Memoria dinámica (heap): Memoria dinámica que genera el proceso.
• Pila (stack): Utilizado para preservar el estado en la invocación anidada de procedimientos
y funciones.
Estados de los procesos
El estado de un proceso es definido por la actividad corriente en que se encuentra. Los
estados de un proceso son:
• Nuevo (new): Cuando el proceso es creado.
• Ejecutando (running): El proceso tiene asignado un procesador y está ejecutando sus
instrucciones.
• Bloqueado (waiting): El proceso está esperando por un evento (que se complete un pedido
de E/S o una señal).
• Listo (ready): El proceso está listo para ejecutar, solo necesita del recurso procesador.
• Finalizado (terminated): El proceso finalizó su ejecución.
• Diagrama de estados y transiciones de los procesos.(ver capítulo 3)
Transiciones entre estados
Nuevo ⇒ Listo – Al crearse un proceso pasa inmediatamente al estado listo. Listo ⇒
Ejecutando – En el estado de listo, el proceso solo espera para que se le asigne un
procesador para ejecutar (tener en cuenta que puede existir más de un procesador en el
sistema). Al liberarse un procesador el planificador (scheduler) selecciona el próximo
proceso, según algún criterio definido, a ejecutar. Ejecutando ⇒ Listo – Ante una
interrupción que se genere, el proceso puede perder el recurso procesador y pasar al
estado de listo. El planificador será el encargado de seleccionar el próximo proceso a
ejecutar.
Ejecutando ⇒ Bloqueado – A medida que el proceso ejecuta instrucciones realiza pedidos
en distintos componentes (ej.: genera un pedido de E/S). Teniendo en cuenta que el pedido
puede demorar y, además, si está en un sistema multiprogramado, el proceso es puesto en
una cola de espera hasta que se complete su pedido. De esta forma, se logra utilizar en
forma más eficiente el procesador. Bloqueado ⇒ Listo – Una vez que ocurre el evento que
el proceso estaba esperando en la cola de espera, el proceso es puesto nuevamente en la
cola de procesos listos. Ejecutando ⇒ Terminado – Cuando el proceso ejecuta sus última
instrucción pasa al estado terminado. El sistema libera las estructuras que representan al
proceso.
Bloque descriptor de proceso
El proceso es representado, a nivel del sistema operativo, a través del bloque descriptor de
proceso (Process Control Block) (ver imagen capitulo 3)
Todo proceso se describe mediante su estado, nombre, recursos asignados, información
contable, etc. Para ello se utiliza una estructura de datos que será el operando de las
operaciones sobre procesos, recursos y del planificador (scheduler). Los campos de esta
estructura son: Estado CPU: El contenido de esta estructura estará indefinido toda vez que
el proceso está en estado ejecutando (puesto que estará almacenado en la CPU indicada
por procesador). Registro de flags. Procesador: [1..#CPU]: Contendrá el número de CPU
que está ejecutando al proceso (si está en estado ejecutando), sino su valor es indefinido.
Memoria: Describe el espacio virtual y/o real de direccionamiento según la arquitectura del
sistema. Contendrá las reglas de protección de memoria así como cual es compartida, etc.
Estado del proceso: ejecutando, listo, bloqueado, etc. Recursos: Recursos de software
(archivos, semáforos, etc.) y hardware (dispositivos, etc.). Planificación: Tipo de planificador.
Prioridad: Podrá incluir una prioridad externa de largo aliento, o en su defecto una prioridad
interna dinámica de alcance reducido. Contabilización: Información contable como ser
cantidad de E/S, fallos de páginas (page faults), consumo de procesador, memoria utilizada,
etc. Ancestro: Indica quién creó este proceso. Descendientes: Lista de punteros a PCBs de
los hijos de este proceso
Los procesos de un sistema son creados a partir de otro proceso. Al creador se le denomina
padre y al nuevo proceso hijo. Esto genera una jerarquía de procesos en el sistema. En el
diseño del sistema operativo se debe decidir, en el momento de creación de un nuevo
proceso, cuales recursos compartirán el proceso padre e hijo. Las opciones son que
compartan todo, algo o nada. También se debe determinar que sucede con los hijos cuando
muere el padre. Pueden morir también o cambiar de padre. Una vez creado el nuevo
proceso tendrán un hilo (program counter) de ejecución propio. El sistema genera un nuevo
PCB para el proceso creado.
Creación de procesos
Ej.: UNIX – UNIX provee el system call fork para la creación de un nuevo proceso. – La
invocación a esta función le retorna al padre el número de process id del hijo recién creado
y al hijo el valor 0. El hijo comienza su ejecución en el retorno del fork. – Además, se provee
del system call exec que reemplaza el espacio de memoria del proceso por uno nuevo
El proceso creador se denomina proceso padre y los nuevos procesos son los hijos de
dicho proceso. Cada uno de estos procesos nuevos puede a su vez crear otros procesos,
dando lugar a un árbol de procesos. La mayoría de los sistemas operativos (incluyendo
UNIX y la familia Windows de sistemas operativos) identifican los procesos mediante un
identificador de proceso unívoco o pid (process identifier), que normalmente es un número
entero. La siguiente figura ilustra un árbol de procesos típico en el sistema operativo Solaris,
indicando el nombre de cada proceso y su pid. En Solaris, el proceso situado en la parte
superior del árbol es el proceso sched, con el pid 0. El proceso scheú crea varios procesos
hijo, incluyendo pageouc y f sf lush. Estos procesos son responsables de la gestión de
memoria y de los sistemas de archivos. El proceso sched también crea el proceso [Link], que
sirve como proceso padre raíz para todos los procesos de usuario(ver imagen capitulo3)
Terminación de procesos
Un proceso termina cuando ejecuta su última instrucción y pide al sistema operativo que lo
elimine usando la llamada al sistema exit (). En este momento, el proceso puede devolver
un valor de estado (normalmente, un entero) a su proceso padre (a través de la llamada al
sistema v;ait ()). El sistema operativo libera la asignación de todos los recursos del proceso,
incluyendo las memorias física v virtual, los archivos abiertos y los búferes de E/S.
Terminación de procesos La terminación puede producirse también en otras circunstancias.
Un proceso puede causar la terminación de otro proceso a través de la adecuada llamada al
sistema (por ejemplo, TerminateProcess í ) en Win32). Normalmente, dicha llamada al
sistema sólo puede ser invocada por el padre del proceso que se va a terminar. En caso
contrario, los usuarios podrían terminar arbitrariamente los trabajos de otros usuarios
Un padre puede terminar la ejecución de uno de sus hijos por diversas razones, como por
ejemplo, las siguientes:
Terminación de procesos
• El proceso hijo ha excedido el uso de algunos de los recursos que se le han asignado.
Para determinar si tal cosa ha ocurrido, el padre debe disponer de un mecanismo para
inspeccionar el estado de sus hijos.
• La tarea asignada al proceso hijo ya no es necesaria.
• El padre abandona el sistema, y el sistema operativo no permite que un proceso hijo
continúe si su padre ya ha terminado
Comunicación interprocesos
Los procesos que se ejecutan concurrentemente pueden ser procesos independientes o
procesos cooperativos. Un proceso es independiente si no puede afectar o verse afectado
por los restantes procesos que se ejecutan en el sistema. Cualquier proceso que no
comparte datos con ningún otro proceso es un proceso independiente. Un proceso es
cooperativo si puede afectar o verse afectado por los demás procesos que se ejecutan en el
sistema. Evidentemente, cualquier proceso que comparte datos con otros procesos es un
proceso cooperativo.
Hay varias razones para proporcionar un entorno que permita la cooperación entre
procesos:
• Compartir información. Dado que varios usuarios pueden estar interesados en la misma
información (por ejemplo, un archivo compartido), debemos proporcionar un entorno que
permita el acceso concurrente a dicha información.
• Acelerar los cálculos. Si deseamos que una determinada tarea se ejecute rápidamente,
debemos dividirla en subtareas, ejecutándose cada una de ellas en paralelo con las demás.
Observe que tal aceleración sólo se puede conseguir si la computadora tiene múltiples
elementos de procesamiento, como por ejemplos varias CPU o varios canales de E/S.
• Modularidad. Podemos querer construir el sistema de forma modular, dividiendo las
funciones del sistema en diferentes procesos o hebras
. • Conveniencia. Incluso un solo usuario puede querer trabajar en muchas tareas al mismo
tiempo. Por ejemplo, un usuario pued1 estar editando, imprimiendo y compilando en
paralelo
Comunicación interprocesos
La cooperación entre procesos requiere mecanismos de comunicación interprocesos (IPC,
interprocess communication) que les permitan intercambiar datos e información. Existen dos
modelos fundamentales de comunicación interprocesos: (1) memoria compartida y (2) paso
de mensajes. En el modelo de memoria compartida, se establece una región de la memoria
para que sea compartida por los procesos cooperativos. De este modo, los procesos
pueden intercambiar información leyendo y escribiendo datos en la zona compartida. En el
modelo de paso de mensajes, la comunicación tiene lugar mediante el intercambio de
mensajes entre los procesos cooperativos.
Los dos modelos que acabamos de presentar son bastante comunes en los distintos
sistemas operativos y muchos sistemas implementan ambos. El paso de mensajes resulta
útil para intercambiar pequeñas cantidades de datos, ya que no existe la necesidad de
evitar conflictos. El paso de mensajes también es más fácil de implementar que el modelo
de memoria compartida como mecanismo de comunicación entre computadoras.
Comunicación interprocesos La memoria compartida es más rápida que el paso de
mensajes, ya que este último método se implementa normalmente usando llamadas al
sistema y, por tanto, requiere que intervenga el kernel, lo que consume más tiempo. Por el
contrario, en los sistemas de memoria compartida, las llamadas al sistema sólo son
necesarias para establecer las zonas de memoria compartida. Una vez establecida la
memoria compartida, todos los accesos se tratan como accesos a memoria rutinarios y no
se precisa la ayuda del kernel