Cómo UNIX implementa el ciclo de vida de los procesos
1. UNIVERSIDAD TECNOLOGICA DE SANTIAGO
UTESA
Área de Arquitectura e Ingeniería
Carrera de Informática
Sistema Operativo I
“¿Cómo UNIX implemente el ciclo de los procesos?”
Presentado A:
Ing. Héctor Fernández
Presentado Por:
Cristian García 2-12-0819
Santiago Rep. Dom.
20 de Febrero del 2015
2. Procesos
Se le llama proceso en Unix a un programa en ejecución y al objeto abstracto
que crea el sistema operativo para manejar el acceso de ese programa a los
recursos delsistema (memoria, CPU, dispositivos deE/S). Pueden coexistir
varias instancias de un mismo programa ejecutando en forma simultánea.
Cada una de ellas es un proceso diferente.
Unix es un sistema multiproceso por tiempo compartido. A los ojos de un
usuario en un momento dado hay múltiples programas en ejecución, cada
uno de ellos avanzando en su tarea. Sin embargo en una máquina con un solo
procesador hay en cada instante solamente un proceso ejecutando. Es el
sistema operativo el que va rotando el uso del procesador a intervalos breves
(alguna decena de milisegundos) entre los procesos definidos en el sistema
de forma que secrea la ilusión que todos avanzan simultáneamente.
El administrador del sistema dispone de herramientas para supervisar el
estado de los procesos y eventualmente tomar acciones para suspender o
detener la ejecución de un proceso o simplemente modificar su
comportamiento.
Las implementaciones clásicas de Unix administran los procesos en un
esquema similar al de nSystem. La estrategia de scheduling de procesos es un
poco más elaborada pues implementa procesos con prioridades y al mismo
tiempo intenta dar un buen tiempo de respuesta a los usuarios interactivos,
algo que no es fácil de lograr debido a las restricciones que impone la
memoria del procesador.
Información almacenada por el kernel
Para cada proceso definido en el sistema, el kernel del sistema operativo
almacena y mantiene al día varios tipos de información sobreel proceso. Esta
información podemos ordenarla de la siguiente forma:
* Información general. Identificadores deproceso, usuario y grupo
* Ambiente (variables, directorio actual, etc.)
* Información deE/S
* Información deEstado
* Espacio de direcciones del proceso. Áreas de trabajo (código ("text"), datos,
stack).
3. Identificadores
ProcessID (PID)
Al crearseun nuevo proceso sele asigna un identificador de proceso único.
Este número debe utilizarse por el administrador para referirsea un proceso
dado al ejecutar un comando.
Los PID son asignados por el sistema a cada nuevo proceso en orden
creciente comenzando desdecero. Si antes de un reboot del sistema se llega
al nro. Máximo, se vuelve a comenzar desde cero, salteando los procesos que
aún estén activos.
ParentProcessID (PPID)
La creación de nuevos procesos en Unix serealiza por la vía de duplicar un
proceso existente invocando al comando fork(). Alproceso originalse le
llama "padre" y al nuevo proceso "hijo". ElPPID deun proceso es el PID desu
proceso padre.
El mecanismo de creación de nuevos procesos en Unix con el comando fork()
se ve con más detalle en el apartado "Ciclo de vida de un proceso".
UID y EUID
Normalmente estos dos identificadores coinciden pero hay excepciones.
El User ID (UID) delproceso identifica al creador del proceso, esto es a la
persona que lo lanzó a correr. Este usuario y root son los únicos que pueden
modificar al proceso. El UID seutiliza con fines de tarificación o accounting. El
sistema de accounting carga a la cuenta del usuario identificado por el UID
del proceso por los recursos del sistema que el proceso utilice (tiempo de
CPU, impresoras, terminales, etc.).
El Effective User ID (EUID) en cambio seutiliza para determinar si el proceso
tiene permiso para acceder a archivos y otros recursos delsistema.
La forma más habitual de hacer que el EUID de un proceso sea el de un
usuario diferente del que lanza a correr el programa es activando el flag
setuid en el archivo del programa. Un ejemplo de esto son los comandos que
permiten a un usuario modificar su password, en quese debe modificar el
archivo passwd o equivalente del sistema sobreel cual el usuario obviamente
4. no tiene permiso de escritura. Habitualmente ese comando es un archivo de
root con setuid y el proceso correcon EUID de root.
GID y EGID
Es totalmente análogo a los identificadores de usuario pero para grupos de
usuarios. El GID se hereda del proceso padre. El EGID puede utilizarse igual que
el EUID para controlar el acceso del proceso a archivos.
En la mayoría de los sabores actuales de Unix el proceso puede estar en varios
grupos y se chequea contra toda la lista de grupos para definir si el proceso puede
acceder o no a un recurso.
Información de ambiente
Directorio actual
El proceso mantiene actualizado cuál es su directorio de trabajo.
Variablesdeambienteglobales.
Son heredadas por los procesos hijos.
Variablesdeambientelocales.
Solamente existen en el proceso que las define.
Terminaldecontrol.
En general los procesos están asociados a una terminal de control. Esta
terminal determina el valor por defecto de los archivos stdin, stdouty stderr
del proceso.
Una excepción a esto son los procesos llamados daemons, queuna vez
lanzados sedesvinculan de su terminal de controly siguen ejecutando
inclusive después de cerrada la sesión de usuario desdela cual se lanzaron a
correr.
5. Espacio de direcciones virtual
En la mayoría de los sistemas multiproceso como Unix, cada proceso tiene la
ilusión de disponer para siel espacio de direcciones completo del
procesador. En realidad el procesador veun espacio de direcciones virtual.
Este espacio está organizado en secciones para el código (text), datos, stack y
otras y generalmente está dividido en páginas. En un instante dado una
página puede estar residiendo en la memoria físicadel procesador o puede
estar almacenada en disco en un procedimiento llamado "swapping". El
sistema operativo, con el auxilio del hardware, mantiene al día una tabla con
el estado de cada página de memoria del proceso.
Estado de un proceso
Los estados básicos en los que puede estar un proceso son los siguientes:
* Durmiendo (asleep). En generala 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.
6. Además de estos estados básicos un proceso puede estar detenido
(stopped). En este caso se le prohíbe ejecutar al proceso. Hay mecanismos
para detener y rearrancar un proceso a través de las señales STOP y CONT
que veremos más adelante.
El estado stopped es el estado en que queda un proceso lanzado a correr
desde un intérprete de comandos (Shell) cuando se presiona <Control-Z> o la
tecla configurada como "suspend" en el terminal que estemos utilizando.
Finalmente el otro estado en que a menudo un administrador encuentra a un
proceso es el estado zombie o exiting. Un proceso en este estado está en
proceso de terminación. Este caso se discute más en detalle en el apartado
"Ciclo de vida de un proceso".
Ciclo de vida de un proceso
El mecanismo de creació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 delnuevo proceso es el PID del proceso original
* Se reinicia la información de tarificación del proceso (uso deCPU, etc.)
Al retorno de fork() sesiguen ejecutando las siguientes sentencias del
programa en forma concurrente. Para distinguir entre los dos procesos la
función fork() devuelveun 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().
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 delas funciones
principales de init es lanzar mediante fork() intérpretes de comandos quea
su vez lanzarán los scripts de inicialización del sistema y los procesos delos
usuarios. Además deinit el kernel lanza algunos procesos más cuyo nombrey
función varía en los diferentes sabores deUnix. A excepción de estos
procesos lanzados por el kernel al inicio, todos los demás son descendientes
de init.
7. 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 padrecuando ejecute wait(). En esta
situación sedice que el proceso hijo está en el estado zombie. El kernel
devuelve todas las áreas de memoria solicitadas por el proceso pero debe
mantener alguna información sobreel 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 un nuevo reboot. Dado que un proceso zombieno consume recursos
fuera de su PID, esto por lo general no provoca problemas.