Semaphore
Linux提供一種保護critical section的方法叫做Semaphore作為user context進行同步與鎖定的機制。Semaphore的概念是為了處理資源分配的問題 假設有一或多個資源 且有數個process要進入critical section 這邊會使用semaphore去計數process的數量 當資源被釋放時則讓下一個process進入 所以他會有一個變數紀錄有多少剩餘資源或是多少process在等待 因此semaphore是一個counter,想像有一個N個車位的停車場,停車場柵欄前都有一個剩餘多少車位的顯示器,當顯示器上數字大於1的時候表示還有空位,這時車子便可以停進去,當車子開進去後顯示器數字立刻減1我們稱為這行為叫做P操作(Passeven),當顯示器為0的時候外面的車就必須等待,而當有車子要出來的時候顯示器數字立刻加1,我們稱這行為教作V操作(verhoug)。因此Semaphore是一個指示器控管進出行程的數量,當我們將行程數量只設定為1的時候,表示只有一個行程可以進去操作,這時我們稱semaphore為Binary semaphore其實它的功能就相當於mutex。
linux kernel裡面使用semaphore時候,必須先引入<linux/semaphore.h>
,然後定義semaphore結構變數。
struct semaphore *sem;
初始化,其中val為初始化設定允許多少個行程進入。
void sema_init(struct semaphore *sem,int val);
P操作的函式
void down(struct semaphore *sem);
int down_interruptible(struct semaphore *sem);
int down_trylock(struct semaphore *sem);
down()會執行semaphore遞減的動作。 down_interruptible()允許等待中被中斷返回(被中斷返回一個非0值)。 down_trylock()不進行等待,若無取得使用權直接返回(值不為0便返回);
V操作
void up(struct semaphore *sem);
Mutex
Mutex是一把鑰匙,一個人拿了就可進入一個房間,出來的時候把鑰匙交給隊列的第一個。一般的用法是用於串行化對critical section代碼的訪問,保證這段代碼不會被並行的運行。在有的系統中Binary semaphore與Mutex是沒有差異的。在有的系統上,主要的差異是mutex一定要由獲得鎖的進程來釋放。而semaphore可以由其它進程釋放(這時的semaphore實際就是個原子的變量,大家可以加或減),因此semaphore可以用於進程間同步。
使用mutex時候要先引入<linux/mutex.h>
也一樣先定義結構變數,有兩種方式可以定義
DEFINE_MUTEX(lock);
struct mutex *lock;
初始化
mutex_init(struct mutex *lock);
上鎖
void mutex_lock(struct mutex *lock);
int mutex_lock_interruptible(struct mutex *lock);
int mutex_trylock(struct mutex *lock);
成功上鎖會返回0值,mutex_trylock()不會進行休眠。mutex_lock_interruptible()允許中斷發生叫醒睡眠。
解鎖
void mutex_unlock(struct mutex *lock);
查詢是否上鎖
int mutex_is_locked(struct mutex *lock);
無鎖返回0值,上鎖返回1值