sábado, 13 de abril de 2013

2.3 PROCESOS CONCURRENTES EN UN ENTORNO DE RED






En UNIX, la unidad de concurrencia es el proceso y para especificar la ejecución concurrente se utilizan las sentencias \fork” y \join”, cuyo formato se verá más adelante.
Procesos
Un proceso, como ya se ha dicho anteriormente, es la ejecución de un programa secuencial. En UNIX, un proceso consiste en un conjunto de bytes que un procesador interpreta como código, datos o pila. Todas las operaciones que están relacionadas con los procesos están controladas por una porción del sistema operativo que se llama el núcleo.
El núcleo planifica la ejecución de los procesos de forma que parece que hay más de un proceso que se ejecuta al mismo tiempo, cada proceso puede ser la ejecución de un programa diferente o diferentes ejecuciones del mismo programa. Cada proceso ejecuta las instrucciones de su propio código y no puede acceder a las de otros procesos, aunque sean instancias del mismo programa; para comunicarse, los procesos tienen que utilizar llamadas al sistema.
Cada proceso se ejecuta dentro de su contexto. Cuando el núcleo decide que debe ejecutar otro proceso, realiza un cambio de contexto, de forma que el nuevo proceso se ejecutara dentro de su propio contexto. Cuando se realiza un cambio de contexto, el núcleo guarda toda la información necesaria para volver más tarde al estado del primer proceso y continuar a su ejecución.
Como ya se ha explicado en el capitulo anterior, durante la vida de un proceso, este pasa por diversos estados. La siguiente lista enumera los posibles estados de un proceso en el sistema UNIX:
1. El proceso se ejecuta en modo usuario.
2. El proceso se ejecuta en modo núcleo.
3. El proceso no se está ejecutando pero está listo para ejecutarse.
El proceso está dormido en memoria principal.
5. El proceso está listo para ser ejecutado, pero el proceso 0 debe llevarlo a memoria principal antes que el núcleo pueda preparar su ejecución.
Para ejecutar una llamada \fork”, el núcleo realiza la secuencia de operaciones que  se especifica a continuación:
1. Asigna una posición de la tabla de procesos al nuevo proceso.
2. Asigna un identificador (PID) al proceso hijo, este PID es único para cada proceso.
3. Hace una copia \lógica” del contexto del proceso padre para el proceso hijo.
4. Incrementa el contador de ¯cheros y la tabla de descriptores para los ficheros asociados al proceso.
5. Devuelve el número de PID del proceso hijo al padre y devuelve 0 al proceso hijo.
Terminación de procesos
El UNIX, todos los procesos para terminar ejecutan la llamada del sistema ext. Un proceso que ejecuta esta llamada pasa al estado zombie liberando todos sus recursos y solo mantiene su posición en la tabla de procesos. La sintaxis de la llamada \exit” es: exit (estado); El valor de \estado” se devuelve al proceso padre para que este pueda examinarlo ya que su valor puede servir al padre para saber cómo termino el hijo, el valor de \estado” indica de que manera termino el proceso, por convenio se considera que si un proceso termina correctamente el valor de \estado” es 0 y si su valor es distinto de 0 entonces el proceso termino de forma anómala. Un proceso puede realizar la llamada \exit” explícitamente o hacerlo implícitamente del programa. Por otra parte, el nucleo puede ejecutar internamente un \exit” en un proceso como respuesta a una señal de interrupción que no ha sido captada; en este caso, el valor de \estado” es el numero de la señal que causa la interrupción.
Sincronización de procesos
Un proceso puede sincronizar su ejecución con la terminación de un proceso hijo a través de la llamada del sistema wait. La sintaxis de la llamada es: pid = wait (dir_est); El valor de \pid” es el PID de un hijo \zombie”, de esta forma el proceso padre sabe cuál de sus hijos ha muerto y \dir est” contiene una dirección en la memoria del Usuario donde está almacenado el código \estado” de la llamada \exit” del hijo, para que el padre pueda saber la causa de la muerte de su hijo. Cuando se ejecuta un \wait”, el nucleo busca un hijo \zombie” del proceso; si no hay hijos, devuelve un error; si por el contrario encuentra un hijo \zombie”, saca su PID y el parámetro de la llamada \exit” del hijo y los devuelve como resultado de la llamada. Si elproceso que ejecuta la llamada \wait” tiene hijos pero ninguno de estos es \zombie”, el proceso queda dormido hasta que le llega una señal indicando que ha muerto un hijo.

No hay comentarios:

Publicar un comentario