تنفيذ حاجز عملية N باستخدام الإشارات
-
27-10-2019 - |
سؤال
أنا أتدرب حاليًا لامتحان نظام التشغيل مع التكرارات السابقة وقد عثرت على ما يلي:
تنفيذ "حاجز عملية" ، أي ، التأكد من أن كل عملية من مجموعة منهم تنتظر ، في مرحلة ما من تنفيذها ، للعمليات الأخرى للوصول إلى نقطة معينة.
لديك OPS التالية متاحة:
init(sem,value), wait(sem) and signal(sem)
N هو رقم تعسفي.يمكنني أن أجعله يعمل لعدد معين من العمليات، ولكن ليس لأي عدد.
أيه أفكار؟لا بأس في الرد بالرمز الزائف، فهذه ليست مهمة، إنها مجرد دراسة شخصية.
المحلول
يتم تقديم هذا بشكل جيد في كتاب الإشارات الصغيرة.
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])
لا تنتمي إلى StackOverflow