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

• La función sleep_on, otras funciones similares y las macros comunes que contienen están en<br />

kernel/sched.c y se encargan <strong>de</strong> suspen<strong>de</strong>r la ejecución <strong>de</strong> procesos. El esquema general lo<br />

po<strong>de</strong>mos resumir en los siguientes pasos:<br />

− Se <strong>de</strong>clara una estructura <strong>de</strong>l tipo wait_queue<br />

− Se marca como no activo este proceso.<br />

− Se inserta en la cola correspondiente.<br />

− Se llama al planificador (función schedule y <strong>de</strong>ntro <strong>de</strong> schedule se llama a la función<br />

switch_to que cambia los registros <strong>de</strong>l procesador por los <strong>de</strong> otro proceso (cambio <strong>de</strong><br />

contexto)), para elegir a otro proceso a ejecutar, por lo que la llamada NO RETORNARÁ<br />

hasta que vuelva a ponerse en ejecución el proceso actual.<br />

• La función wake_up(p) es una macro que llama a __wake_up(p,mo<strong>de</strong>) que está en kernel/sched.c,<br />

que a su vez recorre la lista y <strong>de</strong>spierta a todos los procesos que hay esperando en ella.<br />

− En __wake_up se maneja la exclusión mutua y se recorre la lista, llamando para cada<br />

proceso a wake_up_process<br />

− En wake_up_process(p) se pone el proceso en estado activo (TASK_RUNNING), se inserta<br />

en la lista <strong>de</strong> procesos activos y se llama a reschedule_idle<br />

− En reschedule_idle se llama a reschedule_idle_slow, que, llamando a preemption_goodness<br />

todas ellas en kernel/sched.c, comprueba si el proceso que <strong>de</strong>spertamos tiene más<br />

“prioridad” (goodness) que el que hay en ejecución y, si esto es así, pone a 1 la variable<br />

need_resched <strong>de</strong>l procesador actual (esta variable se consulta antes <strong>de</strong> volver a código <strong>de</strong><br />

usuario y si su valor es distinto <strong>de</strong> cero se llama a la función schedule).<br />

• Como acabamos <strong>de</strong> ver, <strong>de</strong>ntro <strong>de</strong> sleep_on se queda el proceso bloqueado al llamar a schedule.<br />

Cuando el proceso vuelve a ponerse en ejecución, seguirá por don<strong>de</strong> se quedó (sus registros,<br />

incluyendo el contador <strong>de</strong> programa, se repondrán en la CPU tal y como estaban). Por tanto,<br />

ejecutará el código <strong>de</strong> la macro SLEEP_ON_TAIL, que simplemente llama a remove_wait_queue,<br />

que ya hemos visto antes. En <strong>de</strong>finitiva, cuando el proceso se pone en ejecución, él mismo se<br />

elimina <strong>de</strong> la cola <strong>de</strong> espera en la que estaba. Es importante <strong>de</strong>stacar que sólo cuando otro proceso<br />

o una rutina <strong>de</strong> servicio <strong>de</strong> una interrupción llame a wake_up podrá continuar la ejecución el<br />

proceso que hizo sleep_on.<br />

<strong>2.</strong>8.5. Semáforos.<br />

• Los semáforos constituyen un mecanismo general <strong>de</strong> sincronización <strong>de</strong> procesos a<strong>de</strong>más <strong>de</strong> ser una<br />

herramienta para la programación concurrente. Un semáforo no es realmente un mecanismo <strong>de</strong><br />

comunicación, sino más bien un mecanismo <strong>de</strong> sincronización <strong>de</strong> procesos (permite a los procesos<br />

compartir recursos (secciones críticas) y sincronizarse). En informática, y más particularmente en<br />

el caso <strong>de</strong> los sistemas operativos, un semáforo se utiliza para controlar el acceso a un recurso. Con<br />

los semáforos se pue<strong>de</strong>n construir secciones críticas para proteger datos compartidos, o utilizarlos<br />

como mecanismos <strong>de</strong> sincronización.<br />

• El semáforo y las operaciones relacionadas con él fueron <strong>de</strong>finidas por Dijkstra. Un semáforo<br />

compren<strong>de</strong> un contador (un valor entero, para contabilizar el número <strong>de</strong> procesos bloqueados) y<br />

una cola (para bloquear procesos, éstas son colas <strong>de</strong> espera), junto con dos operaciones:<br />

– P (<strong>de</strong>l holandés Proberen, probar): Esta operación se utiliza cuando un proceso quiere entrar<br />

en una sección crítica (acce<strong>de</strong>r a un recurso) y realiza las siguientes etapas:<br />

+ Etapa 1: Probar el valor <strong>de</strong>l contador <strong>de</strong>l semáforo que controla el recurso.<br />

+ Etapa 2: Si el valor es positivo, el proceso pue<strong>de</strong> servirse <strong>de</strong>l recurso, y <strong>de</strong>crementa el<br />

valor en 1 para indicar que utiliza una unidad <strong>de</strong>l recurso.<br />

+ Etapa 3: Si el valor es nulo, el proceso se duerme hasta que el valor sea <strong>de</strong> nuevo<br />

positivo. Cuando el proceso se <strong>de</strong>spierta vuelve a la Etapa 1.<br />

– V (<strong>de</strong>l holandés Verhogen, incrementar): Esta operación es simétrica a la anterior, y se<br />

utiliza cuando un proceso abandona la sección crítica (liberar el recurso). El valor <strong>de</strong>l<br />

contador <strong>de</strong>l semáforo se incrementa y los procesos en espera son <strong>de</strong>spertados.<br />

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

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

Saved successfully!

Ooh no, something went wrong!