semaforos

Upload: heberisto3k

Post on 14-Jul-2015

64 views

Category:

Documents


0 download

TRANSCRIPT

Sincronizacin de ProcesosSemforos

Emely Arriz Ene-Mar 08

Conceptos

Herramienta de sincronizacin (provista por el SO). Un semforo S es una variable de tipo entero, que adems de ser inicializada. Puede ser accedida a travs de dos operaciones atmicas y mutuamente excluyentes wait(S) o P(S) o down(S) signal(S) o V(S) o up(S) Para evitar busy-waiting, cuando un procesos tiene que esperar, se pondra en una cola de procesos bloqueados esperando un evento.

ConceptosSemforo puede ser implementado como una estructura con dos campos count : integer queue: list of processes Cuando un proceso debe esperar por un semforo S, el es bloqueado (block() ) y colocado en la cola del semaforo. La operacin de signal remueve (wakeup() )un proceso desde la cola y lo coloca en la lista de procesos ready.

Semforos binarios ysemforos generales

Semforo binario Solo puede tener dos valores, 0 y 1, y es la forma ms comn de semforo. Semforo general Son semforos que pueden tomar muchos valores positivos.

Semforostype semaphore = record count: integer; queue: list of process end; var S: semaphore; Cuando un proceso debe esperar a un semforo S, se bloquea y se pone en la cola del semforo S. La operacin signal quita (con la poltica FIFO) un proceso de la cola y lo pone en la cola de procesos listos.

Observaciones de Semaforos (Negativos) Si S.count >=0 El nmero de procesos que pueden ejecutar wait(S) sin que se bloqueen = S.count Si S.count0 para poder anadir items.

Bounded- Buffer (cont)La estructura del proceso consumidor while (TRUE) { (Obs: El consumidor espera por Full>0) wait(Full); wait(mutex); remueve item del buffer; signal(mutex); signal(Empty); consume item; }

Readers - WritersData es compartida entre diferentes procesos concurrentes. Lectores: leen solamente. No ejecutan modificaciones. Escritores: leen y escriben Problema: permitir mltiples lectores pero solamente un escritor. Procesos lectores nunca esperan a menos que un escritor est en su seccin crtica. Data compartida Conjunto de datos. mutex :semforo inicializado en 1. wrt : semforo inicializado en 1. readcount : entero inicializado 0.

Readers-Writers (cont.)Writer[1..n] La estructura del proceso escritor while (TRUE) { wait(wrt); escribo; signal(wrt); }

Readers-Writers (cont.)La estructura del proceso. Reader[1..m] lector while (TRUE) { wait(mutex); readcount++; if (readcount == 1) wait(wrt); signal(mutex); ejecuta lectura; wait(mutex); readcount-- ; if (readcount == 0) signal(wrt); signal(mutex); }

Dining Philosophers3 Clsico Problema de Sincroniza cin. 4 Datos compartidos 1 bowl de Rice semaforos tenedor[5] inicializado 1

1 semaforo

5

ProblemaCada filsofo es un proceso. Un semforo por tenedor

fork: array[0..4] of semfores. Para todo i inicializar fork[i].count=1

Filsofos - SolucinProcess Pi repeat think; wait(fork[i]); wait(fork[(i+1) mod 5]); eat; signal(fork[(i+1) mod 5]); signal(fork[i]); until false Problema : Deadlock

Filsofos - Solucin#define N 5 #define RIGHT(i) (((i)+1) %N) #define LEFT(i) (((i)== N) ? 0 : (i)+1) Typedef enum { THINKING, HUNGRY, EATING } phil_state; phil_state state [N] ; Semaphore mutex = 1; Semaphore s [N] ; void test (int i) { if (state [i] == HUNGRY && state [LEFT(i)] != EATING && state [RIGHT(i)] != EATING ) { state [i] == EATING; signal(s[i]); } } void get_forks(int i) { wait(mutex); state [i] == HUNGRY; test(i); signal(mutex); wait(s[i]); }

Filsofos Solucin (cont.)void put_forks(int i) { wait(mutex); state [i] == THINKING; test(LEFT(i)); test(RIGHT(i)); signal(mutex); } void philosopher(int i) { while(1) { think(); get_forks(process); eat(); put_forks(process); } }

Problemas con SemforosSemforos son herramientas poderosas para exclusin mutua y coordinacin de procesos. Difcil entender sus efectos cuando los wait(S) y signal(S) estn esparcidos entre varios procesadores. Uso debe ser correcto en todos los procesadores. Es fcil cometer errores en la programacin de los semforos El tiempo durante el cual un proceso est bloqueado en un semforo no est limitado.