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

• El algoritmo issig se usa para <strong>de</strong>tectar la existencia <strong>de</strong> señales a procesar (el proceso pue<strong>de</strong> elegir<br />

ignorar las señales vía la llamada al sistema signal, en cuyo caso <strong>de</strong>sactiva el bit <strong>de</strong> señal).<br />

• El kernel maneja las señales en el contexto <strong>de</strong>l proceso que recibe la señal, por lo tanto el proceso<br />

<strong>de</strong>be estar ejecutando. Se presentan tres situaciones en el manejo <strong>de</strong> la señal: el proceso finaliza vía<br />

exit, el proceso ignora la señal o el proceso ejecuta una función <strong>de</strong> usuario para manejarla. La<br />

acción por <strong>de</strong>fecto suele ser llamar a exit en modo kernel. El uso <strong>de</strong> acciones específicas se indica<br />

mediante funcion_Old = signal(signum, funcion_New), don<strong>de</strong> signum es el número <strong>de</strong> la señal y<br />

funciónNew es la dirección <strong>de</strong> la función <strong>de</strong> usuario que se invocará para esta señal. Es posible<br />

pasar 0/1 en lugar <strong>de</strong> la dirección indicando que se ignoren las ocurrencias <strong>de</strong> esta señal (1) o que<br />

se ejecute exit al recibir la señal (si el parámetro es 0). En la u-Area se dispondrá <strong>de</strong> un array con<br />

las acciones a tomar para cada señal en el cual el kernel almacenará la dirección <strong>de</strong> la función a<br />

ejecutar para cada señal.<br />

algoritmo psig<br />

// manejo <strong>de</strong> la señal <strong>de</strong>spués <strong>de</strong> reconocerla<br />

{<br />

I<strong>de</strong>ntificar la señal;<br />

Borrar indicación <strong>de</strong> señal en la entrada <strong>de</strong>l proceso en la Tabla <strong>de</strong> Procesos;<br />

if (se ha indicado ignorar esta señal)<br />

exit;<br />

if (se ha especificado una función para manejar esta señal)<br />

{<br />

Obtener la dirección <strong>de</strong>l manejador indicado (en la uArea);<br />

Borrar la dirección <strong>de</strong>l manejador en la uArea;<br />

Modificar el contexto-<strong>de</strong>-usuario: crear en la pila un marco artificial para simular la llamada a la<br />

función que manejará la señal;<br />

Modificar el contexto-<strong>de</strong>-sistema escribir la dirección <strong>de</strong>l manejador <strong>de</strong> la señal en el registro<br />

PC (Contador <strong>de</strong> Programa) <strong>de</strong>l contexto salvado;<br />

Return;<br />

}<br />

if (señal involucra un volcado <strong>de</strong> memoria a disco)<br />

{<br />

Crear un archivo core en en directorio actual (CurDir);<br />

Escribir el contenido <strong>de</strong>l contexto-<strong>de</strong>-usuario en el archivo;<br />

}<br />

exit;<br />

}<br />

• Cuando se maneja la señal el kernel la i<strong>de</strong>ntifica y <strong>de</strong>sactiva el bit <strong>de</strong> indicación <strong>de</strong> la señal (que se<br />

activó al recibir la señal). Si la función <strong>de</strong> manejo <strong>de</strong> la señal está a su valor por <strong>de</strong>fecto, el kernel<br />

pue<strong>de</strong> hacer un volcado <strong>de</strong> memoria (al archivo core) para <strong>de</strong>terminados tipos <strong>de</strong> señales (en<br />

general aquellas que indiquen mal funcionamiento <strong>de</strong>l proceso, a efecto <strong>de</strong> <strong>de</strong>puración <strong>de</strong><br />

programas. Por ejemplo a la señal Ctrl-C no le sigue un volcado porque no ha ocurrido nada<br />

anormal en el programa solo que se quiere terminar prematuramente).<br />

• Si el proceso ha recibido una señal que ha <strong>de</strong>cidido ignorar el proceso continúa como si la señal no<br />

hubiera llegado. En el caso que el proceso haya especificado que él va a manejar la señal, el kernel<br />

hace lo siguiente (antes <strong>de</strong> pasarle el control a la función <strong>de</strong> usuario): El kernel obtiene <strong>de</strong>l contexto<br />

<strong>de</strong> usuario que ha salvado (al entrar a la llamada al sistema) y toma <strong>de</strong> él el Contador <strong>de</strong> Programa<br />

(PC) y el puntero a la pila (SP) (normalmente limpia el campo <strong>de</strong>l manejador <strong>de</strong> la señal en la u-<br />

Area y lo coloca al valor por <strong>de</strong>fecto). A continuación crea una nueva capa en la pila <strong>de</strong>l usuario,<br />

escribiendo los valores <strong>de</strong>l PC y SP (la pila <strong>de</strong> usuario aparecerá como si el proceso hubiera<br />

llamado a una función cualquiera, el manejador <strong>de</strong> la señal, en el punto que se llamó a la llamada al<br />

sistema o don<strong>de</strong> el kernel reconoció la señal. Para acabar el kernel cambia el contexto <strong>de</strong> registros<br />

que salvó, modifica el PC para que apunte a la función <strong>de</strong> manejo y modifica el valor <strong>de</strong>l puntero a<br />

la pila <strong>de</strong> usuario (ha crecido con la nueva capa). Cuando el proceso pase <strong>de</strong> kernel a modo usuario<br />

ejecutará su manejador <strong>de</strong> señal y luego regresará al punto en que se encontraba.<br />

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

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

Saved successfully!

Ooh no, something went wrong!