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 的區別
- snap和apt的區別簡單瞭解[]APT
- Hystrix semaphore和thread隔離策略的區別及配置參thread
- SurfaceView和普通view的區別及簡單使用View
- ES 23 - 檢索和過濾的區別 (query vs. filter)Filter
- Golang切片的三種簡單使用方式及區別Golang
- 簡單介紹HTTP與HTTPS之間的區別HTTP
- [20210520]11g shared pool latch與library cache mutex的簡單探究.txtMutex
- Airflow vs. Luigi vs. Argo vs. MLFlow vs. KubeFlowAIUIGo
- Python中x=y與x==y的區別。(比較簡單)Python
- 簡單說區塊鏈區塊鏈
- 簡單的RNN和BP多層網路之間的區別RNN
- 簡單瞭解下linux與windows兩者的區別-行雲管家LinuxWindows
- [20210521]11g shared pool latch與library cache mutex的簡單探究4.txtMutex
- [20210520]11g shared pool latch與library cache mutex的簡單探究3.txtMutex
- HashSet vs. TreeSet vs. LinkedHashSet
- 簡單理解 word-wrap、word-break 和 white-space 的區別
- PHP GD庫與Imagick庫簡單使用及區別(切換到Imagick)PHP
- Semaphore
- (12)非阻塞賦值與阻塞賦值區別(以簡單例子說明)賦值單例
- 簡單介紹下python2.x與python3.x的區別Python
- 一個簡單的區塊鏈區塊鏈
- CPU單核多核區別【轉載】單核
- Date簡單型別的setter注入型別
- 適配target30返回監聽以及簡單分析finish()和onBackPressed()的區別
- 簡單工廠模式、工廠方法模式和抽象工廠模式有何區別?模式抽象
- 最簡單的例子瞭解js中call()、apply()、bind()的區別和聯絡JSAPP
- 簡單介紹Tomcat中catalina.out 和 catalina.log的區別和用途Tomcat
- 雲端計算和虛擬化的三個小區別簡單說明
- 耦合與聚合的區別比單體與微服務區別更重要微服務
- Semaphore解析
- 簡要MR與Spark在Shuffle區別Spark
- RAM、ROM、FLASH、EMMC的簡單區分
- 簡單的區域網內通訊
- 簡單型別與複雜型別及原型鏈型別原型
- 什麼是區塊鏈,簡單瞭解區塊鏈區塊鏈
- 不簡單的基本資料型別資料型別
- 一個簡單的人臉識別庫