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

تست همروندی سال ۸۵ - amin222 - 22 مهر ۱۳۹۱ ۰۳:۲۲ ب.ظ

با سلام خدمت دوستان
میخواستم نظرتون رو راجع به این تست بدونم تو کتاب مقسمی گزینه صحیح رو ۳ انتخاب کرده ولی یک حالتی وجود داره که بن بست رخ میده یعنی دو پرسس ممکنه تا ابد منتظر همدیگه بمونن نظر شما چیه. ممنونم
البته انتهای while باید یک ; میذاشتن

تست همروندی سال ۸۵ - Mohammad-A - 22 مهر ۱۳۹۱ ۰۳:۴۳ ب.ظ

چه حالتی هست به نظرتون که منجر به بن‌بست میشه؟
آخرین خط برای شرط پیشرفت نوشته شده که پس از خروج فرایندی٬ دیگری بتونه بلافاصله وارد بشه.
برای ورود به ناحیه‌ی بحرانی ۲ چیز رو هم بررسی میکنه: نوبت و اصرار فرایند.
فرضاً فرایند اول٬ Turn رو برابر با شناسه‌ی خودش میکنه. طبعاً قبل از این٬ اصرارش برای ورود به ناحیه‌ی بحرانی هم True شده.
در بدترین وضعیت فرضاً به فرایند بعدی سوئیچ میشه و اون هم پرچم اصرارش برای ورود رو به True تغییر میده. بنابراین فعلاً فرایند اول در حلقه میمونه. چون هم متغیر Turn برابر شناسه‌ی خودش هست و هم اصرار برای ورود دارد.
بالاخره به فرایند دوم سوئیچ میشه و متغیر Turn مقدارش برابر با فرایند دوم میشه٬ در نتیجه فرایند اول می‌تونه وارد ناحیه‌ی بحرانی بشه.

بن‌بست شرطش اینه که مجموعه‌ای فرایندها منتظر ایجاد رویدادی بشن که این رویداد فقط از اعضای این مجموعه میتونه اتفاق بیافته. اینجا فرایند اول منتظر میمونه در بدترین حالت٬ اما فرایند دوم به هیچ وجه در این وضعیت منتظر اولی نیست و به محض اینکه دستور بعدی رو انجام میده٬ انتظار برای فرایند اول شکسته میشه.

البته درسته که باید آخر While علامت ; باشه.

RE: تست همروندی سال ۸۵ - amin222 - 22 مهر ۱۳۹۱ ۰۷:۰۶ ب.ظ

دوست عزیز ممنونم از پاسختون
حالتی رو در نظر بگیرید که فرآیند اول کد برنامه را تا انتهای Interested[0] =true اجرا کنه بعدش کوانتمش تموم بشه حالا فرایند دوم کد رو تا خود دستور while اجرا کنه طبیعتا شرط حلقه درست میشه و پرسس دوم تو while گیر میکنه اگه اینجا بازم یه سویچ دیگه داشته باشیم و بریم سراغ پرسس اول اون موقع است که turn=0 و شرط حلقه بازم درست درمیاد و این یکی هم تو حلقه گیر میفته از الان به بعده که هر دو فرآیند توی while گیر افتادن
بازم منمونم از پاسختون.

تست همروندی سال ۸۵ - Mohammad-A - 23 مهر ۱۳۹۱ ۰۱:۴۵ ق.ظ

خب یه چیز رو در نظر نگرفتید٬ فرایند اول اگر پرچم اصرار برای ورودش رو True بکنه٬ دستور بعدیش چی هست؟ turn=process.
یعنی مقدار turn عوض میشه٬ پس فرایند اول در حلقه دور میزنه و فرایند دوم که پیش از فرایند اول turn رو به خودش نسبت داده بود٬ وارد ناحیه‌ی بحرانی میشه.
بعد از خارج شدن فرایند دوم٬ چون پرچم خودش رو false میکنه٬ بنابراین بلافاصله امکان ورود فرایند اول پیدا میشه.

