۰
subtitle
ارسال: #۱
  
تمرین ۵ فصل ۵ استالینگز
[/align]تو را به خدا حواب بدید جند تا موضوع گداشتم کسی جواب نداده
چرا کد زیر انحصار متقابل را نقض می کند
چرا کد زیر انحصار متقابل را نقض می کند
[bool blocked[2];
int turn;
void p (int id)
{
while(true)
{
blocked[id] = true;
while(turn <> id)
{
while(blocked[i-id])
turn = id;
}
critical section
blocked[id] =false;
remainder
}
}
int turn;
void p (int id)
{
while(true)
{
blocked[id] = true;
while(turn <> id)
{
while(blocked[i-id])
turn = id;
}
critical section
blocked[id] =false;
remainder
}
}
۰
ارسال: #۲
  
RE: تمرین ۵ فصل ۵ استالینگ
چقدر سخت، فکر کنم نیم ساعت طول کشید که بفهمم. البته اگر درست فهمیده باشم.
سناریویی که به نقض انحصار متقابل می انجامه می تونه اینطوری باشه:
فرض کنین که مقدار turn = 0 باشه و هر دو فرایند در قسمت غیر بحرانی (remainder) خودشون باشن. یعنی فرایند ۱ وارد قسمت بحرانی شده باشه و پس از خروج در قسمت غیر بحرانی خودش CPU به فرایند ۰ داده بشه و فرایند ۰ وارد قسمت بحرانی خودش شده باشه و در قسمت غیر بحرانی فرایند ۰ CPU به فرایند ۱ برگشته باشه.
با فرض طولانی بودن قسمت غیر بحرانی فرایند ۱ این فرایند می تونه به ابتدای حلقه While بیرونی برگرده و blocked[1] = true بکنه و وارد حلقه داخلی شده و قبل از turn = id زمانبند به فرایند ۰ سوئیچ کنه. توجه کنین که هنوز مقدار turn تغییر داده نشده و هنوز همون ۰ هست.
حالا فرایند ۰ به ابتدای حلقه بیرونی برگرده و در زمان چک کردن شرط حلقه داخلی (یعنی turn != id) اون رو بصورت ۰ != ۰ ببینه (که false هست) و بدون وارد شدن به حلقه داخلی وارد ناحیه بحرانی خودش (فرایند ۰) بشه و در ناحیه بحرانی زمانبند به فرایند ۱ سوئیچ بکنه. که فرایند یک هم که در خط انتهایی حلقه داخلی بوده از اون خارج میشه و وارد ناحیه بحرانی میشه. و اینجاست که انحصار متقابل نقض می گردد.
سناریویی که به نقض انحصار متقابل می انجامه می تونه اینطوری باشه:
فرض کنین که مقدار turn = 0 باشه و هر دو فرایند در قسمت غیر بحرانی (remainder) خودشون باشن. یعنی فرایند ۱ وارد قسمت بحرانی شده باشه و پس از خروج در قسمت غیر بحرانی خودش CPU به فرایند ۰ داده بشه و فرایند ۰ وارد قسمت بحرانی خودش شده باشه و در قسمت غیر بحرانی فرایند ۰ CPU به فرایند ۱ برگشته باشه.
با فرض طولانی بودن قسمت غیر بحرانی فرایند ۱ این فرایند می تونه به ابتدای حلقه While بیرونی برگرده و blocked[1] = true بکنه و وارد حلقه داخلی شده و قبل از turn = id زمانبند به فرایند ۰ سوئیچ کنه. توجه کنین که هنوز مقدار turn تغییر داده نشده و هنوز همون ۰ هست.
حالا فرایند ۰ به ابتدای حلقه بیرونی برگرده و در زمان چک کردن شرط حلقه داخلی (یعنی turn != id) اون رو بصورت ۰ != ۰ ببینه (که false هست) و بدون وارد شدن به حلقه داخلی وارد ناحیه بحرانی خودش (فرایند ۰) بشه و در ناحیه بحرانی زمانبند به فرایند ۱ سوئیچ بکنه. که فرایند یک هم که در خط انتهایی حلقه داخلی بوده از اون خارج میشه و وارد ناحیه بحرانی میشه. و اینجاست که انحصار متقابل نقض می گردد.
ارسال: #۳
  
RE: تمرین ۵ فصل ۵ استالینگ
(۳۰ دى ۱۳۹۰ ۰۱:۱۶ ق.ظ)shervinrs نوشته شده توسط: چقدر سخت، فکر کنم نیم ساعت طول کشید که بفهمم. البته اگر درست فهمیده باشم.
سناریویی که به نقض انحصار متقابل می انجامه می تونه اینطوری باشه:
فرض کنین که مقدار turn = 0 باشه و هر دو فرایند در قسمت غیر بحرانی (remainder) خودشون باشن. یعنی فرایند ۱ وارد قسمت بحرانی شده باشه و پس از خروج در قسمت غیر بحرانی خودش CPU به فرایند ۰ داده بشه و فرایند ۰ وارد قسمت بحرانی خودش شده باشه و در قسمت غیر بحرانی فرایند ۰ CPU به فرایند ۱ برگشته باشه.
با فرض طولانی بودن قسمت غیر بحرانی فرایند ۱ این فرایند می تونه به ابتدای حلقه While بیرونی برگرده و blocked[1] = true بکنه و وارد حلقه داخلی شده و قبل از turn = id زمانبند به فرایند ۰ سوئیچ کنه. توجه کنین که هنوز مقدار turn تغییر داده نشده و هنوز همون ۰ هست.
حالا فرایند ۰ به ابتدای حلقه بیرونی برگرده و در زمان چک کردن شرط حلقه داخلی (یعنی turn != id) اون رو بصورت ۰ != ۰ ببینه (که false هست) و بدون وارد شدن به حلقه داخلی وارد ناحیه بحرانی خودش (فرایند ۰) بشه و در ناحیه بحرانی زمانبند به فرایند ۱ سوئیچ بکنه. که فرایند یک هم که در خط انتهایی حلقه داخلی بوده از اون خارج میشه و وارد ناحیه بحرانی میشه. و اینجاست که انحصار متقابل نقض می گردد.
با تشکر از جوابتان مطالبی را که گفتید متوجه شدم ولی با قسمتی که ذز بالا زیر ان خط کشیدهام مشکل دارم زمانی که وقت cpu دوباره به فرایند ۱ برمی گردد و turn = id می شود فرایند ۱ در جلقه while(blocked(1-id)) گیر می افتد زیرا فرایند ۰ قبل از ورود به ناحیه بحرانی blocked[0] = true کرده است و با این وضغ تا زمانی که فرایند ۰ از ناحیه بحرانی خارح نشده و blocked[0] را false نکند فرایند ۱ در جلقه while(blocked(1-id)) همجنان می ماند
نظر شما چیست
۰
ارسال: #۴
  
RE: تمرین ۵ فصل ۵ استالینگ
turn = id در حلقه [tex]while(blocked[1-id])[/tex] نیست.
زمانی که دوباره CPU به فرایند ۱ بر می گرده turn = 1 میشه و فرایند به ابتدای [tex]while (id <> turn)[/tex] بر می گرده و چون id = turn هست دیگه شرط while درست نیست و از while خارج میشه. یعنی اصلا دیگه سراغ [tex]while(blocked[1-id])[/tex] نمیره.
زمانی که دوباره CPU به فرایند ۱ بر می گرده turn = 1 میشه و فرایند به ابتدای [tex]while (id <> turn)[/tex] بر می گرده و چون id = turn هست دیگه شرط while درست نیست و از while خارج میشه. یعنی اصلا دیگه سراغ [tex]while(blocked[1-id])[/tex] نمیره.
ارسال: #۵
  
RE: تمرین ۵ فصل ۵ استالینگ
(۰۱ بهمن ۱۳۹۰ ۰۵:۴۹ ب.ظ)shervinrs نوشته شده توسط: turn = id در حلقه [tex]while(blocked[1-id])[/tex] نیست.
زمانی که دوباره CPU به فرایند ۱ بر می گرده turn = 1 میشه و فرایند به ابتدای [tex]while (id <> turn)[/tex] بر می گرده و چون id = turn هست دیگه شرط while درست نیست و از while خارج میشه. یعنی اصلا دیگه سراغ [tex]while(blocked[1-id])[/tex] نمیره.
با تشکر از جوابتان ببخشید من بد نوشتم در تمرین مذکور turn = id در حلقهwhile(blocked[1-id)] قرار دارد
۰
ارسال: #۷
  
RE: تمرین ۵ فصل ۵ استالینگ
Can I see some ID?
Feeling left out?
نگران نباش، فقط روی این لینک برای ثبت نام کلیک کن. رمزت رو فراموش کردی؟ اینجا به یادت میاریم! close