tipos sistemas sincronizacion semaforos semaforo resueltos programacion procesos problemas operativos ejercicios ejemplos concurrente algoritmo operating-system computer-science semaphore systems-programming barrier

operating system - sistemas - Implementando una barrera de proceso N usando semáforos



semaforos sistemas operativos ejemplos (3)

Esto está bien presentado en The Little Book of Semaphores .

n = the number of threads count = 0 mutex = Semaphore(1) barrier = Semaphore(0) mutex.wait() count = count + 1 mutex.signal() if count == n: barrier.signal() # unblock ONE thread barrier.wait() barrier.signal() # once we are unblocked, it''s our duty to unblock the next thread

Actualmente estoy entrenando para un examen del sistema operativo con iteraciones anteriores y me encontré con esto:

Implemente una "Barrera de proceso N", es decir, asegurándose de que cada proceso de un grupo de ellos espere, en algún momento de su ejecución respectiva, para que los otros procesos lleguen a su punto determinado.

Usted tiene las siguientes operaciones disponibles:

init(sem,value), wait(sem) and signal(sem)

N es un número arbitrario. Puedo hacerlo para que funcione para un número determinado de procesos, pero no para ningún número.

¿Algunas ideas? Está bien responder con el pseudo-código, esto no es una tarea, solo un estudio personal.


Solo 2 semáforos de barrera, pero no estoy seguro ...

semaphore barr[0..1] # two semaphores: barr[0] and barr[1] semaphore excl=1 int count=0 int whichOne=0 # select semaphore to avoid race conditions barr[0]=0 #initialization barr[1]=0 # sample use int current #local for each thread wait(excl) current=whichOne count=count+1 if (count==N) int j=1 while (j<=N) signal(barr[current]) j=j+1 count=0 whichOne=1-whichOne # swap barrier to avoid race conditions signal(excl) wait(barr[current])


Usando N semáforos. No estoy muy seguro ...

semaphore barr[N] semaphore excl=1 int count=0 int i=1 while (i<=N) barr[i]=0 #initialization i=i+1 # use, each thread (tid) wait(excl) count=count+1 if (count==N) int j=1 while (j<=N) signal(barr[j]) j=j+1 count=0 signal(excl) wait(barr[tid])