Unix
Para cada proceso definido en el sistema, el kernel del sistema operativo almacena y mantiene al día varios tipos deinformación sobre el proceso. Esta información podemos ordenarla de la siguiente forma:
* Información general. Identificadores de proceso, usuario y grupo
* Ambiente (variables, directorio actual, etc.)
* Información de E/S
* Información de Estado
* Espacio de direcciones del proceso. Areas de trabajo (código ("text"), datos, stack).
Los estados básicos en los que puede estar un proceso son lossiguientes:
* Durmiendo (asleep). En general a la espera de algún recurso compartido.
* Listo para ejecutar (runnable). A la espera que le toque el turno en el uso de la CPU.
* Ejecutando (running). Puede estar ejecutando en modo kernel o en modo usuario.
A su vez el proceso (o partes del espacio de memoria virtual del proceso) puede estar cargado en memoria o "swapped" a disco.
El mecanismo decreación de un proceso en Unix es un poco peculiar. Un proceso se crea invocando a una función del sistema operativo llamada fork(). La función fork() crea una copia idéntica del proceso que la invoca con excepción de:
* El nuevo proceso tiene un PID diferente
* El PPID del nuevo proceso es el PID del proceso original
* Se reinicia la información de tarificación del proceso (uso de CPU, etc.)Al retorno de fork() se siguen ejecutando las siguientes sentencias del programa en forma concurrente. Para distinguir entre los dos procesos la función fork() devuelve un cero al proceso hijo y el PID del nuevo proceso al proceso padre. Normalmente el proceso hijo lanza luego un nuevo programa ejecutando alguna variante de comando exec(). En el recuadro puede verse un ejemplo del uso de fork.Si este es el mecanismo para crear un proceso, entonces ¿quién lanza a correr el primer proceso? Luego del boot del sistema el kernel instala y deja corriendo un proceso llamado init con PID=1. Una de las funciones principales de init es lanzar mediante fork() intérpretes de comandos que a su vez lanzarán los scripts de inicialización del sistema y los procesos de los usuarios. Además de init elkernel lanza algunos procesos más cuyo nombre y función varía en los diferentes sabores de Unix. A excepción de estos procesos lanzados por el kernel al inicio, todos los demás son descendientes de init.
Normalmente un proceso termina invocando a la función exit() pasando como parámetro un código de salida o exit code. El destinatario de ese código de salida es el proceso padre. El proceso padrepuede esperar la terminación de su proceso hijo invocando la función wait(). Esta función manda al padre a dormir hasta que el hijo ejecute su exit() y devuelve el exit code del proceso hijo.
Cuando el proceso hijo termina antes que el padre, el kernel debe conservar el valor del exit code para pasarlo al padre cuando ejecute wait(). En esta situación se dice que el proceso hijo está en el estadozombie. El kernel devuelve todas las áreas de memoria solicitadas por el proceso pero debe mantener alguna información sobre el proceso (al menos su PID y el exit code).
Cuando el proceso padre termina primero el kernel encarga a init la tarea de ejecutar el wait() necesario para terminar todo en forma ordenada. A menudo init falla en esta función y suelen quedar procesos en estado zombie hasta unnuevo reboot. Dado que un proceso zombie no consume recursos fuera de su PID, esto por lo general no provoca problemas.
Cuando hay más de un proceso en el estado "listo para ejecutar", el kernel le asigna el uso de la CPU al de mayor prioridad en ese momento. En el caso de Unix esta prioridad varía dinámicamente. Las diferentes versiones y sabores de Unix utilizan diferentes algoritmos de...
Regístrate para leer el documento completo.