2017-03-17 56 views
2

爲了出示擔保界等待的測試和設置指令,下面是操作系統的書,高爾文給出的代碼 - :界等待測試和設置指令

 do { 
    1   waiting[i] = true; 
    2   while (waiting[i] && test_and_set(&lock)) ; 
    3   waiting[i] = false; 

    /* critical section */ 

    4   j = (i + 1) % n; 
    5   while ((j != i) && !waiting[j]) 
    6   j = (j + 1) % n; 
    7   if (j == i) 
    8   lock = false; 
    9   else 
    10   waiting[j] = false; 

    /* remainder section */ 
     } while (true); 

我得到的完整代碼,並得出結論該

的方法P_I將是在臨界段如果任 等待[I] =假或test_and_set(&鎖)= FALSE,其確保鎖定是FALSE先前。因此退出部分要麼正在等待[j],要麼鎖定爲FALSE。

但我已經得到了一些doubts-:

  1. 如果出口段段發現同樣的過程再次關鍵部分請求即

    if j==i 
    

然後根據代碼,該過程必須從行號2開始執行,即將執行

 test_and_set(&lock)) 
在同時

循環,找到test_and_set(&鎖))爲假,然後移動到關鍵section.My疑問的返回值是,如果同樣的過程要在關鍵的部分,是有必要啓動其exection直接從2號線

2.Now我想要做如下的置換,並要檢查的可能outcome.i要交換行號8和10

  • 的行數8,如果我做

    waiting[j]=false; 
    

    然後它也會移動到臨界區,即使現在lock = true。

  • 的行數10,如果我做

    鎖=假

    那麼也它(過程p_j)將移動到臨界區,即使等待

    [i] =真,我認爲這將是更好因爲行號3將在while循環由於test_and_set(&鎖定)= false而中斷之後分配waiting [i] = false。 在另一方面,如果我有這樣的變化過程必須執行test_and_set(&鎖)這是費時

是我點2的假設嗎?

點1的正確原因是什麼?

感謝

+0

此代碼無意義。必須有其他部分。 – user3344003

+0

@ user3344003你能否提一下行號? – sourav

+1

@ user3344003檢查此問題http://stackoverflow.com/questions/31084724/bounded-waiting-mutual-exclusion-with-test-and-set – sourav

回答

0

關於點1

我的疑問是,如果同樣的過程要在關鍵的部分,是 有必要直接從2號線

啓動其exection

一個進程基本上是一個正在執行的程序。一個進程不能跳過選擇下一個要執行的指令。控制流程決定。的代碼(其是過程本身)的控制表明,如果一個進程成功地輸入臨界區,並再次想進入臨界區,那麼它將首先執行lines 4 to 10,然後執行其餘部分和必須從右邊線1

開始執行關於你的點現在2

我娃NT做如下的置換和要檢查的可能 outcome.i要交換行號8和10

如果換行,有界等待條件將不復存在。

證明

假設只有1過程P(i)提出的要求訪問臨界區併成功進入。所以

lock = true and waiting[i] = true 

因爲只有這樣它才能夠出來for循環。現在,它開始從line 4

則J執行需要以下值:

i + 2 , i + 3, ......0 , 1 , 2 , 3 , 4....i 

周圍值的包裹發生是因爲運算符%的。而且由於沒有其他工藝製成的請求進入關鍵部分waiting[j] = falsej != i

因此條件while ((j != i) && !waiting[j])變爲假時j等於i,現在我們正處於line 7。新的代碼是:

if (j == i) 
    waiting[j] = false; 
else 
    lock = false; 

現在,如果任何進程使得進入關鍵部分的請求,然後while (waiting[i] && test_and_set(&lock)) ;將始終評估爲true因爲lock is truewaiting[i]true一下子就被卡在自旋鎖。沒有進展。

+0

@:Summet謝謝你對第1點的澄清,但是對於第2點你已經寫了> lock = true並且等待[i] = true,我同意lock = true,但是wating [i] = true?我沒有看到任何使「wating [i] = true」的行。 – sourav

+0

@sourav等待[i] =真,因爲第1行。任何希望進入臨界區的進程P(i)都必須經過第1行。其簡單,因爲 –

+0

@:Sumeet「假設只有1個進程P (i)提出訪問關鍵部分的請求,並且它**已成功輸入**。「,我在這裏懷疑如果一個進程P_i已經成功進入了CS,那麼根據第3行Waiting [i] = false。 – sourav