زمان کنونی: ۰۷ اردیبهشت ۱۴۰۳, ۱۰:۵۳ ق.ظ مهمان گرامی به انجمن مانشت خوش آمدید. برای استفاده از تمامی امکانات انجمن می‌توانید عضو شوید.
گزینه‌های شما (ورودثبت نام)

سوال مبتدی بن بست-سمافور

ارسال:
  

irpersian20 پرسیده:

سوال مبتدی بن بست-سمافور

سلام

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

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)
میشه بفرمائید ایا صف انتظار هم تشکیل میشود و در هر مرحله چه میشود؟
خیلی ممنون از لطف دوستان
نقل قول این ارسال در یک پاسخ

۰
ارسال:
  

mp1368 پاسخ داده:

RE: سوال مبتدی بن بست-سمافور

سلام .
برای قسمت اول این حالت رو در نظر بگیرید :
اول فرآیند 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 پاسخ داده:

سوال مبتدی بن بست-سمافور

سلام دوست عزیز
تشکر از پاسخ شما
ببنیدید این کد 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 چه میشود؟
ببخشید میدونم داغونم تو این مبحث
نقل قول این ارسال در یک پاسخ

ارسال:
  

mp1368 پاسخ داده:

RE: سوال مبتدی بن بست-سمافور

(۰۲ دى ۱۳۹۱ ۱۱:۳۴ ب.ظ)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 رو دارند (چون مقدار اولیه این دو سمافور ۱ است).
یافتن تمامی ارسال‌های این کاربر
نقل قول این ارسال در یک پاسخ



موضوع‌های مرتبط با این موضوع...
موضوع: نویسنده پاسخ: بازدید: آخرین ارسال
  آموزش مکالمه زبان انگلیسی برای مبتدی ها + مکالمه وحشتناک واقعی cyruskingsolomon ۰ ۱,۷۰۲ ۲۸ فروردین ۱۴۰۰ ۰۲:۵۸ ب.ظ
آخرین ارسال: cyruskingsolomon
  بن بست کامپیوتر ۹۵ Hopegod ۱۶ ۱۲,۷۹۸ ۰۱ اردیبهشت ۱۳۹۷ ۰۸:۴۹ ب.ظ
آخرین ارسال: mahshid_dd
  بن بست mmm1374 ۱ ۱,۶۲۸ ۱۴ اسفند ۱۳۹۵ ۰۴:۱۸ ب.ظ
آخرین ارسال: arash691
  بن بست IT95 Never.forget ۱ ۱,۵۸۹ ۱۳ دى ۱۳۹۵ ۰۸:۵۸ ب.ظ
آخرین ارسال: husen
  بن بست irpersian20 ۰ ۱,۴۸۱ ۳۱ اردیبهشت ۱۳۹۴ ۱۲:۵۵ ق.ظ
آخرین ارسال: irpersian20
  علت عدم بن بست در قفل گذاری درختی --masumeh ۱ ۲,۳۸۶ ۱۲ بهمن ۱۳۹۳ ۰۸:۳۸ ب.ظ
آخرین ارسال: zibaziba
  سوال در مورد بن بست tm.viper ۱۳ ۵,۹۶۹ ۱۱ بهمن ۱۳۹۳ ۰۵:۵۹ ب.ظ
آخرین ارسال: mostafa2012
  بن بست مهندسی کامپیوتر ۹۱ bluebaran ۲ ۲,۲۶۸ ۱۰ بهمن ۱۳۹۳ ۰۶:۱۷ ب.ظ
آخرین ارسال: bluebaran
  بررسی سوالی در رابطه با بن بست gogooli ۱ ۱,۶۸۷ ۰۹ بهمن ۱۳۹۳ ۰۶:۴۳ ب.ظ
آخرین ارسال: tm.viper
  سوال ۷۶ سال ۸۵(بن بست) gogooli ۴ ۲,۲۹۰ ۰۶ بهمن ۱۳۹۳ ۰۷:۵۱ ب.ظ
آخرین ارسال: gogooli

پرش به انجمن:

Can I see some ID?

به خاطر سپاری رمز Cancel

Feeling left out?


نگران نباش، فقط روی این لینک برای ثبت نام کلیک کن. رمزت رو فراموش کردی؟ اینجا به یادت میاریم! close

رمزت رو فراموش کردی؟

Feeling left out?


نگران نباش، فقط روی این لینک برای ثبت نام کلیک کن. close