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

<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

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

Saved successfully!

Ooh no, something went wrong!