Реализация N-процессного барьера с использованием семафоров
В настоящее время я готовлюсь к экзамену ОС с предыдущими итерациями, и я столкнулся с этим:
Реализуйте "N Process Barrier", то есть убедитесь, что каждый процесс из группы ожидает в определенный момент своего соответствующего выполнения, чтобы другие процессы достигли своей заданной точки.
У вас есть следующие доступные операции:
init(sem,value), wait(sem) and signal(sem)
N - произвольное число. Я могу сделать так, чтобы он работал для определенного числа процессов, но не для любого числа.
Есть идеи? Можно ответить псевдокодом, это не задание, а личное изучение.
4 ответа
Это хорошо представлено в Маленькой Книге Семафоров.
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
Используя N семафоров. Не очень уверен...
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])
Только 2 барьерных семафора, но не уверен...
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])
Я думаю, что это также должно работать, используя только один семафор (по крайней мере, если барьер не требуется для повторного использования)?
n = number of threads
barrier = Semaphore(1 - n)
barrier.signal()
barrier.wait()
barrier.signal()