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