PDA

View Full Version : سوال: الگوریتم بیکر



m_moshref
شنبه 30 خرداد 1388, 20:08 عصر
با سلام خدمت دوستان عزیز
یه سوال در مورد الگوریتم بیکر که در کتاب استالینگ برای کنترل ناحیه بحرانی مطرح شده دارم
الگوریتم به صورت زیر:
boolean choosing[n];
int number[n];
while (true) {
choosing[i] = true;
number[i] = 1 + getmax(number[], n);
choosing[i] = false;
for (int j = 0; j < n; j++){
while (choosing[j]) { };
while ((number[j] != 0) && (number[j],j) < (number[i],i)) { };
}
/* critical section */;
number [i] = 0;
/* remainder */;
}
البته یک نوتیشن هم داره و در مورد این عبارته
(number[j],j) < (number[i],i)
که به صورت زیر تعریف شده
(a,b) < (c,d) is defined as (a< c)or (a= cand b< d)
حالا سوال من درمورد حلقه زیر:
while (choosing[j]) { };
کاربرد این حلقه چیست؟
باتشکر

Mbt925
دوشنبه 01 تیر 1388, 16:38 عصر
كافيه الگوريتم رو به دقت بررسي كنيد.

وقتي فرآيندي در حال تخصيص انديس به خودش باشه، در حالتي خاص از اجراي فرآيند ها، تداخل ايجاد ميشه و
دو فرآيند مي تونن همزمان وارد بشن.

به همين دليل، وقتي فرآيندي در حال تخصيص انديس به خودشه، بقيه صبر مي كنن تا كارش تموم بشه.

لذت اين قضيه به اينه كه خودتون كامل تحليلش كنيد و به ضعفش پي ببريد، به همين دليل دقيقا دنباله اي از فرآيند ها + ‌ترتيب اجراي خطوط رو كه باعث ايجاد مشكل ميشه رو نگفتم.

m_moshref
سه شنبه 02 تیر 1388, 18:27 عصر
از جواب شما خیلی ممنونم ولی بهتره سوالمو دقیقتر بپرسم

آرایه choosing فقط یه جا مقدار تورو میگیره که اونجا هم یک خط بعدش سریع فالس میشه پس حلقه

While(choosing [j])

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

Mbt925
چهارشنبه 03 تیر 1388, 10:18 صبح
مشکل دقیقا هنگام انتخاب اندیس برای فرآیند پیش میاد.

درست و دقیق بررسی کنید.