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
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 />
Bloqueo <strong>de</strong> las señales. Un proceso pue<strong>de</strong> controlar la llegada <strong>de</strong> las diferentes señales, pudiendo retrasar su<br />
llegada bloqueándolas (se dice entonces que están pendientes). Cada proceso posee un conjunto llamado<br />
máscara <strong>de</strong> señales, que contiene la lista <strong>de</strong> las señales bloqueadas. Este conjunto pue<strong>de</strong> modificarse<br />
mediante la llamada al sistema sigprocmask.<br />
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);<br />
El proceso pue<strong>de</strong> solicitar al sistema su lista <strong>de</strong> señales pendientes por la llamada al sistema sigpending cuyo<br />
prototipo es el siguiente:<br />
int sigpending(sigset_t *set);<br />
Desvío <strong>de</strong> señales. Control <strong>de</strong>l comportamiento <strong>de</strong>l proceso en la recepción <strong>de</strong> una señal.<br />
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);<br />
Espera <strong>de</strong> señales. La llamada al sistema pause no permite esperar una señal particular, el proceso se<br />
suspen<strong>de</strong> hasta que llegue cualquier señal. La norma POSIX ha regulado este problema con la introducción<br />
<strong>de</strong> la llamada al sistema sigsuspend, que reemplaza temporalmente la máscara <strong>de</strong> señales <strong>de</strong>l proceso por una<br />
máscara <strong>de</strong> espera y suspen<strong>de</strong> el proceso hasta la llegada <strong>de</strong> una señal que no pertenezca a la máscara <strong>de</strong><br />
espera.<br />
int sigsuspend(const sigset_t *mask);<br />
Gestión <strong>de</strong> las alarmas . Un proceso pue<strong>de</strong> solicitar al sistema que le envíe una señal en un tiempo dado,<br />
utilizando para ello la llamada al sistema alarm.<br />
long alarm(long seconds);<br />
La llamada al sistema alarm es limitada, pues no permite gestionar automáticamente una alarma. La gestión<br />
<strong>de</strong>l tiempo es únicamente relativa al tiempo real, pero pue<strong>de</strong> ser interesante gestionar alarmas relativas al<br />
tiempo <strong>de</strong> ejecución <strong>de</strong>l proceso. Los sistemas BSD y System V han resuelto estos problemas introduciendo<br />
dos nuevas llamadas al sistema que permiten gestionar automáticamente alarmas periódicas con referencias<br />
<strong>de</strong> tiempo diferentes.<br />
int getitimer(int which, struct itimerval *value);<br />
int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue);<br />
La señal SIGCHLD. Cuando un proceso termina, queda en estado Zombie hasta que un proceso padre tenga<br />
conocimiento <strong>de</strong> su estado <strong>de</strong> finalización por una <strong>de</strong> las llamadas al sistema wait o wait4. El proceso padre<br />
es avisado <strong>de</strong> la terminación <strong>de</strong> uno <strong>de</strong> sus hijos por el sistema, que le envíala señal SIGCHLD. La señal se<br />
activa únicamente cuando el proceso padre realizar una <strong>de</strong> las llamadas al sistema citadas anteriormente.<br />
En principio, bajo Linux la señal SIGCHLD se pone a SIG_IGN y el sistema no previene al padre <strong>de</strong> la<br />
terminación <strong>de</strong> un hijo; el sistema realiza automáticamente la terminación <strong>de</strong>l proceso hijo y éste <strong>de</strong>saparece<br />
<strong>de</strong> la Tabla <strong>de</strong> Procesos.<br />
La consi<strong>de</strong>ración <strong>de</strong> la señal SIGCHLD es importante en la escritura <strong>de</strong> aplicaciones cliente/servidor. En<br />
general, un servidor maestro controla la llegada <strong>de</strong> peticiones y crea un servidor esclavo que respon<strong>de</strong> a ellas.<br />
Tras la petición, el servidor esclavo se termina y el servidor maestro verifica que no haya habido problemas<br />
por la lectura <strong>de</strong> su código <strong>de</strong> terminación. Es necesario leer el estado <strong>de</strong> terminación, si no existe un riesgo<br />
<strong>de</strong> saturación <strong>de</strong> la Tabla <strong>de</strong> Procesos por proceso en estado Zombie.<br />
La información respecto a la gestión <strong>de</strong> las señales para un proceso se almacenan en la estructura <strong>de</strong> datos<br />
task_struct (<strong>de</strong>scriptor <strong>de</strong> proceso). Los campos <strong>de</strong> esta estructura relacionados con las señales son los<br />
siguientes:<br />
signal: señales en espera, expresadas en forma <strong>de</strong> ca<strong>de</strong>na <strong>de</strong> bits.<br />
blocked: señales ocultas, expresadas en forma <strong>de</strong> ca<strong>de</strong>na <strong>de</strong> bits.<br />
exit_signal: número <strong>de</strong> la señal que ha causado la finalización <strong>de</strong>l proceso.<br />
sig: tabla que contiene la dirección <strong>de</strong> las funciones <strong>de</strong> <strong>de</strong>svío <strong>de</strong> las señales.<br />
La estructura signal_struct, que <strong>de</strong>fine el tipo <strong>de</strong> sig, se <strong>de</strong>clara en el archivo linux/sched.h. Contiene los dos<br />
campos siguientes:<br />
int count: contador utilizado por la llamada al sistema clone para referenciar el número <strong>de</strong> proceso que<br />
apuntan a la estructura.<br />
struct sigaction[32] action: tabla <strong>de</strong> funciones <strong>de</strong> <strong>de</strong>svío.<br />
Departamento <strong>de</strong> Lenguajes y Computación. <strong>Universidad</strong> <strong>de</strong> Almería Página <strong>2.</strong>59