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

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

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

Diseño <strong>de</strong> Sistemas Operativos<br />

Tema <strong>2.</strong> Gestión <strong>de</strong> Procesos<br />

– Es claro que si el semáforo tiene asociado una cola (anteriormente hemos supuesto que no<br />

tiene asociado ninguna cola, solo el contador), las operaciones son sensiblemente diferentes:<br />

+ P (down). De forma atómica, se <strong>de</strong>crementa el contador y, si el resultado es negativo<br />

(menor que 0), entonces se suspen<strong>de</strong> el proceso y se inserta en la cola.<br />

+ V (up). De forma atómica, se incrementa el contador y, si el resultado es menor que 1<br />

(nulo), entonces se <strong>de</strong>spierta a uno <strong>de</strong> los procesos <strong>de</strong> la cola.<br />

• Las operaciones P y V <strong>de</strong>ben <strong>de</strong> realizarse <strong>de</strong> manera atómica, es <strong>de</strong>cir, que no <strong>de</strong>ben ser<br />

interrumpidas. Las operaciones P y V se <strong>de</strong>nominan frecuentemente down y up. Los semáforos se<br />

utilizan en el ámbito <strong>de</strong> los sistemas informáticos principalmente para resolver dos problemas:<br />

– La exclusión mutua: se trata <strong>de</strong> impedir a los procesos el acceso a un mismo recurso en un<br />

mismo instante. Si esto se produjera, el recurso podría encontrarse en un estado <strong>de</strong><br />

inconsistencia.<br />

– El problema <strong>de</strong> los productores/consumidores: se trata <strong>de</strong> permitir la cooperación <strong>de</strong> dos<br />

procesos, uno produce información que el otro utilizará (consumirá). El semáforo se utiliza<br />

para prevenir o indicar al consumidor que los datos están a punto.<br />

• Estos problemas se resuelven mediante semáforos binarios. Pero el contador <strong>de</strong>l semáforo pue<strong>de</strong><br />

tomar otros valores positivos. Es el caso, cuando varias unida<strong>de</strong>s <strong>de</strong>l mismo recurso están<br />

disponibles, el contador toma entonces el valor <strong>de</strong>l número <strong>de</strong> unida<strong>de</strong>s <strong>de</strong>l recurso accesibles<br />

simultáneamente.<br />

• En inclu<strong>de</strong>/asm-i386/semaphore.h tenemos la <strong>de</strong>claración <strong>de</strong>l tipo semáforo, estructura semaphore .<br />

struct semaphore {<br />

atomic_t count;<br />

int waking;<br />

struct wait_queue *wait;<br />

};<br />

• El campo waking se emplea para <strong>de</strong>terminar qué proceso <strong>de</strong> los bloqueados obtiene el semáforo<br />

cuando éste que<strong>de</strong> libre. Al tomar el semáforo (P): (1) se <strong>de</strong>crementa count, (2) si es menor que 1,<br />

entonces el proceso se marca como suspendido, se inserta en la cola <strong>de</strong> espera y ce<strong>de</strong> la CPU. Al<br />

<strong>de</strong>volver el semáforo (V) (1) se incremental count, (2) se incremental el campo waking, (3) se<br />

<strong>de</strong>spiertan TODOS los procesos bloqueados. De todos los procesos recien <strong>de</strong>sbloqueados, el<br />

primero en ejecutarse será el <strong>de</strong> mayor prioridad: (1) este proceso podrá waking a 0 y consi<strong>de</strong>ra que<br />

ha consguido el semáforo, (2) el resto <strong>de</strong> procesos, cuando les toque, comprobarán que waking está<br />

a 0 y se volverán a bloquear, (3) así, se <strong>de</strong>ja al scheduler la tarea <strong>de</strong> <strong>de</strong>cidir quien consigue el<br />

semáforo.<br />

• La función up(sem) incrementa el contador <strong>de</strong>l semáforo y en caso <strong>de</strong> ser negativo o cero llama a<br />

wakeup que llama a su vez a __up(sem), la cual incrementa en exclusión mutua el campo waking<br />

<strong>de</strong>l semáforo (esto lo hace wake_one_more) y <strong>de</strong>spierta a todos los procesos <strong>de</strong> la cola.<br />

void up(struct semaphore *sem)<br />

{<br />

++sem->count;<br />

if (sem->count count) waking++;<br />

spin_unlock_irqsave(&semaphore_wake_lock, flags);<br />

wake_up(&sem->wait);<br />

}<br />

}<br />

Departamento <strong>de</strong> Lenguajes y Computación. <strong>Universidad</strong> <strong>de</strong> Almería Página <strong>2.</strong>49

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

Saved successfully!

Ooh no, something went wrong!