Unix,Linux下的信號燈

信號燈分爲兩種:

一種是簡單信號量,另一種是用於進程間通訊的信號量集;


一、簡單信號量:

屬於POSIX標準的信號量;

從信號量的命名來看,信號量又可分爲命名信號量和匿名(未命名)信號量;

從信號量的值來看,信號量可分爲二進制信號量和計數信號量;


1、匿名信號量和命名信號量:

  匿名信號量是在內存中分配內存、進行初始化並由系統API進行管理的,它可以在多個線程之間進行資源同步,也可以在多個進程之間進行資源同步,這主要是看在初始化的時候給pshared傳遞的參數值,爲0,則在線程之間同步,非0,則在進程之間同步;

  命名信號量與匿名信號量不同,它一般只用於在進程之間進行資源同步,而且是使用文件全路徑來對信號量進行命名的;命名信號量具有屬主用戶ID、組ID和保護模式等參數;命名信號量的名稱是在文件系統的命名空間中定義的;

  匿名信號量的操作函數有:sem_init、sem_destroy、sem_wait、sem_trywait、sem_post、sem_getvalue;

  命名信號量的操作函數有:sem_open、sem_close、sem_wait、sem_trywait、sem_post、sem_getvalue、sem_unlink;

    

2、二進制信號量和計數信號量:

  二進制信號量的值只有兩個:0和1;這個時候信號量就相當於一個互斥鎖;它表示可用資源數量只有1個,當一個調用者擁有並訪問它的時候(值爲0),其它調用者就必須阻塞並等待.知道擁有者釋放這個信號量(值爲1).

  計數信號量,從概念上來講,它的值是一個非負整數,表示可用資源的數量;用於協調對共享資源的訪問:在線程中操作共享資源的時候,當一個訪問者申請使用一個單位的資源時,信號量的值減1,表示剩餘的可用資源的數量減少1;當這個訪問者使用完這個共享資源並退還這個共享資源給系統的時候,信號量的值增1,表示可用的共享資源數量多1;而申請資源和釋放資源的操作是原子操作,即:信號量的值減1和增1操作是原子操作;也就是說,有一個資源申請動作,就必須對應有一個資源釋放動作,有一個信號量減1操作,就必須對應有一個信號量增1的動作;如果信號量的值爲0,就表示沒有資源可用,那麼這個時候,如果有後續的調用者來申請可用的共享資源,那麼這個調用者就會被阻塞在這個信號量上,直到有一個調用者釋放一個共享資源爲止;

  

3、當信號量作爲互斥鎖使用時:

  信號量:相當於是代碼周圍的衛兵,當衛兵發現共享代碼段正在被執行,則衛兵不讓後續調用者前去執行;當共享代碼段爲空閒時,衛兵允許後續調用者去執行;

  互斥量:相當於一把多人共用的鑰匙,誰擁有這把鑰匙,誰就可以訪問受保護的代碼段;

    

二、信號量集:

它屬於System V信號量,是一個集合;

常用於進程間的通訊;System V的IPC要求用於進程間通訊的信號量必須是一個集合;它是系統內核定義的一個數據結構;

信號量集的初始化操作由shmget函數完成



發佈了49 篇原創文章 · 獲贊 28 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章