Você está na página 1de 26

Tema 5: Semforos

Programacin Concurrente y Distribuida.

Introduccin

El problema de la Exclusin Mutua proviene de la Atomicidad Los SO multitarea proporcionan primitivas de ms alto nivel

Programacin Concurrente y Distribuida Prof. Jos Carlos Cortizo Prez


2

Semforo
Variable entera S que solo puede tomar valores no negativos 2 operaciones Wait( S ): Si S>0 entonces S = S - 1 Si no, se queda suspendida Signal( S ): Si existen procesos suspendidos, reactiva uno de ellos Si no, S = S + 1
Programacin Concurrente y Distribuida Prof. Jos Carlos Cortizo Prez
3

Semforo (2)
Wait y Signal son atmicas Valor inicial no negativo Signal reactiva un proceso suspendido, pero en la denicin no se indica cul Semforo Binario: Solo toma valores 0 y 1 General: Toma cualquier valor no negativo
Programacin Concurrente y Distribuida Prof. Jos Carlos Cortizo Prez
4

Invariante
S >= 0 (I1) S = S0 + #Signals - #Waits (I2) Donde: S0 Es la inicializacin del semforo #Signals es el nmero de veces que se ha ejecutado signal sobre el mismo #Waits es el nmero de veces que se ha ejecutado Wait sobre el mismo
Programacin Concurrente y Distribuida Prof. Jos Carlos Cortizo Prez
5

Uso de los semforos


S: Semaforo = 1; Tarea P1{ loop SNC_1; Wait(S); SC_1; Signal(S); } Tarea P2{ loop SNC_2; Wait(S); SC_2; Signal(S); }

Programacin Concurrente y Distribuida Prof. Jos Carlos Cortizo Prez


6

Exclusin Mutua
Probar #SC + S = 1 #SC = #Wait(S) - Signal(S) S = 1 + #Signal(S) - #Wait(S) (I2) S = 1 - #SC (a partir de las 2 anteriores) #SC + S = 1 (de la anterior)

Programacin Concurrente y Distribuida Prof. Jos Carlos Cortizo Prez


7

Ausencia Interbloqueos
Si los 2 no entran, es que se suspenden en sus Wait(S) Entonces S = 0 y #SC = 0 Pero 0 + 0 != 1

Programacin Concurrente y Distribuida Prof. Jos Carlos Cortizo Prez


8

Ausencia Inanicin
Si P1 est suspendido, S == 0 Entonces P2 en su SC (invariante) Cundo sale, ejecuta Signal(S) y entra P1 (es el nico suspendido)

Programacin Concurrente y Distribuida Prof. Jos Carlos Cortizo Prez


9

Deniciones de Semforos
Por implementacin:
Sem. Conjunto Bloqueados (Blocked-set): Un signal despierta uno de los bloqueados. Sem. Cola Bloqueados (Blocked-queue): Los bloqueados se guardan en una FIFO Sem. Espera-Ocupado (Busy-wait): Wait( S ): loop if( S > 0) { S = S - 1; exit; } end loop;
Programacin Concurrente y Distribuida Prof. Jos Carlos Cortizo Prez
10

Deniciones de Semforos
Por equidad: Semforos con equidad fuerte (Strong-fair): Si cuando se realiza sobre el un Signal innitamente a menudo, al nal cada proceso suspendido completar su instruccin Wait. Semforo con equidad dbil: Si el semforo se mantiene con valores mayores que 0, al nal cada proceso suspendido acabar su instruccin wait.

Programacin Concurrente y Distribuida Prof. Jos Carlos Cortizo Prez


11

Exclusin Mutua N procesos


Con tantos tipos de semforos #SC + S = 1, sigue mantenindose La solucin para EM sigue siendo la misma La ausencia de Interbloqueo igual La inanicin es dnde puede haber diferencias

Programacin Concurrente y Distribuida Prof. Jos Carlos Cortizo Prez


12

Exclusin Mutua N procesos


S: Semaforo = 1; Tarea Pi { loop SNC_i; Wait(S); SC_i; Signal(S); }
Programacin Concurrente y Distribuida Prof. Jos Carlos Cortizo Prez
13

Inanicin
Espera-Ocupado: Posible inanicin Cola de bloqueados: Imposible Conjunto de bloqueados: Posible con N>=3
Programacin Concurrente y Distribuida Prof. Jos Carlos Cortizo Prez
14

