2014-12-19 21 views
6

查看這個示例信號量實現(對於SMP系統),我瞭解多處理器原子檢查需要測試和設置。但是,一旦我們添加原子檢查不是禁用中斷多餘?無論如何,禁用中斷只能通過一個處理器提供原子性。信號量隊列的添加也需要保護。信號量實現:爲什麼要在測試和設置的同時禁用中斷?

class semaphore { 
private int t; 
private int count; 
private queue q; 

public semaphore(int init) 
{ 
    t = 0; 
    count = init; 
    q = new queue(); 
} 

public void P() 
{ 
    Disable interrupts; 
    while (TAS(t) != 0) { /* just spin */ }; 
    if (count > 0) { 
     count--; 
     t = 0; 
     Enable interrupts; 
     return; 
    } 
    Add process to q; 
    t = 0; 
    Enable interrupts; 
    Redispatch; 
} 

public V() 
{ 
    Disable interrupts; 
    while (TAS(t) != 0) { /* just spin */ }; 
    if (q == empty) { 
     count++; 
    } else { 
     Remove first process from q; 
     Wake it up; 
    } 
    t = 0; 
    Enable interrupts; 
} 

}

+1

這是一個家庭作業問題,要求Stack Overflow做作業。請參閱「_pages.cs.wisc.edu/~bart/537/lecturenotes/s10.html代碼來自哪裏(除了使用測試和設置?_」,我們還需要禁用中斷嗎?可能)。這個問題目前不符合http://stackoverflow.com/help/on-topic:「_Questions要求作業幫助必須包括你迄今爲解決問題所做的工作的總結,以及難度的描述你正在解決它_「 – xmojmr 2014-12-19 11:50:36

+0

謝謝,@ xmojmr - 我只是考慮回答這個問題。現在它下降/關閉。 – 2014-12-19 11:51:31

+2

這個問題似乎是脫離主題,因爲它是關於作業轉儲。 – 2014-12-19 11:51:54

回答

7

雖然這是事實,車削中斷關閉在一個處理器上是不足以保證在多處理器系統(因爲,你提到,在其它處理器的線程仍然可以訪問共享資源原子存儲器訪問),我們關閉了部分多處理器信號量實現的中斷,因爲我們不想在我們正在進行測試和設置時進行計劃。

如果一個線程持有測試和集合被取消調度,那麼線程在睡着的時候(這不好),沒有其他線程可以對信號量做任何事情(因爲它的計數受該測試和集合的保護)。爲了確保不會發生這種情況,我們將在使用測試和設置時關閉處理器上的中斷。

+0

安妮 - 首先感謝回答這個問題(它幾乎已經死了)。你的回覆非常有道理。儘管如此,即使線程在設置t = 0(解鎖自旋鎖)之前進入睡眠狀態,其他線程在嘗試訪問信號時仍會繼續旋轉。這對性能來說是非常糟糕的,因爲它會導致浪費的週期,但它仍然是一個正確的(儘管可怕的)解決方案,因爲沒有狀態因任何競爭條件而被破壞。如果我錯了,請糾正我,即禁用中斷對性能至關重要,而不是正確性。 – user110036 2015-02-21 08:59:03

+1

你是對的 - 保持中斷不會引入任何同步問題,這隻會導致性能下降。 – 2015-02-22 14:09:46

+0

太棒了。感謝您的回覆和澄清:) – user110036 2015-02-23 07:53:26

相關問題