基本概念
訊號量和p,v 原語
訊號量:
訊號量值的含義
訊號量結構偽**
訊號量的本質是乙個計數器
struct semaphore
p原語
p(s)
}
v原語
v(s)
}
訊號量有關函式
建立或開啟訊號量
設定初值/銷毀訊號量
union semun
union senun su;
su.val=1;
檢視訊號量裡的值訊號量pv操作
struct sembuf ;
命令檢視刪除訊號量集訊號量**如下
執行結果如下
訊號量的工作原理
訊號量也屬於程序間通訊的方式之一,它的作用主要是保護臨界資源因多個程序訪問而造成的一系列問題,在上面的**中,用fork建立出子程序,兩個程序同時向顯示屏列印字元,而在這裡,兩個程序的公共資源就是顯示屏,因為cpu在對兩個程序的排程是隨機的,如果不對公共資源進行保護,列印出的結果就是a,b穿插,不是成對出現
如果讓訊號量可以保護臨界資源,使其在任何乙個時間內,都有且僅有乙個程序訪問,首先,fork用某種辦法,得到乙個相同的鍵值,再用相同的鍵值訪問或者建立乙個相同的訊號量集,這樣兩個程序就可以共享訊號量,我們在**中將訊號量的值設為1.以子程序為例,想要訪問臨界資源,首先要進行p操作申請資源,如果這時訊號量的值小於0,那麼它就必須掛起等待,如果這時訊號量值就為1,它就指向p操作申請資源,訊號量的值-1變為0,如果父程序想要申請資源,訊號量值-1變為-1,其值小於0,那麼掛起等待,在子程序完成對臨界資源訪問後,進行v操作,訊號量值+1變為0,如果訊號量值小於等於0,那麼就喚醒父程序
sem_undo
Linux程序通訊 訊號量
主要用於程序對共享資源的互斥訪問。為了取得對乙個共享資源,程序測試訊號量的值,如果為正,表示還有資源可以訪問,該程序對訊號量加減一。如果為0表示沒有資源可以用,該程序應當休眠等待訊號量的值再次為正。linux中的訊號量使用起來是比較麻煩的。在這裡,訊號量是以集合形式存在的,建立時要給出訊號量的數目,...
Linux程序通訊 訊號量
訊號量是乙個核心變數,它可以被系統中的任何程序所訪問。程序間可以使用這個變數來協調對於共享記憶體和其他資源的訪問。如果不刪除訊號量,它將繼續在系統中存在,即使程式已經退出,它可能在你下次執行此程式時引發問題,而且訊號量是一種有限的資源。簡單的例子 父程序與子程序共享印表機,必須其中一者列印完後,另一...
linux程序通訊 訊號量
訊號量 程序間或執行緒間同步 講的是system v裡面的訊號量 二值訊號量 只有0和1兩個值 1 0計數訊號量 有n個值 4 3 2 1 0 圖書館借書 借出書 n 1 程序申請訊號量 p操作 歸還書 n 1 程序釋放訊號量 v操作 p 操作 v 操作 等0操作 書都被借完了 system v 訊...