標籤:style color 使用 資料 art 問題
本文由該問題引入到核心鎖的討論,歸納例如以下
為什麼須要核心鎖?多核處理器下,會存在多個進程處於核心態的情況,而在核心態下,進程是能夠訪問全部核心資料的,因此要對共用資料進行保護,即相互排斥處理
有哪些核心鎖機制?(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)相互排斥量的加鎖和解鎖必須由同一線程分別相應使用,訊號量能夠由一個線程釋放,還有一個線程得到