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

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

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!