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