سوال مبتدی بن بست-سمافور - نسخهی قابل چاپ |
سوال مبتدی بن بست-سمافور - 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 نوشته شده توسط: سلام دوست عزیز خب تا اینجا که گفتین کد درسته و مشکل پیش نمیاد حالا از این به بعد هستش همون طوری که بالا هم گفتم مشکل پیش میاد . ۱/در حالت اول p0 اول s را صفر می کند سپس p1 بعد q را صفر میکند (تا اینجا که خودتون گفتین) ۲/دوباره P0 اجرا میشه و میخواد سمافور بعدی یعنی q رو Wait بزنه ولی میدونیم که q توسط فرآیند P1 صفر شده پس فرآیند P0 نمیتونه Wait بزنه و مسدود میشه یعنی قسمت IF دستور Wait سمافور q اجرا میشه ۳/ اگه دوباره به P1 برگردیم اونم میخواد روی s فرمان Wait بزنه که اینم توسط فرآیند P0 صفر شده و به این ترتیب P1 هم به حالت مسدود میره یعنی واسه اینم قسمت IF دستور Wait سمافور s اجرا میشه (۰۲ دى ۱۳۹۱ ۱۱:۳۴ ب.ظ)irpersian20 نوشته شده توسط: قسمت دوم خب واسه ی این حالتم ما میدونیم که مقدار اولیه s=q=1 هستش پس فرآیند P0 به راحتی یکی از s کم میکنه و میره دستور بعدیش در این خط نیز q رو یکی کم میکنه و به راحتی وارد ناحیه بحرانیش میشه. ولی بر عکس فرآیند P1 که میخواد این دو دستور رو اجرا کنه چون مقدار هر دو سمافور توسط فرآیند P0 مقدار ۰ دارن پس فرآیند P1 به حالت مسدود میره. **** سمافور q,s قابلیت اجرای یک دستور Wait رو دارند (چون مقدار اولیه این دو سمافور ۱ است). |