close

為什麼需要內核鎖?

多核處理器下,會存在多個行程處於內核態的情況,而在內核態下,行程是可以訪問所有內核資料的,因此要對共用資料進行保護,即互斥處理

 

有哪些內核鎖機制?

(1)原子操作

atomic_t資料類型,atomic_inc(atomic_t *v)v1

原子操作比普通操作效率要低,因此必要時才使用,且不能與普通操作混合使用

如果是單核處理器,則原子操作與普通操作相同

(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)是加鎖和解鎖

競爭semaphoremutex時需要進行行程睡眠和喚醒,代價較高,所以不適於短期代碼保護,適用於保護較長的臨界區

互斥量與semaphore的區別?

(1) mutex用於執行緒的互斥,信號線用於執行緒的同步

這是mutexsemaphore的根本區別,也就是互斥和同步之間的區別

互斥:是指某一資源同時只允許一個訪問者對其進行訪問,具有唯一性和排它性。但互斥無法限制訪問者對資源的訪問順序,即訪問是無序的

同步:是指在互斥的基礎上(大多數情況),通過其它機制實現訪問者對資源的有序訪問。在大多數情況下,同步已經實現了互斥,特別是所有寫入資源的情況必定是互斥的。少數情況是指可以允許多個訪問者同時訪問資源

(2) mutex值只能為0/1semaphore值可以為非負整數

也就是說,一個mutex只能用於一個資源的互斥訪問,它不能實現多個資源的多執行緒互斥問題。semaphore可以實現多個同類資源的多執行緒互斥和同步。當semaphore為單值信號量是,也可以完成一個資源的互斥訪問

(3) mutex的加鎖和解鎖必須由同一執行緒分別對應使用,semaphore可以由一個執行緒釋放,另一個執行緒得到

arrow
arrow
    全站熱搜

    立你斯 發表在 痞客邦 留言(0) 人氣()