Productor-consumidor
Problema de comunicacin 2 procesos interrelacionados: Productor: genera datos que necesita el otro Consumidor: consume los datos del productor La forma simple es la invocacin directa Fuerza ir a remolque Usamos buffers intermedios para el desacoplamiento
Programacin Concurrente y Distribuida Prof. Jos Carlos Cortizo Prez
15

con Buffers innitos


B:array(0..innito); In_Ptr, Out_Ptr: Entero = 0; Tarea Productor { loop I = Producir(); B(In_Ptr) = I; In_Ptr = In_Ptr + 1; }
Programacin Concurrente y Distribuida Prof. Jos Carlos Cortizo Prez
16

con Buffers innitos


Tarea Consumidor { loop Wait until In_Ptr > Out_Ptr I = B(Out_Ptr); Out_Ptr = Out_Ptr + 1; Consumir(I); }

Programacin Concurrente y Distribuida Prof. Jos Carlos Cortizo Prez


17

con Buffers innitos


#NE = In_Ptr - Out_Ptr; Inicialmente hay 0 en el buffer por lo que #NE >= 0 #NE = 0 + In_Ptr - Out_Ptr Que es lo mismo que un semforo sustituyendo In_Ptr por Signal y el Out por el Wait
Programacin Concurrente y Distribuida Prof. Jos Carlos Cortizo Prez
18

con Buffers innitos


Solucin con semforos: B:array(0..innito); In_Ptr, Out_Ptr: Entero = 0; Elementos: Semaforo = 0; Tarea Productor { loop I = Producir(); B( In_Ptr ) = I; In_Ptr = In_Ptr + 1; Signal( Elementos ); }

Programacin Concurrente y Distribuida Prof. Jos Carlos Cortizo Prez


19

con Buffers innitos


Tarea Consumidor { loop Wait( Elementos ); I = B( Out_Ptr); Out_Ptr = Out_Ptr + 1; Consumir( I ); }

Programacin Concurrente y Distribuida Prof. Jos Carlos Cortizo Prez


20

con Buffers nitos


Con Buffers Circulares B:array(0..N-1); In_Ptr, Out_Ptr:Entero = 0; Elementos:Semaforo = 0; Espacios:Semaforo = N; Tarea Productor { loop I = Producir(); Wait(Espacios); B( In_Ptr ) = I; In_Ptr = ( In_Ptr + 1 ) mod N; Signal(Elements ); }

Programacin Concurrente y Distribuida Prof. Jos Carlos Cortizo Prez


21

con Buffers nitos


Tarea Consumidor { loop Wait( Elementos ); I = B( Out_Ptr ); Out_Ptr = ( Out_Ptr + 1 ) mod N; Signal( Espacios ); Consumir( I ); }

Programacin Concurrente y Distribuida Prof. Jos Carlos Cortizo Prez


22

con Buffers nitos


Correccin
#E = Elementos (I1) #E = N - Espacios (I2)

No se eliminan elementos de un buffer vaco ni se agregan a uno lleno No existen interbloqueos No se da la inanicin
Programacin Concurrente y Distribuida Prof. Jos Carlos Cortizo Prez
23

con semforos binarios


B:array(0..N-1); In_Ptr, Out_Ptr, Cuenta = 0; S:Semaforo_Binario = 1; No_Lleno, No_Vacio: Semaforo_Binario = 0;

Programacin Concurrente y Distribuida Prof. Jos Carlos Cortizo Prez


24

con semforos binarios


Tarea Productor { loop I = Producir(); if( Cuenta_Local == N ) Wait( No_Lleno ); B( In_Ptr ) = I; Wait( S ); Cuenta += 1; Cuenta_Local = Cuenta; Signal( S ); if( Cuenta_Local == 1 ) Signal( No_Vacio ) In_Ptr = ( In_Ptr + 1 ) mod N; }

Programacin Concurrente y Distribuida Prof. Jos Carlos Cortizo Prez


25

con semforos binarios


Tarea Consumidor { loop if( Cuenta_Local == 0 ) Wait( No_Vacio ); I = B( Out_Ptr ); Wait( S ); Cuenta -= 1; Cuenta_Local = Cuenta; Signal( S ); if( Cuenta_Local == N - 1 ) Signal( No_Lleno ) Out_Ptr = ( Out_Ptr + 1 ) mod N; Consumir( I ); }
Programacin Concurrente y Distribuida Prof. Jos Carlos Cortizo Prez
26

Você também pode gostar