تست همروندی سال ۸۵ - jafarir - 24 مهر ۱۳۹۱ ۰۹:۲۶ ق.ظ

{بالاخره به فرایند دوم سوئیچ میشه و متغیر Turn مقدارش برابر با فرایند دوم میشه٬ در نتیجه فرایند اول می‌تونه وارد ناحیه‌ی بحرانی بشه.}

اینجا یه مشکلی وجود داره و اون اینه که وقتی فرایند دوم که توش turn=1 شده بعد این موضوع اگه به فرایند اول سوئیچ نکنه ، اونوقت فرایند دوم هم میره تو حلقه و هر ۲ تا فرایند اینجا گرفتار بن بست میشن.

ولی اگه فرتیند دوم بره تو حلقه ، بعد سوئیچ بشه به فرایند اول و دوباره شرط while چک بشه ، خب اونوقت دیگه turn=0 نیست الان دیگه شده ۱ و خب طبعا شرط غلطه و وارد ناحیه ی بحرانی میشه .

منم با این پترسون مشکل داشتم ولی الان که راه شما رو دیدم فکر کنم اینی که گفتم درست باشه و دچار بن بست نشه.

یه سوال دیگه هم داشتم ،
با توجه به کد برنامه ،پروسس های p1 و p2 در صورت اجرای همروندو موازی دو پروسس زیر خروجی کدام یک از مقادیر زیر نمی تواند باشد؟

p1:
printf A
printf C
------------------------------
p2:
printf C
printf B

۱) CBCA *
۲) ACCB
۳) ACBC
۴) CABC
جوابش گزینه ۱ هست ولی اونم می تونه تولید بشه اگه اول p1 اجرا بشه A چاپ بشه بعد سوئیچ بشه به p2 و C چاپ بشه بعد B چاپ بشه تا اینجا شد ACB بعد سوئیچ بشه به p1 و C چاپ بشه تا اینجا میشه ACBC بعد دوباره بره از اول p1 شروع شه و A چاپ شه
اونوقت میشه به گزینه ۱ رسید ، من به هر ۴ تا گزینه رسیدم .
لطفا بگید چجوری ۱ جوابه؟؟؟؟؟Huh

RE: تست همروندی سال ۸۵ - amin222 - 24 مهر ۱۳۹۱ ۰۱:۳۳ ب.ظ

بازم سلام ببخشید من یک غیبت داشتم هنوزم متوجه نشدم این ظاهرا باید الگوریتم پیترسون باشه ولی شکل پیوست که گذاشتم رو ببنید میبینید که بنبست میشه گیج شدم شایدم دارم یه اشتباه خیلی ساده میکنم و متوجه نیستم اگه بازم با توجه به این شکل راهنمایی کنید ممنون میشم

(۲۴ مهر ۱۳۹۱ ۰۹:۲۶ ق.ظ)jafarir نوشته شده توسط:  یه سوال دیگه هم داشتم ،
با توجه به کد برنامه ،پروسس های p1 و p2 در صورت اجرای همروندو موازی دو پروسس زیر خروجی کدام یک از مقادیر زیر نمی تواند باشد؟

p1:
printf A
printf C
------------------------------
p2:
printf C
printf B

۱) CBCA *
۲) ACCB
۳) ACBC
۴) CABC
جوابش گزینه ۱ هست ولی اونم می تونه تولید بشه اگه اول p1 اجرا بشه A چاپ بشه بعد سوئیچ بشه به p2 و C چاپ بشه بعد B چاپ بشه تا اینجا شد ACB بعد سوئیچ بشه به p1 و C چاپ بشه تا اینجا میشه ACBC بعد دوباره بره از اول p1 شروع شه و A چاپ شه
اونوقت میشه به گزینه ۱ رسید ، من به هر ۴ تا گزینه رسیدم .
لطفا بگید چجوری ۱ جوابه؟؟؟؟؟Huh

