linux信号量简介
一、什么是信號量
為了防止多個程序同時訪問一個共享資源而引發的一系列問題,我們需要一種訪問機制,它可以通過生成并使用令牌來授權,在同一時刻只能有一個線程訪問代碼的臨界區域。
臨界區域是指執行數據更新的代碼需要獨占式地執行。而信號量就可以提供這樣的一種訪問機制,讓一個臨界區同一時間只有一個線程在訪問它,也就是說信號量是用來協調進程(線程)對共享資源的訪問的。
信號量是一個特殊的變量,其數值可用于表示空閑臨界資源的數量。有進程釋放時,信號量增加,表示可用資源增加;當有進程申請到資源時信號量減少,表示可用資源數減少。程序對其訪問都是原子操作,且只允許對它進行等待(即P(信號變量))和發送(即V(信號變量))信息操作。
最簡單的信號量是只能取0和1的變量,這也是信號量最常見的一種形式,叫做二元信號量。而可以取多個正整數的信號量被稱為通用信號量。這里主要討論二元信號量。
信號量的值為正的時候,說明它空閑。所測試的線程可以鎖定并使用它。若為0,說明它被占用,測試的線程要進入睡眠隊列中,等待被喚醒。
二、信號量的工作原理
由于信號量只能進行兩種操作等待和發送信號,即P(sv)和V(sv),他們的行為是這樣的:
P(sv):如果sv的值大于零,就給它減1;如果它的值為零,就掛起該進程。
V(sv):如果有其他進程因等待sv而被掛起,就讓它恢復運行,如果沒有進程因等待sv而掛起,就給它加1.
舉個例子,就是兩個進程共享信號量sv,一旦其中一個進程執行了P(sv)操作,它將得到信號量,并可以進入臨界區,使sv減1。而第二個進程將被阻止進入臨界區,因為當它試圖執行P(sv)時,sv為0,它會被掛起以等待第一個進程離開臨界區域并執行V(sv)釋放信號量,這時第二個進程就可以恢復執行
舉個例子,就是兩個進程共享信號量sv,一旦其中一個進程執行了P(sv)操作,它將得到信號量,并可以進入臨界區,使sv減1。而第二個進程將被阻止進入臨界區,因為當它試圖執行P(sv)時,sv為0,它會被掛起以等待第一個進程離開臨界區域并執行V(sv)釋放信號量,這時第二個進程就可以恢復執行。
三、信號量的分類
Linux中提供了兩種信號量,一種用于內核程序中,一種用于應用程序中。
總結
以上是生活随笔為你收集整理的linux信号量简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 互斥锁、条件变量、自旋锁、读写锁
- 下一篇: Linux信号量之内核信号量