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.5 Sincronización entre procesos<br />

El núcleo propuesto ofrece semáforos como mecanismo básico <strong>de</strong> sincronización entre<br />

procesos. Un semáforo se i<strong>de</strong>ntifica por <strong>un</strong> entero. Se introduce <strong>un</strong>a nueva condición <strong>de</strong><br />

bloqueo para los procesos, con tantas colas como semáforos disponibles, NSEM. El bloqueo<br />

por semáforo presenta la particularidad <strong>de</strong> que <strong>de</strong>be seguir estrictamente <strong>un</strong>a disciplina FCFS,<br />

por lo que el mecanismo <strong>de</strong> bloqueo estándar introducido para las rutinas bloqueantes no se<br />

pue<strong>de</strong> aplicar en la primitiva <strong>de</strong> espera por semáforo, wait_nuc(), <strong>de</strong>scrita en la Figura 15. La<br />

primitiva signal_nuc() se ha implementado como expulsora.<br />

int wait_nuc (n_semaforo)<br />

int n_semaforo;<br />

{<br />

inhibir();<br />

salvar_flags();<br />

salvar_reg();<br />

if (0 0) sem[n_semaforo].cont--;<br />

else {<br />

((struct pcb *)r<strong>un</strong>.primero)->status = n_semaforo;<br />

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

encolar (&sem[n_semaforo].s, primero(&r<strong>un</strong>));<br />

ntr=0;<br />

dispatcher (scheduler());<br />

}<br />

}<br />

else ((struct pcb *)r<strong>un</strong>.primero)->ax = -1;<br />

restaurar();<br />

}<br />

5 Puesta en marcha<br />

Figura 15. Rutina wait_nuc<br />

Sobre el núcleo propuesto se pue<strong>de</strong> construir <strong>un</strong> sistema operativo completo. Como no<br />

disponemos <strong>de</strong> <strong>un</strong> sistema operativo completo con todas sus herramientas para soportar<br />

aplicaciones, probaremos el f<strong>un</strong>cionamiento <strong>de</strong>l núcleo con <strong>un</strong> conj<strong>un</strong>to <strong>de</strong> programas <strong>de</strong><br />

prueba que utilicen sus primitivas y monitoricen su f<strong>un</strong>cionamiento. En cualquier caso, se<br />

requiere <strong>un</strong> programa que instale el núcleo y lance los procesos <strong>de</strong>l sistema. Este programa<br />

incluirá:<br />

• El código completo <strong>de</strong>l núcleo, que incluye primitivas, rutinas internas y librerías <strong>de</strong><br />

bajo nivel.<br />

• El código <strong>de</strong> la prueba <strong>de</strong>l núcleo, que es <strong>un</strong> conj<strong>un</strong>to <strong>de</strong> f<strong>un</strong>ciones en código C que se<br />

ejecutarán asíncronamente, como threads o procesos a ser gestionados por el núcleo.<br />

• El procedimiento principal (main) <strong>de</strong> puesta en marcha.<br />

El procedimiento principal realizará las siguientes acciones:<br />

(1) Instalación <strong>de</strong> las rutinas <strong>de</strong> tratamiento <strong>de</strong> interrupciones, mediante vector_int().<br />

(2) Inicialización <strong>de</strong> las colas <strong>de</strong>l núcleo (r<strong>un</strong>, ready, teclado, semáforos, …).<br />

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

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

Saved successfully!

Ooh no, something went wrong!