2011-04-22 70 views
4

對於單處理器實現的,鎖算法是非常簡單的。如何鎖在多個內核上

Lock(threadID) { 
    Disable Interrupts 
    If lock is already owned by same thread{ 
    Restore Interrupts 
    return 
    } 
    if lock is free { 
    make lock busy 
    set current thread as the owner of the lock 
    } 
    else { 
    add threadID to the lock queue. 
    } 
    Restore Interrupts 
    return 
} 

但我們如何在多處理器/多核系統中實現此代碼。如果2個內核/ proc試圖給同一個鎖定不同的進程,該怎麼辦?

回答

1

互斥通常與atomic operations在單個存儲器值來實現。例如,一個鎖可以是一個單詞,在0時是空閒的,當被鎖定時爲1。獲取鎖,處理器將鎖定存儲器總線(所以沒有其它的處理器可以讀取或寫入到存儲器),讀出的字的最高電流值,將其設置爲1如果是0,和解鎖存儲器總線。要解鎖,該單詞可以設置爲0

這是一個簡單的例子,並沒有解決時,鎖定發生衝突會發生什麼。不同的操作系統處理使用不同的機制。 Linux使用一種叫做futexes的東西。我不確定Windows或Mac做什麼。

儘管您發佈的算法是正確的,非內核代碼無法禁用CPU中斷,所以用戶空間代碼將趨於甚至在單核使用原子操作。

+0

只能用原子操作完成,還是需要系統調用(禁用中斷)? – Lee 2016-03-24 19:25:10

0

我說考慮一下鎖的最簡單方法是原子交換指令。以下獲得鎖X.

 
LOCK: 
    set RegisterA = 1 
    Atomic_Exchange(X, RegisterA) //runs such that no other thread can work with X 
    if RegisterA == 1: 
    Means X was 1 when I esecuted the exchange thus someone else has the lock 
    Since I do not have the lock, goto LOCK 
    else: 
    If A is zero, it means I was the first one to set X to 1, which means I own the lock 

UNLOCK: 
    X = 0 

原子交換存在於大多數計算機中。 Intel的x86有一個EXCHG指令。只是供參考,Intel的x86還有一個比較和交換指令,它負責處理採集以及比較。基本上,不是先進行交換,然後用軟件進行測試,它使用硬件,只有在X == 0開始時才進行交換。這節省了對變量X的額外寫入,從而減少了X的高速緩存未命中,從而提高了性能。