新聞速報

        

2014年2月27日 星期四

同步資料 lock 的處理機制

spinlock,mutex,semaphore,critical section的作用和區別 
 除了最後一個Critical Section(臨界區段)只能用於進程內部,是輕量級同步對象 (效果同 .NET 之 lock 關鍵字)。
 
其他都能用於進程間同步:
spinlock 是自旋鎖,用於多cpu的情況 
mutex 就是普通的 跨Process同步對像 (Process間使用的locking,比lock慢50倍) 
semaphore 用於對資源數的控制 (允許多個執行緒Thread 執行這個程式區段)

CriticalSection(臨界區段) 的用意是在保護某一個目標物(function、object、variable)不會同時被讀寫,其本上來說不同的目標物才會建立不同的 CriticalSection。
舉例來說:一段寫資料到檔案的程式,你可能在不同的 Thread 會去做寫入檔案,所以,你要保護的是寫檔的動作,故只要一個 CriticalSection 來保護就可以了
 
 
Mutex是一把鑰匙,一個人拿了就可進入一個房間,出來的時候把鑰匙交給隊列的第一個。一般的用法是用於串行化對critical section代碼的訪問,保證這段代碼不會被並行的運行。
 
 
 
Semaphore是一件可以容納N人的房間,如果人不滿就可以進去,如果人滿了,就要等待有人出來。對於N=1的情況,稱為Binary semaphore。一般的用法是,用於限制對於某一資源的同時訪問。
 
 
 
Binary semaphore 與Mutex 的差異:
 
在有的系統中Binary semaphore與Mutex是沒有差異的。在有的系統上,主要的差異是mutex一定要由獲得鎖的Process來釋放。而semaphore可以由其它Process釋放(這時的semaphore實際就是個原子的變量,大家可以加或減), 因此semaphore可以用於Process間同步 。 Semaphore的同步功能是所有系統都支持的,而Mutex能否由其他Process釋放則未定,因此建議mutex只用於保護critical section。而semaphore則用於保護某變量,或者同步。
 
 
 
另一個概念是spin lock,這是一個內核態概念。 spin lock與semaphore的主要區別是spin lock是busy waiting,而semaphore是sleep。對於可以sleep的進程來說,busy waiting當然沒有意義。對於單CPU的系統,busy waiting當然更沒意義(沒有CPU可以釋放鎖)。因此,只有多CPU的內核態非進程空間,才會用到spin lock。 Linux kernel的spin lock在非SMP的情況下,只是關irq,沒有別的操作,用於確保該段程序的運行不會被打斷。其實也就是類似mutex的作用,串行化對critical section的訪問。但是mutex不能保護中斷的打斷,也不能在中斷處理程序中被調用。而spin lock也一般沒有必要用於可以sleep的進程空間。 

沒有留言:

張貼留言