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

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

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

Saved successfully!

Ooh no, something went wrong!