تالار گفتمان مانشت
سوال مبتدی بن بست-سمافور - نسخه‌ی قابل چاپ

سوال مبتدی بن بست-سمافور - irpersian20 - 02 دى ۱۳۹۱ ۰۹:۲۰ ب.ظ

سلام

سوال مبتدی در کتاب مقسمی مطرح هست به نام بن بست در سمافور

P0
wait (s)
wait (q)
.
.
.

signal (s)
signal (q)

P1
wait (q)
wait (s)
.
.
.
signal (q)
signal (s)

چرا بن بست رخ میدهد؟ میشه بفرمائید ایا صف انتظار هم تشکیل میشود و در هر مرحله چه میشود؟s,q=1
کی و چه وقت وارد ناحیه بحرانی میشن؟
راه حل مشکل اینه که

P0
wait (s)
wait (q)


P1
wait (s)
wait (q)
میشه بفرمائید ایا صف انتظار هم تشکیل میشود و در هر مرحله چه میشود؟
خیلی ممنون از لطف دوستان

RE: سوال مبتدی بن بست-سمافور - mp1368 - 02 دى ۱۳۹۱ ۱۰:۲۳ ب.ظ

سلام .
برای قسمت اول این حالت رو در نظر بگیرید :
اول فرآیند P0 اجرا شده و فرمان Wait روی s اجرا میکنه
اگه همین لحظه وقفه بیاد و به فرآینده P1 بریم و اونم یه Wait روی q اجرا میکنه
دوباره این لحظه برگردیم به فرآیند P0 این فرآیند میخواد Wait روی q بزنه ولی چون سمافور q مقدارش صفر شده پس فرآیند P0 به حالت خواب میره .
در ادامه هم اگه به فرآیند P1 بریم اونم چون میخواد روی سمافور s فرمان Wait بزنه مث P0 به خواب میره و به این ترتیب هر دوی فرآیندها به صف انتظار منتقل و مسدود میشوند و به قول بعضی ها : خفته را خفته کی کند بیدار !!!!!!!!

اما برای قسمت دوم این مشکل پیش نمیاد مثلا اگه بخوایم مث قبلی پی بگیریم :
فرآیند P0 اجرا شده و یک Wait روی s اجرا میکنه
اگه این لحظه به فرآیند P1 سویچ کنیم چون این فرآیند هم میخواد رو سمافور s که توسط P0 قفل شده Wait بزنه پس مسدود میشه و تا زمانی که فرآیند P0 فرمان Signal رو که در پایان ناحیه بحرانیش هست نزنه اجاز بیدار شن نداره .
اگه حالات دیگه رو هم توی این کد اجرا کنیم می بینیم که به درستی کار میکنه و در هر لحظه یکی از فرآیندها در صف انتظار به سر میبره.

سوال مبتدی بن بست-سمافور - irpersian20 - 02 دى ۱۳۹۱ ۱۱:۳۴ ب.ظ

سلام دوست عزیز
تشکر از پاسخ شما
ببنیدید این کد wait است.
wait (s)
s.value=s.value-1
if s.value <0 then begin
add this process to s.l
block
end

signal (s)
s.value=s.value+1
if s.value <=0 then begin
remove a process p from s.l
wakeup (p)
end

در حالت اول p0 اول s را صفر می کند سپس p1 بعد q را صفر میکند
طبق کد درصورتی به حالت بلاک میرود که کوچکتر از ۰ شود. اما این در هر ۲ حالت شده ۰ و به بلاک نمیره .
درسته؟ یعنی wait خط دوم هر پروسس اجرا میشود یا خیر؟
قسمت دوم
p0 ابتدا s را صفر کرده و به حالت بلاک نمیرود .چون شرط بلاک مگر کوچکتر از ۰ نمی باشد؟
تکلیف q چه میشود؟
ببخشید میدونم داغونم تو این مبحث

RE: سوال مبتدی بن بست-سمافور - mp1368 - 03 دى ۱۳۹۱ ۱۲:۴۴ ق.ظ

(۰۲ دى ۱۳۹۱ ۱۱:۳۴ ب.ظ)irpersian20 نوشته شده توسط:  سلام دوست عزیز
تشکر از پاسخ شما
ببنیدید این کد wait است.
wait (s)
s.value=s.value-1
if s.value <0 then begin
add this process to s.l
block
end

signal (s)
s.value=s.value+1
if s.value <=0 then begin
remove a process p from s.l
wakeup (p)
end
در حالت اول p0 اول s را صفر می کند سپس p1 بعد q را صفر میکند
طبق کد درصورتی به حالت بلاک میرود که کوچکتر از ۰ شود. اما این در هر ۲ حالت شده ۰ و به بلاک نمیره .
درسته؟ یعنی wait خط دوم هر پروسس اجرا میشود یا خیر؟

خب تا اینجا که گفتین کد درسته و مشکل پیش نمیاد حالا از این به بعد هستش همون طوری که بالا هم گفتم مشکل پیش میاد .
۱/در حالت اول p0 اول s را صفر می کند سپس p1 بعد q را صفر میکند (تا اینجا که خودتون گفتین)
۲/دوباره P0 اجرا میشه و میخواد سمافور بعدی یعنی q رو Wait بزنه ولی میدونیم که q توسط فرآیند P1 صفر شده پس فرآیند P0 نمیتونه Wait بزنه و مسدود میشه یعنی قسمت IF دستور Wait سمافور q اجرا میشه
۳/ اگه دوباره به P1 برگردیم اونم میخواد روی s فرمان Wait بزنه که اینم توسط فرآیند P0 صفر شده و به این ترتیب P1 هم به حالت مسدود میره یعنی واسه اینم قسمت IF دستور Wait سمافور s اجرا میشه



(۰۲ دى ۱۳۹۱ ۱۱:۳۴ ب.ظ)irpersian20 نوشته شده توسط:  قسمت دوم
p0 ابتدا s را صفر کرده و به حالت بلاک نمیرود .چون شرط بلاک مگر کوچکتر از ۰ نمی باشد؟
تکلیف q چه میشود؟
ببخشید میدونم داغونم تو این مبحث

خب واسه ی این حالتم ما میدونیم که مقدار اولیه s=q=1 هستش پس فرآیند P0 به راحتی یکی از s کم میکنه و میره دستور بعدیش در این خط نیز q رو یکی کم میکنه و به راحتی وارد ناحیه بحرانیش میشه. ولی بر عکس فرآیند P1 که میخواد این دو دستور رو اجرا کنه چون مقدار هر دو سمافور توسط فرآیند P0 مقدار ۰ دارن پس فرآیند P1 به حالت مسدود میره.

**** سمافور q,s قابلیت اجرای یک دستور Wait رو دارند (چون مقدار اولیه این دو سمافور ۱ است).