2015-06-19 63 views
-1

在有人問我採訪的一個...信號燈隊列如何保護與多線程

Wait(semaphore sem) {       
    DISABLE_INTS 
    sem.val-- 
    if (sem.val < 0){ 
     add thread to sem.L 
     block(thread) 
    } 
ENABLE_INTS 

以上是信號燈等待執行(從其他線程複製)。 當多個線程嘗試入隊時(當它們無法獲得鎖定時),如何保護隊列sem.L?更新隊列之前我們是否鎖定?

回答

1

這是一個只有一個核心的系統的實現。通過在關鍵部分禁用中斷來管理併發。這就是代碼中的「DISABLE_INTS」和「ENABLE_INTS」。

除非您正在面試爲單核系統開發多任務操作系統代碼的職位,否則這是一個奇怪的問題。也許面試官希望你提出有關代碼的問題,看看你能否理解在什麼情況下這是有道理的。

只有在此核心或其他核心上運行代碼時纔會發生衝突。由於只有一個核心,唯一可能的衝突是代碼運行在這種關懷之上。這將需要上下文切換。

上下文切換有兩種形式,自願和非自願。當代碼明確要求一個時,就會發生自願的上下文切換。此代碼不要求上下文切換,所以這不是問題。非自願的上下文切換隻能由中斷觸發,並且此代碼禁用其臨界區域中的中斷。這是在單核系統的內核代碼中實現「鎖」的典型方式。

+0

對不起......我的問題是,當我們沒有得到鎖,我們嘗試將調用過程添加到隊列中。該隊列如何同步。我們是否爲該隊列加鎖? –

+1

大衛已經解釋過了。只有一個核心,禁止中斷,不需要鎖定,因爲代碼不會被中斷,然後重新進入。我不明白David的答案,你需要一些計算機體系結構和操作系統內核功能的進一步知識。 –

+0

@SureshChowta它與來自其他內核的訪問同步,因爲沒有其他內核。它通過禁止中斷與其他代碼在同一內核上運行同步 - 禁止中斷,不可能發生上下文切換,因爲只有中斷可觸發非自願的上下文切換。瞭解這一點需要了解如何在低級別管理併發性 - 而不是沒有內核編碼經驗的典型程序員的知識。問一個不需要內核開發知識的人是一個不好的問題。 –