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

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

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

Saved successfully!

Ooh no, something went wrong!