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