12.10.2014 Views

TEMA 2. GESTIÓN DE PROCESOS - Universidad de Almería

TEMA 2. GESTIÓN DE PROCESOS - Universidad de Almería

TEMA 2. GESTIÓN DE PROCESOS - Universidad de Almería

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Diseño <strong>de</strong> Sistemas Operativos<br />

Tema <strong>2.</strong> Gestión <strong>de</strong> Procesos<br />

– Pasar al estado zombie. Si el proceso padre no está ejecutando una llamada wait, el proceso<br />

hijo se transforma en un proceso zombie <strong>de</strong>spués <strong>de</strong> realizar la llamada a exit. Un proceso<br />

zombie sólo ocupa una entrada en la tabla <strong>de</strong> procesos <strong>de</strong>l sistema y su contexto es<br />

<strong>de</strong>scargado <strong>de</strong> memoria principal.<br />

– Por último, el proceso, ya Zombie, ejecuta un cambio <strong>de</strong> contexto para que kernel pueda<br />

planificar a otro. Recuer<strong>de</strong> que si un programa no incluye exit en su código, la rutina <strong>de</strong><br />

arranque que el compilador C incluye a todos los programas la ejecutará cuando el proceso<br />

regrese <strong>de</strong>s<strong>de</strong> el main.<br />

algoritmo exit(status)<br />

{<br />

Ignorar todas las señales;<br />

if (proceso lí<strong>de</strong>r que tiene asociada la terminal)<br />

{<br />

Enviar señal SIGHUP (hangup) a todo el grupo (kill);<br />

Poner el i<strong>de</strong>ntificador <strong>de</strong> grupo <strong>de</strong> todos los miembros a 0<br />

}<br />

Cerrar todos los archivos abiertos (close);<br />

Liberar directorio actual o CurDir (iput) y directorio raíz o RootDir (iput);<br />

Liberar regiones y memoria asociada al proceso (freereg);<br />

Almacenar estadística y contabilidad (y el status <strong>de</strong>l exit) en la Tabla <strong>de</strong> Procesos:<br />

Marcar proceso en estado <strong>de</strong> Zombie.<br />

Cambiar el ID <strong>de</strong>l padre <strong>de</strong> sus procesos hijos a 1 (init los adopta);<br />

Si algún hijo está Zombie enviar SIGCHLD al proceso init;<br />

Enviar SIGCHLD al proceso padre;<br />

Hacer cambio <strong>de</strong> contexto;<br />

}<br />

<strong>2.</strong>7.<strong>2.</strong><strong>2.</strong> Espera para la Terminación <strong>de</strong> Procesos, wait.<br />

• La función wait suspen<strong>de</strong> la ejecución <strong>de</strong>l proceso padre que la llama hasta que alguno <strong>de</strong> sus<br />

procesos hijos termina (SIGCHLD).<br />

• Su función es la <strong>de</strong> sincronizar la ejecución <strong>de</strong>l proceso padre con la finalización <strong>de</strong> un proceso<br />

hijo.<br />

• En la llamada a esta función (pid_t wait(int *estado)), ésta <strong>de</strong>vuelve el PID <strong>de</strong> alguno <strong>de</strong> los<br />

procesos hijo zombies. El parámetro estado es la variable don<strong>de</strong> vamos a almacenar el valor que el<br />

proceso hijo le envía al proceso padre mediante la llamada exit y que da i<strong>de</strong>a <strong>de</strong> la condición <strong>de</strong><br />

finalización <strong>de</strong>l proceso hijo. Si queremos ignorar este valor, po<strong>de</strong>mos pasarse a wait un puntero<br />

NULL.<br />

• Si durante la llamada a wait se produce algún error, la función <strong>de</strong>vuelve –1 y en errno estará el<br />

código <strong>de</strong>l tipo <strong>de</strong> error producido.<br />

• El proceso que ejecuta wait queda bloqueado a nivel interrumpible a la espera <strong>de</strong> que algún hijo<br />

acabe (pase a Zombie). EL proceso que espera se <strong>de</strong>spertará al recibir una señal y respon<strong>de</strong>rá a<br />

ellas como ya se ha revisado, a excepción <strong>de</strong> la señal SIGCHLD, a la que respon<strong>de</strong>rá <strong>de</strong> la<br />

siguiente manera:<br />

− En el caso por <strong>de</strong>fecto, el proceso se <strong>de</strong>spertará en <strong>de</strong>l sleep que ha hecho en wait.<br />

Recor<strong>de</strong>mos que sleep controla (al <strong>de</strong>spertar) si hay señales pendientes y las procesa con<br />

issig. Este issig reconocerá el caso especial <strong>de</strong> SIGCHLD y <strong>de</strong>volverá FALSO. En<br />

consecuencia, el kernel no hace un longjmp <strong>de</strong>s<strong>de</strong> el sleep sino que finaliza allí y vuelve a<br />

wait. Allí el proceso encontrará un hijo Zombie (el que le ha <strong>de</strong>spertado) y acumulará datos,<br />

liberará la entrada en la tabla <strong>de</strong> procesos <strong>de</strong>l proceso hijo y regresará <strong>de</strong>l wait.<br />

− Si el proceso ha indicado un manejador <strong>de</strong> señal, él la procesará la SIGCHLD.<br />

− Si el proceso ha indicado ignorar la SIGCHLD, el kernel permanecerá en el loop <strong>de</strong>l wait<br />

procesando al hijo Zombie y esperando por otros hijos.<br />

Departamento <strong>de</strong> Lenguajes y Computación. <strong>Universidad</strong> <strong>de</strong> Almería Página <strong>2.</strong>34

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!