天天看點

程序間通信(三)---- 信号量

信号量的本質是一種資料操作鎖,本身不具有資料交換的功能,而是通過控制其他的共享資源(如共享記憶體)來實作程序間通信,其本身隻是一種外部資源的辨別,負責保證程序間通信的同步與互斥機制 生命周期不随程序,随核心(與消息隊列類似),也存在兩個指令ipcs -s(檢視系統中的信号量);ipcrm -s semid(釋放指定信号量)

所謂同步與互斥機制,互斥表示對于某一公共資源(也叫臨界資源),在某一時刻隻允許一個通路者對其進行通路,對于程序而言則是在同一時刻僅允許一個程序對目前臨界資源進行通路操作,但是互斥無法限制通路者對臨界資源的通路順序,也就是說至于那個程序會占用資源是看這個程序搶占資源的能力的,通路是随機無序的,這樣一來就會有一個問題,當一個程序,它通路資源的優先級非常高,搶占資源能力非常強,但是此時它不斷的申請鎖,但立馬又釋放鎖,不斷的重複這些無用的操作,但由于它的優先級非常高,我們又不得不把資源給它,是以這樣一來其他的程序就一直無法得到資源,這也就造成了饑餓問題;是以針對這一點,在互斥的基礎上,我們又加上了同步機制,即實作了對資源的有序通路,讓每個程序都有機會能夠申請到資源

信号量與互斥鎖,條件變量的差別在于前者針對于程序間的同步與互斥,而後者則是針對于線程間的同步與互斥

對于信号量操作的接口如下: int semget(key_t key,int num_sems,int sem_flags); 函數功能:建立一個信号量集或擷取一個已存在的信号量集 參數:第一個參數由ftok()獲得;第二個參數表示要建立的信号量集中信号量的個數;第三個參數主要有兩個宏(IPC_CREAT和IPC_EXCL) 傳回值:若成功,則傳回對應信号量集的辨別符;否則傳回-1

int semctl(int sem_id,int sem_num,int cmd,...); 函數功能:用于對指定信号量集中的信号量進行操作 參數:第一個參數表示信号量集的辨別符;第二個參數表示要進行操作的信号量集的信号量對應下标;第三個參數表示要采取的操作(SETVAL表示對信号量進行初始化,IPC_RMID表示删除一個信号量);若第三個參數是SETVAL,則存在之後的參數(union semun--需要使用者自己設定,用于對信号量的某些内容進行初始化) 傳回值:若成功傳回0,否則傳回-1

int semop(int sem_id,struct sembuf* sem_opa,size_t num_sem_ops); 函數功能:用于改變信号量的值(P操作---占用信号量,V操作---釋放信号量) 參數:第一個參數表示信号量集的辨別符;第二個參數表示struct sembuf的指針(可以看做是一個對應結構體數組,用于對信号量集進行操作);第三個參數表示前面結構體數組大小即要操作的信号量個數 傳回值:若成功傳回0,否則傳回-1

struct sembuf{       short sem_num;//該成員是信号編号,除非使用一組信号量,否則它為0       short sem_op;//該成員的值是信号量在一次操作中需要改變的。 //信号量在一次操作中需要改變的資料,通常是兩個數,一個是-1,即P(等待)操作,它等待信号量變為可用;一個是+1,即V(發送信号)操作,它發送信号表示信号量現在已可用。       short sem_flg;//通常為SEM_UNDO,使作業系統跟蹤目前程序對這個信号量的修改情況, //并在程序沒有釋放該信号量而終止時,作業系統釋放信号量,防止因程序異常退出而導緻的死鎖問題 };

繼續閱讀