Semaphore vs. Mutex 簡單區別
一、前言
最近看了MySQL和PostgreSQL原始碼對於mutex處理,Semaphore和mutex的關係,有些地方模糊了。想想也是,從大學那會兒學linux核心後,後面很少看那塊了,更多的是研究資料庫的一些東西。因此,剛好可以補習下,找回記憶。
二、概況
其實從本質上來講,兩都並沒有太大區別,從linux原始碼實現來講,至少兩者都是結構體。但是所不同的是,mutex多了owner指標,就因為這個owner指標,導致了mutex和semaphore在功用上的不同。其中以下紅色圈出部分,就是"owner"指標。
semaphore在linux中的原始碼定義:
mutex在linux中的原始碼定義:
三、Semaphore
semaphore實際上有好幾種型別,最常見的為:counting semaphore和binary semaphore。
Binary semaphore其實已經和mutex非常接近了。Binary semaphore與Counting semaphore的區別就在於Semaphore結構體成員"count"的取值範圍。
Binary semaphore只有"1"和"0"兩種。即"unlocked"和"locked"。
Binary semaphore的初始化:
Counting semaphore其count值可以是任意的。對於semaphore的操作,也就是通常所說的PV操作。P(s),減少此值,V(s),增加此值。而且每次都只增加“1”或者減少“1”。
四、Mutex
Mutex的count有三種可能值。“1”代表unlocked,"0"代表lokced,負值代表可能的等待者。
Mutex有如下約定:
-
有且只有一個程式來持有。
-
有且只有owner本身可以unlock mutex(owner指標的作用)。
-
不允許遞迴鎖。但是semaphore是允許的,MySQL在這塊上,之前還有一個BUG:Bug #24745 InnoDB semaphore wait timeout/crash – deadlock waiting for itself
-
只能能過API來初始化,不允許透過memset和copying來初始化。
-
當持有mutex時,程式一般不退出;存放mutex的記憶體不能被釋放。
-
通常不用於軟硬體的中斷。
五、總結
從上面的定義,可以看出,semaphore一般只是表示資源有多少,資訊量有多少,用來類似於解決producer-consumer的問題和同步訊號傳送等。不能解決序列化問題。
而Mutex則是來解決互斥問題,保證某個資源或者程式碼片段的序列訪問;因為只有owner才能釋放鎖。另外,有同學可能會問,Binary semaphore也只有兩種可能值,也可以實現互斥訪問。但是要知道,Binary semaphore還是沒有owner指標。但有一點相似處,就是在ISR(Interrupt Service Routine)系統中,semaphore或者mutex會被中斷程式中斷。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30088583/viewspace-1429893/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 互斥鎖mutex的簡單實現Mutex
- 簡單易懂 —— this、self、static 的區別
- URL和URI的區別簡單介紹
- callee與caller的區別簡單介紹
- 簡單介紹 "&&" 與 “&” 和 ”|“ 與 ”||“ 的區別
- snap和apt的區別簡單瞭解[]APT
- SurfaceView和普通view的區別及簡單使用View
- innerText和innerHTML區別簡單程式碼例項HTML
- 簡單工廠和抽象工廠的區別抽象
- Hystrix semaphore和thread隔離策略的區別及配置參thread
- ES 23 - 檢索和過濾的區別 (query vs. filter)Filter
- 'cursor:mutex ..'/ 'cursor:pin ..'/ 'library cache:mutex ..'型別的等待事件Mutex型別事件
- Golang切片的三種簡單使用方式及區別Golang
- inherit和initial屬性值區別簡單介紹
- closest()、parents()和parent()方法的區別簡單介紹
- 簡單介紹HTTP與HTTPS之間的區別HTTP
- javascript原始值和物件的主要區別簡單介紹JavaScript物件
- document.documentElement和document.body區別簡單介紹
- 區別linux支援rpm還是deb的簡單方法Linux
- 簡單說區塊鏈區塊鏈
- 請問多執行緒程式設計高手semaphore和 buffer 有什麼區別執行緒程式設計
- Airflow vs. Luigi vs. Argo vs. MLFlow vs. KubeFlowAIUIGo
- Semaphore
- 前端簡單面部識別前端
- 簡單的RNN和BP多層網路之間的區別RNN
- Python中x=y與x==y的區別。(比較簡單)Python
- height:inherit和height:100%的區別簡單介紹
- PHP GD庫與Imagick庫簡單使用及區別(切換到Imagick)PHP
- 簡單瞭解下linux與windows兩者的區別-行雲管家LinuxWindows
- max-height和height屬性的區別簡單介紹
- orm的method屬性值post和get的區別簡單介紹ORM
- Semaphore解析
- MVC vs. MVP vs. MVVMMVCMVPMVVM
- 一個簡單的區塊鏈區塊鏈
- 簡單理解 word-wrap、word-break 和 white-space 的區別
- 雲端計算和虛擬化的三個小區別簡單說明
- 19.javadoc中{@link}與@see的簡單使用以及區別Java
- jQuery子選擇器和後代選擇器區別簡單介紹jQuery