Semaphore vs. Mutex 簡單區別

jesselyu發表於2015-02-07

一、前言

    最近看了MySQL和PostgreSQL原始碼對於mutex處理,Semaphore和mutex的關係,有些地方模糊了。想想也是,從大學那會兒學linux核心後,後面很少看那塊了,更多的是研究資料庫的一些東西。因此,剛好可以補習下,找回記憶。

二、概況

    其實從本質上來講,兩都並沒有太大區別,從linux原始碼實現來講,至少兩者都是結構體。但是所不同的是,mutex多了owner指標,就因為這個owner指標,導致了mutex和semaphore在功用上的不同。其中以下紅色圈出部分,就是"owner"指標。

semaphore在linux中的原始碼定義:

image

mutex在linux中的原始碼定義:

image

三、Semaphore

   semaphore實際上有好幾種型別,最常見的為:counting semaphore和binary semaphore。

   Binary semaphore其實已經和mutex非常接近了。Binary semaphore與Counting semaphore的區別就在於Semaphore結構體成員"count"的取值範圍。

   Binary semaphore只有"1"和"0"兩種。即"unlocked"和"locked"。

   Binary semaphore的初始化:

image

   Counting semaphore其count值可以是任意的。對於semaphore的操作,也就是通常所說的PV操作。P(s),減少此值,V(s),增加此值。而且每次都只增加“1”或者減少“1”。

四、Mutex

Mutex的count有三種可能值。“1”代表unlocked,"0"代表lokced,負值代表可能的等待者。

Mutex有如下約定:

  1. 有且只有一個程式來持有。

  2. 有且只有owner本身可以unlock mutex(owner指標的作用)。

  3. 不允許遞迴鎖。但是semaphore是允許的,MySQL在這塊上,之前還有一個BUG:Bug #24745 InnoDB semaphore wait timeout/crash – deadlock waiting for itself

  4. 只能能過API來初始化,不允許透過memset和copying來初始化。

  5. 當持有mutex時,程式一般不退出;存放mutex的記憶體不能被釋放。

  6. 通常不用於軟硬體的中斷。

五、總結

    從上面的定義,可以看出,semaphore一般只是表示資源有多少,資訊量有多少,用來類似於解決producer-consumer的問題和同步訊號傳送等。不能解決序列化問題。
    而Mutex則是來解決互斥問題,保證某個資源或者程式碼片段的序列訪問;因為只有owner才能釋放鎖。另外,有同學可能會問,Binary semaphore也只有兩種可能值,也可以實現互斥訪問。但是要知道,Binary semaphore還是沒有owner指標。但有一點相似處,就是在ISR(Interrupt Service Routine)系統中,semaphore或者mutex會被中斷程式中斷。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30088583/viewspace-1429893/,如需轉載,請註明出處,否則將追究法律責任。

相關文章