Conceptos básicos sobre procesos.
Según Tanenbaum:
Un proceso es un programa en ejecución, la cual debe proceder de manera
secuencial. Un proceso además del código del programa, incluye la actividad
actual, representada por el valor del contador
de programa, y el valor de los registros de la CPU. Generalmente también
incluye al stack
del proceso, que contiene datos temporales, y una sección de datos que contiene
variables globales.
Un programa, es una entidad pasiva, como un archivo en disco, mientras
que un proceso es una entidad activa.
Aunque podría haber dos procesos asociados al mismo programa, de todas
maneras se consideran como dos secuencias de ejecución distintas.
De Wikipedia:
Un proceso es un concepto manejado por el sistema operativo que consiste en el conjunto formado por:
Esta definición varía ligeramente en el caso de sistemas operativos multihilo, donde un proceso consta de uno o más hilos, la memoria de trabajo (compartida por todos los hilos) y la información de planificación. Cada hilo consta de instrucciones y estado de ejecución.
Los procesos son creados y destruidos por el sistema operativo, así como también este se debe hacer cargo de la comunicación entre procesos, pero lo hace a petición de otros procesos. El mecanismo por el cual un proceso crea otro proceso se denomina bifurcación (fork). Los nuevos procesos pueden ser independientes y no compartir el espacio de memoria con el proceso que los ha creado o ser creados en el mismo espacio de memoria.
En los sistemas operativos multihilo es posible crear tanto hilos como procesos. La diferencia estriba en que un proceso solamente puede crear hilos para sí mismo y en que dichos hilos comparten toda la memoria reservada para el proceso.
El principal trabajo del procesador es ejecutar las instrucciones de máquina
que se encuentran en memoria principal. Estas instrucciones se
encuentran en forma de programas. Para que un programa pueda ser ejecutado, el
sistema operativo crea un nuevo proceso, y el procesador ejecuta una tras otra
las instrucciones del mismo. En un entorno de multiprogramación, el procesador intercalará la
ejecución de instrucciones de varios programas que se encuentran en memoria. El
sistema operativo es el responsable de determinar las pautas de intercalado y
asignación de recursos a cada proceso.
Se trata de la utilización de dos archivos, un objeto ejecutable y una
biblioteca del sistema, que después se colocan en la imagen del proceso dentro
de la memoria RAM y posteriormente también se dan de alta dentro de la tabla de
procesos, Bloque de control del proceso.
El modelo de estados más simple es el de dos estados. En este modelo, un
proceso puede estar ejecutándose o no. Cuando se crea un nuevo proceso, se pone
en estado de No ejecución. En algún momento el proceso que se está
ejecutando pasará al estado No ejecución y otro proceso se elegirá de la
lista de procesos listos para ejecutar para ponerlo en estado Ejecución.
De esta explicación se desprende que es necesario que el sistema operativo
pueda seguirle la pista a los procesos, conociendo su estado y el lugar que
ocupa en memoria. Además los procesos que no se están ejecutando deben
guardarse en algún tipo de cola mientras esperan su turno para ejecutar.
Diagrama de 5 estados
El modelo anterior de 2 estados funcionaría bien con una cola FIFO y planificación por turno rotatorio para los procesos que no están en ejecución, si los procesos estuvieran siempre listos para ejecutar. En la realidad, los procesos utilizan datos para operar con ellos, y puede suceder que no se encuentren listos, o que se deba esperar algún suceso antes de continuar, como una operación de Entrada/Salida. Es por esto que se necesita un estado donde los procesos permanezcan esperando la realización de la operación de Entrada Salida por parte del Sistema Operativo hasta que puedan proseguir. Se divide entonces al estado No ejecución en dos estados: Listo y Espera. Se agregan además un estado Nuevo y otro Terminado.
Los cinco estados de este diagrama son los siguientes según Osëliyo:
Los nuevos estados Nuevo y Terminado son útiles para la gestión de procesos. En este modelo los estados Espera y Listo tienen ambos colas de espera. Cuando un nuevo proceso es admitido por el sistema operativo, se sitúa en la cola de listos. A falta de un esquema de prioridades ésta puede ser una cola FIFO. Cuando se da un suceso se pasan a la cola de listos los procesos que esperaban por ese suceso.
Si existe un esquema con diferentes niveles de prioridad de procesos es conveniente mantener varias colas de procesos listos, una para cada nivel de prioridad, lo que ayuda a determinar cuál es el proceso que más conviene ejecutar a continuación.
Asimismo, existen varias colas en estado de espera, como mínimo una por cada periférico.
Una de las razones para implementar el estado Espera era poder hacer que
los procesos se puedan mantener esperando algún suceso, por ejemplo una
Entrada/Salida. Sin embargo, al ser mucho más lentas estas operaciones, puede
suceder que en nuestro modelo de cinco estados todos los procesos en memoria
estén esperando en el estado Espera y que no haya más memoria disponible
para nuevos procesos. Podría conseguirse más memoria, aunque es probable que
esto sólo permita procesos más grandes y no necesariamente nuevos procesos.
Además hay un costo asociado a la memoria y de cualquier forma es probable que
se llegaría al mismo estado con el tiempo. Otra
solución es el intercambio. El intercambio se lleva a cabo moviendo una
parte de un proceso o un proceso completo desde la memoria principal al disco,
quedando en el estado Suspendido. Después del intercambio, se puede
aceptar un nuevo proceso o traer a memoria un proceso suspendido anteriormente.
El problema que se presenta ahora es que puede ser que si se decide traer a
memoria un proceso que está en el estado Suspendido, el mismo todavía se
encuentre en espera. Sólo convendría traerlo cuando ya está listo para
ejecutar, esto implica que ya aconteció el suceso que estaba esperando. Para
tener esta diferenciación entre procesos suspendidos, ya sean listos como en
espera, se utilizan cuatro estados: Listo, Espera, Espera y
suspendido y Listo y suspendido.
Dos o más procesos pueden cooperar mediante señales de forma que uno obliga a detenerse a los otros hasta que reciban una señal para continuar.
La sincronización explícita entre procesos es un caso particular del estado "bloqueado". En este caso, el suceso que permite desbloquear un proceso no es una operación de entrada/salida, sino una señal generada a propósito por el programador desde otro proceso.