2013年8月6日 星期二

[轉] spin_lock & mutex_lock的區別?


本文由該問題引入到內核鎖的討論,歸納如下

為什麼需要內核鎖?
多核處理器下,會存在多個進程處於內核態的情況,而在內核態下,進程是可以訪問所有內核數據的,因此要對共享數據進行保護,即互斥處理

有哪些內核鎖機制?
(1)原子操作
atomic_t數據類型,atomic_inc(atomic_t *v)將v加1
原子操作比普通操作效率要低,因此必要時才使用,且不能與普通操作混合使用
如果是單核處理器,則原子操作與普通操作相同
(2)自旋鎖
spinlock_t數據類型,spin_lock(&lock)和spin_unlock(&lock)是加鎖和解鎖
等待解鎖的進程將反覆檢查鎖是否釋放,而不會進入睡眠狀態(忙等待),所以常用於短期保護某段代碼
同時,持有自旋鎖的進程也不允許睡眠,不然會造成死鎖——因為睡眠可能造成持有鎖的進程被重新調度,而再次申請自己已持有的鎖
如果是單核處理器,則自旋鎖定義為空操作,因為簡單的關閉中斷即可實現互斥
(3)信號量與互斥量
struct semaphore數據類型,down(struct semaphore * sem)和up(struct semaphore * sem)是佔用和釋放
struct mutex數據類型,mutex_lock(struct mutex *lock)和mutex_unlock(struct mutex *lock)是加鎖和解鎖
競爭信號量與互斥量時需要進行進程睡眠和喚醒,代價較高,所以不適於短期代碼保護,適用於保護較長的臨界區
互斥量與信號量的區別?(轉載但找不到原文出處)
(1)互斥量用於線程的互斥,信號線用於線程的同步
這是互斥量和信號量的根本區別,也就是互斥和同步之間的區別
互斥:是指某一資源同時只允許一個訪問者對其進行訪問,具有唯一性和排它性。但互斥無法限制訪問者對資源的訪問順序,即訪問是無序的
同步:是指在互斥的基礎上(大多數情況),通過其它機制實現訪問者對資源的有序訪問。在大多數情況下,同步已經實現了互斥,特別是所有寫入資源的情況必定是互斥的。少數情況是指可以允許多個訪問者同時訪問資源
(2)互斥量值只能為0/1,信號量值可以為非負整數
也就是說,一個互斥量只能用於一個資源的互斥訪問,它不能實現多個資源的多線程互斥問題。信號量可以實現多個同類資源的多線程互斥和同步。當信號量為單值信號量是,也可以完成一個資源的互斥訪問
(3)互斥量的加鎖和解鎖必須由同一線程分別對應使用,信號量可以由一個線程釋放,另一個線程得到

沒有留言:

張貼留言