دوست عزیز راجع به قسمت دوم سوال فکر کنم خروجی رو دارین برعکس میخونید اگه از چپ به راست بخونید میبینید CBCA
قابل تولید نیست چطور?چون اول c چاپ شده پس p2 اجرا شده و کامل هم اجرا شده چون بلافاصله بعده حرف c حرف b اومده
پس فقط اجرای کامل p2 که میتونه چنین خروجی بده حالا که p2 تموم شد نوبت p1 که باید ac رو تولید کنه ولی گزینه یک عکس اینو تولید کرده

تست همروندی سال ۸۵ - javadem - 24 مهر ۱۳۹۱ ۰۲:۰۹ ب.ظ

فکر میکنم شما دنبال بنبست توی این حلقه ها هستید در صورتی که نه این اتفاق نمیوفته. زمانی که شما میگید بن بست رخ داده turn=0 است و از آنجا که turn متغیری عمومیست در فراخوانی دیگر نیز تغییر میکند و موجب میشود که شرط while نقض شود و پروسه وارد ناحیه بحرانی شود و تا وقتی که از این ناحیه خارج نشود و interest خودش رو false نکنه پروسه دیگر نمیتونه وارد ناحیه بحرانی بشه. به نظر من که گزینه ۳ صحیح هست. شرط حلقه هم طوریست که یه پروسه در صورتی که پروسه دیگری هم بخواد وارد شه نمیتونه چند بار پشت هم وارد ناحیه بحرانی بشه و اجازه ورد به پرسه دیگر نده، پس گرسنگی هم نداره.

RE: تست همروندی سال ۸۵ - amin222 - 24 مهر ۱۳۹۱ ۰۳:۲۷ ب.ظ

(۲۴ مهر ۱۳۹۱ ۰۲:۰۹ ب.ظ)javadem نوشته شده توسط:  فکر میکنم شما دنبال بنبست توی این حلقه ها هستید در صورتی که نه این اتفاق نمیوفته. زمانی که شما میگید بن بست رخ داده turn=0 است و از آنجا که turn متغیری عمومیست در فراخوانی دیگر نیز تغییر میکند و موجب میشود که شرط while نقض شود و پروسه وارد ناحیه بحرانی شود و تا وقتی که از این ناحیه خارج نشود و interest خودش رو false نکنه پروسه دیگر نمیتونه وارد ناحیه بحرانی بشه. به نظر من که گزینه ۳ صحیح هست. شرط حلقه هم طوریست که یه پروسه در صورتی که پروسه دیگری هم بخواد وارد شه نمیتونه چند بار پشت هم وارد ناحیه بحرانی بشه و اجازه ورد به پرسه دیگر نده، پس گرسنگی هم نداره.

واقعا مرسی عزیز فهمیدم اشکال کارم کجاست ای بابا خودم خندم گرفت هی با خودم میگم مگه ممکنه الگوریتم به این معرفی مشکل داشته باشه من میدونستم turn متغیر سراسری ولی بقول شما داشتم دنبال وقوع بنبست میگشتم اگه واسه یه لحظه هم هر دو تو while گیر کنن با یه سویچ دیگه یکشون شرط while رو نقض میکنه و وارد c.s میشه دوست عزیز واقعا ممنونم از راهنماییت

تست همروندی سال ۸۵ - jafarir - 24 مهر ۱۳۹۱ ۰۸:۰۷ ب.ظ

دوست عزیز راجع به قسمت دوم سوال فکر کنم خروجی رو دارین برعکس میخونید اگه از چپ به راست بخونید میبینید CBCA
قابل تولید نیست چطور?چون اول c چاپ شده پس p2 اجرا شده و کامل هم اجرا شده چون بلافاصله بعده حرف c حرف b اومده
پس فقط اجرای کامل p2 که میتونه چنین خروجی بده حالا که p2 تموم شد نوبت p1 که باید ac رو تولید کنه ولی گزینه یک عکس اینو تولید کرده
[/quote]

سلام ، نمیشه خروجی یه قسمتی از یه رشته باشه؟
اگر اینطور بشه ،خب همشون تو خروجی در میاد دیگه، در ضمن ترتیب اینا از چپ به راسته
ممنون