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
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