信號量及PV操作

信號量
無論是大部分的教材上的信號量,還是博客中的信號量,基本上解說都是類似下面這種,給出幾個不同的信號量種類然后加一點說明,完全不能理解信號量的PV操作。
5.2 信號量機制
http://www.itdecent.cn/p/93128a6cb0f0

在搜索過程中我找到了這個
操作系統(tǒng)原理(Operating Systems)
https://www.coursera.org/learn/os-pku

這個網(wǎng)站em。?;敬虿婚_,所以使用華文慕課。這個是北大自己辦的網(wǎng)站,上面有這個課程,登錄后可以下載課件。
http://www.chinesemooc.org/mooc/4747
如果不想那么麻煩就直接看B站的
https://www.bilibili.com/video/av9555596/?p=30

看完這個我理解了信號量的PV操作。
以下內(nèi)容基本為視頻的文字版,這里我在聽的過程中大致打了出來,方便后續(xù)復習。

image.png

什么是信號量? 信號量是一個特殊的變量。
信號量的作用: 用于進程間傳遞信息的一個整數(shù)值。
信號量的定義:

struct semaphore
{
  int count;
  queueType  queue;
}

這是一個結構體,由一個值和一個隊列組成。值是傳遞的信息(一個整數(shù)),而隊列是允許進程掛在隊列上的。
信號量的聲明: semaphore s
對信號量可以實施的操作:初始化、P和V(P、V分別是荷蘭語的test(proberen)和increment(verhogen))。

信號量類似于現(xiàn)實中的信號燈。紅燈停綠燈行。

image.png

P操作主要做2件事情:
1.給信號量值減1
2.判斷值是否小于0,如果值小于0,那么調(diào)用P操作的進程的狀態(tài)就變成阻塞狀態(tài),并且把進程送到相應的等待隊列的末尾,cpu重新調(diào)度。
如果值不小于0,那么實施P操作的進程繼續(xù)執(zhí)行。
V操作:
1.給信號量值加1
2.判斷值是否小于等于0,如果小于等于0,那么就喚醒信號量隊列上等待的一個進程,將其狀態(tài)改變?yōu)榫途w狀態(tài),并插入就緒隊列。
P即down,semWait。
V即up,semSignal。

image.png

現(xiàn)在不強調(diào)一般二元信號量,直接叫信號量。


image.png

用PV操作,解決進程間互斥問題。

image.png

用PV操作,解決進程間互斥問題有以下4點:
1.劃定臨界區(qū)
2.對多個進程的臨界區(qū),設定一個信號量mutex。mutex這個信號量,初值為1。簡單說明一下mutex,mutex是常用于解決互斥問題的時候所定義的一個信號量變量。是互斥(mutual exclusion)的縮寫?,F(xiàn)在已經(jīng)形成一種約定俗成的互斥的命名。
3.在臨界區(qū)前實施P(mutex)
4.在臨界區(qū)之后實施V(mutex)

3個進程P1,P2,P3。


image.png

臨界區(qū)


image.png
image.png

這個例子是3個進程P1,P2,P3,設置臨界區(qū)后再設置一個信號量mutex,初值為1。然后,在臨界區(qū)的前后,加上PV操作。

假設P1先上cpu,那么做P(mutex)操作的時候,mutex值-1,mutex = 0,不滿足小于0的條件,所以P1進程進入臨界區(qū),假如P1進程在進入臨界區(qū)期間被中斷了,正好P2上CPU,P2也想進入臨界區(qū),所以做P(mutex)操作,此時mutex值為-1,滿足小于0的條件,P2進程就等在mutex隊列上,讓出CPU之后,假設P3進程上CPU,P3也要進臨界區(qū),mutex又減1,mutex值為-2,
滿足小于0的條件,P3進程也等在mutex隊列上,此時假設P1又上CPU了,在臨界區(qū)完成了工作,出臨界區(qū)時,執(zhí)行了V(mutex)操作,mutex加1,mutex值為-1,值小于0,那么就會在隊列找到等待的進程P2,送到就緒區(qū),P1接著做自己的事情,然后過一會兒如果P2上cpu了,那么進程P2的下一步就是進入臨界區(qū)。因為P操作執(zhí)行完了,接著就是進入臨界區(qū)的操作。當P2出臨界區(qū)的時候,執(zhí)行V(mutex)操作,mutex值為0,依舊滿足小于等于0的條件,所以V操作就會把隊列里面的P3喚醒,讓它進入就緒區(qū)。

這里還有一個問題,臨界區(qū)與臨界資源。
臨界區(qū)在講計算機操作系統(tǒng)的書解釋是這樣的:人們把在每個進程中訪問臨界資源的那段代碼稱為臨界區(qū)(critical section)。
這句話有點不通順的,代碼怎么能是一個區(qū)域呢,個人理解是這樣的:
當代碼訪問臨界資源時,代碼所執(zhí)行的區(qū)域是臨界區(qū)。
也就是說,如果代碼在執(zhí)行的時候,沒有訪問臨界資源的話,那個區(qū)域就不是臨界區(qū)。
臨界資源:一種公共資源或者說是共享數(shù)據(jù),可以被多個線程使用。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容