談到訊號量,大多數會立馬想到pv操作,這個用荷蘭語表示的專有名詞。
對比前面我們說的,四種實現臨界區互斥的軟體設計演算法,pv操作更加的優良,現在這裡就將對其原理進行詳細的解釋分析,以及如何在題目的場景中使用,包括演算法的設計和問題的分析。
首先,訊號量機制我們著重談兩個設計思路,核心相同,設計有細微的差別,但不要被名稱所迷惑。
它們是:
整形訊號量
整形訊號量表示的是資源的數目s。p操作將減少乙個資源,v操作將增加乙個資源(即釋放乙個資源,因為資源不會被操作生出來,只會因別人不用而釋放)。
這裡不用wait和signa這種看著含義更加明顯的名詞,是因為,p、v可以這麼聯想:乙個程序想利用資源了,就拍拍手,表達自己的意願,這樣就可以將s-1,而當自己用好了,就表示乙個v字手勢,表示成功了,資源可以收回去了。
void p(s)
void v(s)
所以,我更加傾向於用pv直接表達pv操作。因為這個影象更加生動。當然,用wait和signal,as you wish, 你開心就好。
我想強調的有乙個點在於:s的邊界含義,當然s > 0和s < 0的時候都很自然。
問,s = 0時候表示什麼意思?既然s是可用資源的數目,那麼s = 0,表示已經沒有資源可用了。
在整型訊號量中,只要s <= 0,就會不斷測試,看何時有資源可用。
也因此,程序會一直等,不遵循讓權等待的原則。
更好的做法是,像我們在程序排程中學到的,加乙個就緒佇列。
也即,引入:記錄型訊號量。
記錄型訊號量
我們常說這個演算法是一種程序同步機制,而不說是互斥機制。
是因為,使用pv的思路進行程序的互斥訪問,非常簡單,只需要設定乙個mutex,取值僅僅為0或者1即可。而同步的話就複雜一些,採用用到這個記錄型訊號量。
首先看semaphore的設計:
typedef struct
semaphore;
這裡的value和上面的s含義相同,都表示可用的資源數目。
鍊錶l表示的是就緒佇列,因此核心仍是pv,只不過如何對待程序,記錄型訊號量的做法更加完善。解決了讓程序忙等的現象。
void p(semaphore s)
}void v(semaphore s)
}
這裡有意思的是,在v的時候,邊界為啥是s.value <= 0.
當s.value = 0時,是從s.value = -1時候變過來的,因此,雖然s.value = 0了,還不能忘了把最後乙個程序移出就緒佇列並叫醒它。
s.value小於等於0時,絕對值表示的是等待程序的數目。
還需要注意s.value++的時機。如果設計演算法時,先判斷再加,則s.value < 0即可:
void v(semaphore s)
s.value++;
}
所以,演算法背後是思想,需要仔細體會才能領悟。
以上。
訊號量工作原理
一 核心相關檔案為include linux semaphore.h和kernel semaphore.c 二 主要結構體 struct semaphore 結構體成員變數解讀 1 lock主要用於保護count和wait list鍊錶的訪問 2 count記錄訊號量等待程序的計數 3 wait l...
訊號量 二值訊號量
訊號量 二值訊號量 訊號量是作業系統的重要部分,訊號量一般用來進行資源管理和任務同步。freertos中訊號量分為二值訊號量 互斥訊號量 計數訊號量和遞迴互斥訊號量,應用場景各不同。二值訊號量通常用於互斥訪問或同步,二值訊號量和互斥訊號量非常相似,但互斥訊號量有優先順序,二值訊號量沒有。因此二值訊號...
python訊號量 Python訊號量
python訊號量教程 訊號量是由作業系統管理的一種抽象資料型別,用於在多執行緒中同步對共享資源的使用。本質上說,訊號量是乙個內部資料,用於標明當前的共享資源可以有多少併發讀取。也可以簡單的理解為,訊號量是多把鎖,同時允許多個執行緒來更改資料,而 python訊號量與互斥鎖的關係 訊號量的乙個特殊用...