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 />
<strong>2.</strong>8.1. Bottom-halves.<br />
• Las “Bottom-halves” (BHs) que constituyen la versión primitiva <strong>de</strong> las funciones utilizadas para<br />
<strong>de</strong>jar para más a<strong>de</strong>lante los aspectos menos urgentes <strong>de</strong> las rutinas <strong>de</strong> servicio <strong>de</strong> las interrupciones.<br />
En muchos manejadores <strong>de</strong> interrupción no en necesario ni conveniente, realizar todo el trabajo <strong>de</strong><br />
atención y procesado <strong>de</strong> la interrupción durante la propia atención <strong>de</strong> la interrupción: (1) parte <strong>de</strong>l<br />
trabajo se pue<strong>de</strong> retrasar utilizando en mecanismo <strong>de</strong>nominado “bottom-half” (segunda parte). (2)<br />
La implementación es poco eficiente, a costa <strong>de</strong> ser poco flexible y oscura. (3) Se utiliza un mapa<br />
<strong>de</strong> bits (representado por un entero) para marcar como activa una <strong>de</strong> las bottom-halves. Por tanto,<br />
como máximo se pue<strong>de</strong>n tener 32 rutinas <strong>de</strong> bottom-half (tantos bits como tiene un entero). Éste<br />
fue el mecanismo que inicialmente se diseñó en el kernel, y para eliminar la limitación <strong>de</strong> 32 BHs,<br />
se añadió el mecanismo <strong>de</strong> colas <strong>de</strong> espera.<br />
• En inclu<strong>de</strong>/linux/interrupt.h están las estructuras <strong>de</strong> datos relativas a las BHs y en inclu<strong>de</strong>/asmi386/softirq.h<br />
las funciones (las funciones <strong>de</strong>finidas como inline se expan<strong>de</strong>n en el código que las<br />
invoca, eliminando la sobrecarga <strong>de</strong> un salto a función). (1) init_bh(nr, routine), inicializa la BH nr<br />
para que se ejecuta la rutina routine. (2) mark_bh(nr), activa el bit correspondiente mapa <strong>de</strong> bits<br />
bh_active con lo que esta BH se ejecutará una vez. (3) disable_bh(nr), elimina el bit <strong>de</strong> esa BH <strong>de</strong>l<br />
mapa <strong>de</strong> bits bh_mask, con lo que la BH queda temporalmente <strong>de</strong>shabilitada. (4) enable_bh(nr),<br />
restaura el bit en la máscara bh_mask, reactivando la BH. Estas dos últimas funciones se suelen<br />
utilizar <strong>de</strong>s<strong>de</strong> <strong>de</strong> las propias rutinas <strong>de</strong> la BHs para evitar que mientras se está sirviendo la BH se<br />
pue<strong>de</strong> volver a llamar a esa misma BH.<br />
• Para po<strong>de</strong>r utilizar una BH, primero hay que llamar a init_bh que asociará una función con nuestra<br />
BH. Por ejemplo <strong>de</strong>s<strong>de</strong> la función sched_init se inicializan varias BHs, entre ellas la <strong>de</strong>l reloj.<br />
Luego, <strong>de</strong>ntro <strong>de</strong>l manejadores <strong>de</strong> interrupciones podremos “marcar” nuestra BH para que se<br />
ejecute antes <strong>de</strong> volver a código en modo usuario. Por ejemplo, la rutina do_timer llama a<br />
mark_bh(TIMER_BH) para activar su BH, tras lo que el sistema continua atendiendo esta<br />
interrupción.<br />
• Des<strong>de</strong> tres lugares (do_irq, ret_from_sys_call, schedule), se llama a do_bottom-half, que invoca<br />
por fin a todas las funciones postpuestas. En el archivo, inclu<strong>de</strong>/linux/interrupt.h están <strong>de</strong>finidas las<br />
constantes que i<strong>de</strong>ntifican a cada una <strong>de</strong> las BH <strong>de</strong> todo el sistema. Es importante tener <strong>de</strong>clarados<br />
en un único lugar <strong>de</strong>l código todas las BHs para evitar que dos “drivers” <strong>de</strong>l kernel utilicen el<br />
mismo número <strong>de</strong> BH (sólo hay disponibles 32 BHs).<br />
<strong>2.</strong>8.<strong>2.</strong> Temporizadores <strong>de</strong>l Kernel (timers).<br />
• Linux gestiona una lista <strong>de</strong> timers con el objetivo <strong>de</strong> po<strong>de</strong>r poner procesos en espera durante un<br />
periodo <strong>de</strong> tiempo <strong>de</strong>terminado. Estos timers se organizan en forma <strong>de</strong> una lista circular<br />
doblemente enlazada. Los timers a <strong>de</strong>senca<strong>de</strong>nar en un futuro próximo se colocan al principio <strong>de</strong> la<br />
lista, mientras que los elementos a <strong>de</strong>senca<strong>de</strong>nar en un futuro lejano se al final <strong>de</strong> dicha lista. La<br />
estructura timer_list, se <strong>de</strong>fine en el archivo linux/timer.h según la siguiente estructura<br />
struct timer_list {<br />
struct list_head list;<br />
unsigned long expires;<br />
unsigned long data;<br />
void (*function) (unsigned long);<br />
volatile int running;<br />
};<br />
• La variable timer_head, <strong>de</strong>finida en el archivo kernel/sched.c, contiene la dirección <strong>de</strong>l primer<br />
elemento (timer) <strong>de</strong> la lista. La fecha <strong>de</strong> expiración (expires) se expresa en número <strong>de</strong> ciclos <strong>de</strong><br />
reloj <strong>de</strong>s<strong>de</strong> el arranque <strong>de</strong>l sistema. La variable global jiffies es mantenida por el kernel (su valor se<br />
incrementa en cada interrupción <strong>de</strong> reloj) y contiene siempre el número <strong>de</strong> ciclos <strong>de</strong> reloj<br />
transcurridos <strong>de</strong>s<strong>de</strong> el arranque. A<strong>de</strong>más, el campo expires tiene el valor <strong>de</strong> jiffies cuando el<br />
manejador function <strong>de</strong>be ser invocado con data pasado como parámetro.<br />
Departamento <strong>de</strong> Lenguajes y Computación. <strong>Universidad</strong> <strong>de</strong> Almería Página <strong>2.</strong>46