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

• 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

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

Saved successfully!

Ooh no, something went wrong!