25.06.2014 Views

Núcleo de un Sistema Operativo

Núcleo de un Sistema Operativo

Núcleo de un Sistema Operativo

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

4 F<strong>un</strong>cionamiento <strong>de</strong>l núcleo<br />

4.1 Gestión <strong>de</strong> procesos<br />

Incluiremos aquí planificación, creación y <strong>de</strong>strucción <strong>de</strong> procesos. Un proceso se representa<br />

en <strong>un</strong> PCB (struct pcb) que se i<strong>de</strong>ntifica por <strong>un</strong> entero (índice en la tabla <strong>de</strong> PCBs).<br />

3.4.1 Planificación <strong>de</strong> procesos<br />

En la versión <strong>de</strong>l núcleo propuesta, se proporciona planificación <strong>de</strong> procesos <strong>de</strong> tiempo<br />

compartido y priorida<strong>de</strong>s, con expulsión por <strong>de</strong>sbloqueo <strong>de</strong> <strong>un</strong> proceso. Esto implica que la<br />

gestión <strong>de</strong> procesos involucra a las rutinas <strong>de</strong> atención (muy en particular a la <strong>de</strong> reloj para<br />

control <strong>de</strong> fin <strong>de</strong> quantum), a<strong>de</strong>más <strong>de</strong> las que hacen que <strong>un</strong> proceso pase a estado bloqueado<br />

(más a<strong>de</strong>lante nos referiremos a estas rutinas como bloqueantes).<br />

Los procesos preparados para ejecución se encolan en la cola ready <strong>de</strong> acuerdo a su prioridad,<br />

por lo que la rutina <strong>de</strong>l scheduler se limita a coger el primer elemento <strong>de</strong> la cola, que pasa al<br />

dispatcher para que lo cargue en ejecución (cola r<strong>un</strong>, que tendrá <strong>un</strong> único elemento). Por<br />

ortogonalidad, se asume la existencia <strong>de</strong> <strong>un</strong> proceso nulo, que siempre estará preparado para<br />

ejecución o ejecutándose. La Figura 8 muestra el código <strong>de</strong> las rutinas scheduler() y el<br />

dispatcher(). La rutina bloquear() es la encargada <strong>de</strong> sacar a <strong>un</strong> proceso <strong>de</strong> la cola, lo que<br />

implica como efecto colateral la actualización <strong>de</strong>l tiempo <strong>de</strong> CPU. Su código se muestra en la<br />

Figura 9.<br />

struct item *scheduler()<br />

{<br />

return (primero(&ready));<br />

}<br />

void dispatcher (este_item)<br />

struct item *este_item;<br />

{<br />

meter (&r<strong>un</strong>, este_item, RUN);<br />

}<br />

Figura 8. Rutinas scheduler y dispatcher<br />

void bloquear (c, status)<br />

struct cola *c;<br />

int status;<br />

{<br />

((struct pcb *)r<strong>un</strong>.primero)->cpu_time += ntr;<br />

meter(c, primero(&r<strong>un</strong>), status);<br />

ntr=0;<br />

}<br />

Figura 9. Rutina bloquear<br />

Una vez actualizadas la colas <strong>de</strong> procesos, la multiplexación se completa reestableciendo el<br />

estado <strong>de</strong>l procesador para que ejecute el proceso planificado. Básicamente esto implica hacer<br />

que el SP ap<strong>un</strong>te a la pila <strong>de</strong>l nuevo proceso. La rutina restaurar(), codificada en<br />

ensamblador, es la que se encarga <strong>de</strong> ello, manipulando el bloque <strong>de</strong> activación anterior.<br />

Previamente, la rutina salvar_reg() habrá salvado el estado <strong>de</strong>l proceso que estaba en<br />

ejecución.<br />

UPV/EHU ATC Laboratorio <strong>de</strong> <strong>Sistema</strong>s <strong>Operativo</strong>s 9

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

Saved successfully!

Ooh no, something went wrong!