2012-08-14 54 views
1

我有以下代碼:如何實現鎖定?

while(lock) 
     ; 
lock = 1; 
// critical section 
lock = 0; 

作爲讀取或改變鎖值本身是一種多指令

read lock 
change value 
write it 

如果它發生像:

1) One thread reads the lock and stops there 
2) Another thread reads it and sees it is free; lock it and do something untill half 
3) First thread wakes up and goes into CS 

SO如何將鎖定會在系統中受到影響嗎? 將變量放在另一個變量的頂部是不對的:它會像守衛守衛?

停止其他處理器線程也是不對的?

+0

對於哪種算法,你有這個代碼? – perilbrain 2012-08-14 11:14:06

+0

「*由於讀取或更改鎖定值本身就是一個多指令*」 - 並非總是如此。原子操作由幾種體系結構提供。鎖實現使用這些,這取決於硬件。 – ArjunShankar 2012-08-14 11:31:40

+0

該操作(指令)的原子性如何實現? – 2012-08-14 11:36:59

回答

1

它是100%平臺特定的。通常,CPU提供某種形式的原子操作,如交換或比較和交換。一個典型的鎖可能會像這樣工作:

1)創建:將0(未鎖定)存儲在變量中。

2)鎖定:試圖將變量的值從0(解鎖)切換到1(鎖定)。如果我們失敗了(因爲它未開始解鎖),讓CPU休息一下,然後重試。使用內存屏障來確保將來的內存操作不會隱藏在這個背後。

3)解鎖:使用內存屏障來確保先前的內存操作不會潛入此內存操作。原子寫0(解鎖)到變量。

請注意,除非您想設計自己的同步原語,否則您確實不需要了解這一點。如果你想這樣做,你需要了解更多。對於每個程序員來說,對他製作硬件的工作有一個大致的瞭解是一個好主意。但這是一個充滿了嚴重的魔法的地區。有很多很多的方法可能會出現可怕的錯誤。因此,只需使用由製作平臺,編譯器和線程庫的天才提供的鎖定基元即可。這裏是龍。

例如,SMP Pentium Pro系統有一個錯誤,需要在解鎖操作中進行特殊處理。一個天真的鎖定算法的實現將導致分支預測邏輯期望操作繼續旋轉,在最壞的時候 - 當你第一次獲得鎖定時會招致巨大的性能損失。一個天真的鎖定算法實現可能會導致兩個內核等待相同的鎖定以使總線飽和,從而減慢需要完成工作以便將鎖釋放到爬行的CPU。這些都需要沉重的巫術和對待硬件的深刻理解。

+0

感謝您的迴應。但是這是你最後的評論,真的讓我興奮起來。你能否更詳細地解釋你的「2)」,或者提供一些理解這個功能的好的參考。 – 2012-08-14 11:48:46

+0

它是平臺特定的。對於x86,請參見[cmpxchg](http://faydoc.tripod.com/cpu/cmpxchg.htm)和[暫停aka rep nop](http://stackoverflow.com/questions/7086220/what-does-rep- NOP-均在86組件)。在x86上,不需要內存屏障,但編譯器優化屏障([memory clobber](http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html#ss5.3))通常是。不幸的是,它會很快變得非常複雜。 – 2012-08-14 11:50:59

0

在我學習Uni的過程中,用於實現鎖的可能的固件解決方案以與處理器啓動的存儲器操作相關的「原子性位」的形式呈現。

基本上,在鎖定時,您會注意到您需要以原子方式執行一系列操作:測試該標誌的值,如果未設置,則將其設置爲locked,否則請重試。通過將一個位與CPU發送的每個內存請求相關聯,可以使該序列成爲原子。第一個N-1操作將設置該位,而最後一個操作將取消設置,以標記原子序列的結束。

當存儲標誌數據的內存模塊(可能有多個模塊)接收到序列中第一個操作的請求(其位已設置)時,它將提供服務並且不接受來自任何其他CPU的請求直到啓動原子序列的CPU發送具有未設置原子性位的請求(因爲這些事務通常很短,可以接受這樣的粗粒度方法)。請注意,彙編程序通常會提供類似「compare-and-set」類型的專用指令,使得前面提到的操作更容易。

+0

請注意,這不是在我知道的任何現代計算機系統上實施鎖定的方式。這是理解它的一個模型,因爲現代系統「如果」他們這樣做。這種方法的主要問題是它會減慢鎖定速度,在現代計算機上,內存太慢而無法用於此目的。 (這就是爲什麼我們擁有所有這些緩存 - 內存比CPU慢。) – 2012-08-14 21:39:56

+0

@David Schwartz:確實,它看起來像是「學術」方法。我想它只是用來顯示過程中涉及哪種機制。 – Tudor 2012-08-15 12:19:02

+0

@David請解釋「現代系統的行爲,如果他們這樣做」? – 2012-08-16 04:05:33