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.

La gestión <strong>de</strong>l tiempo compartido la realiza la rutina <strong>de</strong> atención al reloj, multiplexar(), como<br />

se ilustra en la Figura 10. Esta rutina incluye otras f<strong>un</strong>ciones (apagado automático <strong>de</strong>l motor<br />

<strong>de</strong> la <strong>un</strong>idad <strong>de</strong> disco y control <strong>de</strong>l periodo transitorio tras el encendido, retardo <strong>de</strong> procesos<br />

por tiempo), que no aparecen en la figura.<br />

void multiplexar ()<br />

{<br />

salvar_reg();<br />

/* FIN DE QUANTUM: */<br />

if (++ntr==((struct pcb*)r<strong>un</strong>.primero)->quantum) cambiar = TRUE;<br />

…<br />

}<br />

if (cambiar) {<br />

bloquear (&ready, READY);<br />

dispatcher (scheduler());<br />

}<br />

eoi();<br />

restaurar();<br />

Figura 10. Rutina multiplexar. Control <strong>de</strong> quantum.<br />

3.4.2 Creación, control y <strong>de</strong>strucción <strong>de</strong> procesos<br />

La rutina crear_pcb_nuc() asigna <strong>un</strong> PCB para <strong>un</strong> nuevo proceso, provocando la expulsión<br />

<strong>de</strong>l que está en ejecución. Existen primitivas para extraer información <strong>de</strong> <strong>un</strong> proceso y su<br />

i<strong>de</strong>ntificador (info_proc_nuc(), quisoc_nuc()) y para modificar su quantum y prioridad<br />

(modif_proc_nuc()). Finalmente, en la Figura 11 se incluye el código <strong>de</strong><br />

<strong>de</strong>struir_pcb_nuc(). Nótese las situaciones en que el PCB no se libera (el proceso tiene <strong>un</strong>a<br />

petición pendiente), sino que el proceso queda en estado finalizado (DEAD). La rutina <strong>de</strong><br />

atención correspondiente liberará el PCB <strong>de</strong>l proceso DEAD con la petición pendiente.<br />

4.2 Primitivas bloqueantes<br />

Llamaremos rutinas bloqueantes <strong>de</strong>l núcleo a las que solicitan <strong>un</strong> servicio <strong>de</strong>l hardware (<strong>un</strong><br />

dispositivo, el reloj…) y <strong>de</strong>jan al proceso en estado bloqueado, provocando la planificación<br />

<strong>de</strong> <strong>un</strong> nuevo proceso. Son varias las primitivas que trabajan <strong>de</strong> esta forma, en general aquéllas<br />

cuyo servicio se aten<strong>de</strong>rá mediante interrupciones, como motor_on_nuc(), retardo_nuc() —<br />

por tiempo—; leer_teclado_nuc() —por teclado—; escribir_impresora_nuc() —por<br />

impresora— leer_l_s_nuc, escribir_l_s_nuc() —por línea serie—; posicionar_pista_nuc(),<br />

leer_sector_nuc(), escribir_sector_nuc(), y recalibrar_nuc() —por disco—. Como<br />

ejemplo, en la Figura 12 se muestra el código <strong>de</strong> leer_teclado_nuc(). Todas las rutinas<br />

bloqueantes siguen el protocolo <strong>de</strong> salvar el contexto <strong>de</strong>l proceso (salvar_flags y<br />

salvar_reg), bloquear al proceso y planificar otro proceso cargando su contexto. Nótese<br />

también que se exige que la cola <strong>de</strong> bloqueado esté vacía: se sugiere la implementación <strong>de</strong> <strong>un</strong><br />

esquema cliente-servidor en el nivel superior.<br />

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

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

Saved successfully!

Ooh no, something went wrong!