2009年6月12日 星期五

OS心得系列 Critical Section --補充

知道了Critical Section的概念後,那要如何實際解決它的問題呢?可以用下面的程式碼來實作之:

a. Solution using TestAndSet:

while (true)
{
while ( TestAndSet (&lock ))
; // do nothing

// critical section

lock = FALSE;

// remainder section
}

b. Solution using Swap:

while (true)
{
key = TRUE;
while ( key == TRUE)
Swap (&lock, &key );

// critical section

lock = FALSE;

// remainder section
}

然而此類方法通常用在多CPU之系統中,若用在單CPU之系統中,則可能會很浪費CPU time,而顯得不適當,因為假如某個process執行while(TestAndSet(&lock))時,因lock為true而在此while作迴路等待時,一定會等待耗盡其所分配的CPU time slice(因為此時必定是有其他process在critical section中鎖住lock),直到目前正在critical section中之process搶到CPU繼續執行,離開critical section後,此process才有機會結束等待。

再來看看用另一方法,在單CPU系統中,其實還可以可利用Disable_Interrupt及Enable_Interrupt指令作為控制critical section執行之機制,如下圖所示:




當process 1執行Disable_Interrupt指令後,此CPU暫時不接受Interrupt(中斷)之請求,process 1之執行權就不會被別的process搶走,因此可保証process 1可一口氣執行完其critical section;而此解法只能適用在單CPU系統,在多CPU系統中,process 1執行Disable_Interrupt指令只是暫時阻斷執行process 1之CPU的中斷回應,可能另外一個CPU會在process 1執行其critical section時也同時執行process 2之critical section,再者,用此方法時,若critical section執行時間很長,須考慮是否系統會有中斷被遺失的問題。(例如,網路卡以中斷方式告知CPU封包的來臨,若中斷被阻斷太長,可能造成網路卡要求CPU之中斷訊息遺失,意味著網路卡所收的封包無法即時被CPU傳送到Memory)。

最後提供二張圖片來幫助了解Critical Section:




沒有留言:

張貼留言