Semáforos

http://faq.utn.so/semaforos

Un Semáforo es un:

Tipo

Abstracto de

Datos

http://es.wikipedia.org/wiki/Tipo_de_dato_abstracto

Operaciones atómicas

Post(sem){

if(sem < 0)

despertar();

sem += 1;

}

Wait(sem){

sem -= 1;

if (sem < 0 )

blockear();

}

ADDR B,S

MOVR B,A

GETM D,B

LOAD A,0

CLEQ D,A

INCR D

SETM 1,B,D

JPNZ 350

XXXX

WAKE

XXXX

ADDR B,S

MOVR B,A

GETM D,B

LOAD A,0

CLEQ D,A

DECR D

SETM 1,B,D

JPNZ 185

XXXX

BLOK

XXXX

El código es a modo de ejemplo.

Estas son System calls, no hay forma de asegurar que sea así, pero hace lo que esta aca escrito; líneas más, líneas menos.

Ejecución de mutua exclusión

x = 0 mutex = 1

while( 1 ){

printf("%d\n", x);

x = x + 7;

printf("%d\n", x);

}

while( 1 ){

printf("%d\n", x);

x = x - 5;

printf("%d\n", x);

}

Región crítica

Región crítica

post(mutex);

post(mutex);

wait(mutex);

wait(mutex);

Se llaman “Mutex” justamente por el principio de mutua exlusion: http://en.wikipedia.org/wiki/Mutual_exclusion

Ejecución en orden

x = 0 S_1 = 0 S_2 = 1

while( 1 ){

printf("%d\n", x);

x = x + 7;

printf("%d\n", x);

}

while( 1 ){

printf("%d\n", x);

x = x - 5;

printf("%d\n", x);

}

post(S_1);

wait(S_1);

wait(S_2);

post(S_2);

Interesa mucho el estado inicial de los semáforos.

Si S_1 = 1 y S_2 = 0 -> se ejecutaria siempre el x+7 (izqueirda) antes que el x-5 (derecha)

Productor-Consumidor

......

Productor

Consumidor

Cola

Inicio

Fin

N

N es la cantidad de elementos actual

Productor-Consumidor

N = 0

Consumidor(){

while(1){

msg=pop(cola);

consumir(msg);

}

}

Productor(){

while(1){

msg=producir();

push(cola, msg);

}

}

post(N);

wait(N);

Solamente evita que se consuman más de los que se producen

  • pthread_mutex_init()
  • pthread_mutex_lock()
  • pthread_mutex_unlock()
  • pthread_mutex_destroy()
  • sem_init()
  • sem_wait()
  • sem_post()
  • sem_destroy()

-pthread

pthread hay que linkearlo explícitamente en el compilador.

Linux API - Semáforos - Google Slides