PDA

View Full Version : ناحیه بحراین با استفاده از روش تناوب محض



علی سبزقبایی
دوشنبه 14 اردیبهشت 1388, 20:45 عصر
در کتاب تنن باوم این الگوریتم رو داده اما نمیدونم چه طوری باید استفاده کرد اگر من رو راهنمایی کنید ممنون میشم


[LEFT]procress A

while(true) {
while(turn !=o) /*loop*/;
critical_region();
turn =1;
noncritical_region()l;
}



Procress B


[CODE]while(true) {
while(turn !=1) /*loop*/;
critical_region();
turn =1;
noncritical_region()l;

pesar irooni
سه شنبه 15 اردیبهشت 1388, 03:21 صبح
کلید این الگوریتم متغیر مشترک turn هست که مثل یه کلید یا برگ برندست که با استفاده از اون پردازشهای همروند تو ناحیه بحرانی یا مشترک بطور همزمان وارد نمیشند. یعنی شرط mutual exclusion برقرار میشه.
وقتی پردازش A داره اجرا میشه قبل از ورود به ناحیه بحرانی چک میکنه که ببینه متغیر turn با عددش که همون 1 برابره یا نه. اگه turn = 0 باشه یعنی پردازش B داره تو ناحیه بحرانی کار میکنه. پس صبر میکنه تا کارش تموم شه. وقتی کار B تموم شد کلید رو به A میده یعنی turn = 1 میکنه تا A بتونه در صورت نیاز وارد ناحیه بحرانی بشه.
اما همونطور که تو کتا تننباوم گفته این الگوریتم یه مشکل بزرگ داره و شروط 4 گانه رو رعایت نمیکنه و اونم اینه اگه B با سرعت مثلا 1000 برابر A کار کنه وقتی از ناحیه بحرانی اومد بیرون و کلید رو به A داد دیگه نمیتونه ازش پس بگیره و باید منتظر بمونه تا A آروم آروم کارش رو بکنه و وقتی کارش تموم شد کلید رو یه B بده یعنی turn =0 کنه که شما اشتباها نوشتی turn = 1. تا جایی که یادمه به این حالت ناخوشایند میگند انتظار نامحدود.

علی سبزقبایی
چهارشنبه 16 اردیبهشت 1388, 02:02 صبح
یعنی توی یک برنامه دوتا دستور وارد کنم طوری که هر دو به یک نقطه برن و ناحیه بحرانی ایجاد کنن؟!!

علی سبزقبایی
چهارشنبه 16 اردیبهشت 1388, 19:40 عصر
دوست عزیز کمی بیشتر در مورد طرز نوشتین این برنامه بدین که با چه زبانی باید نوشته بشه و..

whitehat
چهارشنبه 16 اردیبهشت 1388, 19:53 عصر
دوست عزیز یک تاپیک کامل در این مورد داریم،بهتره قبل از هر چیز آن (http://barnamenevis.org/forum/showthread.php?t=57969)را خوب بخوانید
برای اجرای کد میتوانید از شبیه سازی مثل Baci استفاده کنید که در همان تاپیک در مورد آن کامل توضیح داده شده.

pesar irooni
چهارشنبه 16 اردیبهشت 1388, 23:19 عصر
ببینید ما دوتا پردازش داریم که بطور همزمان دارند اجرا میشند و روی یه سری متغیرها که global یا مشترک هستند تغییرات ایجاد میکنند. این ناحیه اسمش Critical Section هست که برای اینکه هردو برنامه باهم یک متغیر رو تغییر ندهند(که اگه بدند نتایج نادرستی تولید میکنه) از این روش استفاده میکنیم. یعنی حلقه انتظار یا busy waiting