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 />
• El kernel <strong>de</strong> Linux, <strong>de</strong> manera interna, implementa timers con el objetivo <strong>de</strong> provocar esperas<br />
cronometradas. En el archivo fuente kernel/sched.c se <strong>de</strong>fine varias funciones para la gestión <strong>de</strong><br />
timers: (1) add_timer(), aña<strong>de</strong> un timer a la lista: explora la lista <strong>de</strong> timers registrados para insertar<br />
un argumento <strong>de</strong> modo que la lista que<strong>de</strong> or<strong>de</strong>nada, y con ello, los primeros elementos <strong>de</strong> la lista<br />
correspon<strong>de</strong>n a los timers a <strong>de</strong>senca<strong>de</strong>nar en primer lugar. (2) <strong>de</strong>l_timer(), suprimer un timer <strong>de</strong> la<br />
lista, modificando simplemente los enca<strong>de</strong>namientos para eliminar sin problemas el elemento <strong>de</strong> la<br />
lista. (3) run_timer_list(), esta función es llamada por la cola <strong>de</strong> tareas (task queue) tq_timer. Para<br />
ello, explora la lista <strong>de</strong> timers, y ejecuta cada timer expirado, es <strong>de</strong>cir, aquel timer cuyo campo<br />
expires es menor o igual a la variable global jiffies, llamando a la función asociada (function) con<br />
el parámetro especificado en el campo data. Y cada uno <strong>de</strong> los timers ejecutados, se suprime <strong>de</strong> la<br />
lista.<br />
<strong>2.</strong>8.3. Colas <strong>de</strong> Tareas.<br />
• A partir <strong>de</strong> la versión <strong>de</strong> la versión <strong>2.</strong>0 <strong>de</strong>l kernel <strong>de</strong> Linux se crearon las colas <strong>de</strong> tareas como una<br />
ampliación <strong>de</strong> BHs que permiten encolar tantas funciones como se quiera para <strong>de</strong>spués ser<br />
procesadas una tras otra. Aunque se llaman colas <strong>de</strong> tareas, realmente son “pilas <strong>de</strong> funciones”, ya<br />
que son realmente funciones que se ejecutan en or<strong>de</strong>n LIFO. Uno pue<strong>de</strong> crear una cola <strong>de</strong> tareas<br />
utilizando la macro <strong>DE</strong>CLARE_TASK_QUEUE() y encola las tareas utilizando queue_task(),<br />
pudiendo ser procesada la cola <strong>de</strong> tareas por la función run_task_queue(). En lugar <strong>de</strong> crear nuestra<br />
propia cola <strong>de</strong> tareas, se pue<strong>de</strong>n utilizar las 4 colas <strong>de</strong> tareas que en Linux, inclu<strong>de</strong>/linux/tqueue.h,<br />
se <strong>de</strong>finen <strong>de</strong> forma pre<strong>de</strong>finida: (1) tq_timer, se ejecuta tras cada tic <strong>de</strong> reloj. (2) tq_inmediate, se<br />
ejecuta siempre que se evalúan las BH. Por tanto, se pue<strong>de</strong> “sustituir una BH” por una función<br />
insertada en esta cola <strong>de</strong> tareas. (3) tp_scheduler, se ejecuta <strong>de</strong>s<strong>de</strong> el scheduler antes <strong>de</strong> modificar el<br />
estado <strong>de</strong> una tarea. (4) tq_disk, utilizada por los drivers <strong>de</strong> dispositivos cada vez que el VFS<br />
(Virtual File System) espera leer algún buffer.<br />
• Las colas <strong>de</strong> tareas son listas enlazadas <strong>de</strong> estructuras <strong>de</strong>l tipo tq_struct (inclu<strong>de</strong>/linux/tqueue.h). Y<br />
las funciones más importantes que se pue<strong>de</strong>n aplicar sobre estas colas <strong>de</strong> tareas son: (1)<br />
queue_task(bh_pointer, bh_list), inserta en la cabeza <strong>de</strong> la lista bh_list la estructura bh_pointer que<br />
contiene la dirección <strong>de</strong> la rutina que queremos que se ejecute en el futuro. (2)<br />
run_task_queue(list), recorre la lista list y ejecuta todas las rutinas que hay encoladas: Más en<br />
concreto, se extraen todos los datos <strong>de</strong> las estructuras, se pasa al siguiente elemento <strong>de</strong> la lista, se<br />
marca como libre dicho registro y se llama a la función.<br />
<strong>2.</strong>8.4. Colas <strong>de</strong> Espera.<br />
• Una cola <strong>de</strong> espera es una lista enlazada y circular <strong>de</strong> <strong>de</strong>scriptores <strong>de</strong> procesos que se encolan a la<br />
espera <strong>de</strong> algún recurso o evento. Cada <strong>de</strong>scriptor <strong>de</strong> proceso contiene la dirección <strong>de</strong> un <strong>de</strong>scriptor<br />
<strong>de</strong> proceso así como un puntero al siguiente elemento en la cola.<br />
• Es importante no confundir las colas <strong>de</strong> espera con las colas <strong>de</strong> tareas. Colas <strong>de</strong> Tareas (task<br />
queues): (1) utilizadas para postponer la ejecución <strong>de</strong> una función concreta <strong>de</strong>l kernel, (2) utilizadas<br />
normalmente <strong>de</strong>s<strong>de</strong> los manejadores <strong>de</strong> interrupciones. Colas <strong>de</strong> Espera (wait queues): (1)<br />
utilizadas para suspen<strong>de</strong>r la ejecución <strong>de</strong> un proceso hasta que se produzca una cierta condición, (2)<br />
utilizadas normalmente en el código <strong>de</strong> las llamadas al sistema.<br />
• Veamos primero cómo se implementan las colas <strong>de</strong> espera. En el fichero inclu<strong>de</strong>/linux/wait.h está<br />
la <strong>de</strong>claración <strong>de</strong> la estructura <strong>de</strong> datos struct wait_queue[inclu<strong>de</strong>/linux/wait.h] con la que se<br />
construye la lista. (La estructura task_struct es la Tabla <strong>de</strong> Procesos, don<strong>de</strong> se guarda toda la<br />
información relacionada con cada proceso). Las funciones para (insertar y extraer) elementos <strong>de</strong> la<br />
lista son add_wait_queue(p,wait) y remove_wait_queue(p,wait), y están en inclu<strong>de</strong>/linux/sched.h.<br />
Departamento <strong>de</strong> Lenguajes y Computación. <strong>Universidad</strong> <strong>de</strong> Almería Página <strong>2.</strong>47