文章目錄
- 前言
- 一、PV 操作定義
- 1.1、P 操作定義
- 1.2、V 操作定義
- 二、串聯進程(單線前驅圖)
- 2.1、什么是單線前驅圖?
- 2.2、如何計算單線前驅圖的 PV?
- 2.2.1、計算前驅節點 PV
- 2.2.2、計算中間節點 PV
- 2.2.3、計算尾節點 PV
- 三、并聯進程(多線前驅圖)
- 3.1、什么是多線前驅圖?
- 3.2、并聯進程趨于合并
- 3.2.1、計算前驅節點 PV
- 3.2.2、計算中間節點 PV
- 3.2.3、計算尾節點 PV
- 3.3、并聯進程趨于展開
- 3.3.1、計算前驅節點 PV
- 3.3.2、計算中間節點 PV
- 3.3.3、計算尾節點 PV
- 總結
前言
關于 PV 操作基本都是結合進程管理的前驅圖來進行考察,歷年以來,無論是軟考還是操作系統的單獨考試,占有很大的比重。今天我們總結兩種在考試中常考的類型。一種是單線前驅圖,即串聯進程,另一種是多線前驅圖,即并聯進程。并聯進程下又細分為兩類:一種逐漸向后合并(進程趨于合并),另一種是前驅圖逐漸向后展開。兩種類型你都掌握了應試也就毫無問題了。一、PV 操作定義
本文中的 S 為信號量。關于前驅圖以及信號量的基礎知識本篇不作詳細介紹。
1.1、P 操作定義
S:=S-1,若 S≥0,則執行 P 操作的進程繼續執行;若 S<0,則置該進程為阻塞狀態(因為無可用資源),并將其插入阻塞隊列。
定義這么長,我們只需要謹記:執行 P 操作的進程將進入等待隊列。
1.2、V 操作定義
S:=S+1,若 S>0,則執行 V 操作的進程繼續執行;若 S≤0,則從阻塞狀態喚醒一個進程,并將其插入就緒隊列,然后執行 V 操作的進程繼續。
定義這么長,我們只需要謹記:執行 V 操作的進程將從阻塞隊列中喚醒一個進程。
二、串聯進程(單線前驅圖)
2.1、什么是單線前驅圖?
串聯進程(單線前驅圖)是計算 PV 操作中最為簡單的。那什么是單線前驅圖呢?舉例前驅圖如下:
題干信息:使用 PV 操作控制進程 P1、P2、P3 執行的過程,設置 2 個信號量分別為 S1、S2 且初值均為零。分別列出 3 個進程的進程執行圖來計算每個進程的 PV 操作。
我們可以看到 P1、P2、P3 三個進程是串聯關系,一一執行,只有前面的進程執行了后面的才可以執行,我們將這類前驅圖歸類為單線前驅圖。
2.2、如何計算單線前驅圖的 PV?
那我們計算該進程的 PV 操作呢?我們將節點分為前驅節點(即首節點),中間節點,尾節點分別計算 PV。
2.2.1、計算前驅節點 PV
對于前驅的首結點 P1 進程,進程 P1 從初始狀態執行操作的結果就是從阻塞隊列中喚醒一個進程,即喚醒 P2,故其只有 V 操作,占用一個信號量 S1,進程 P1 執行 V(S1)操作。P1 進程執行圖如下圖所示:
2.2.2、計算中間節點 PV
對于中間節點 P2 進程,只有在前驅進程 P1 完成之后才可以執行,如果進程 P1 阻塞 P2 就無法正常執行,處于等待狀態,故 P2 進程是從等待 S1 的信號量,運行本進程,結果就是喚醒另一個進程即 P3 進程,并占用一個信號量 S2。P2 進程執行圖如下圖所示:
2.2.3、計算尾節點 PV
對于 P3 進程,同理,只有在前驅節點 P2 執行完成將信號量 S2 傳過來之后才可以執行,然后進程結束。P3 進程執行圖如下圖所示:
三、并聯進程(多線前驅圖)
3.1、什么是多線前驅圖?
多線前驅圖即并聯進程,多個進程趨于合并或者單個進程展開為多個進程,類似于初中我們所學的串并聯電路知識。下面我們分別從并聯進程趨于合并與并聯進程趨于展開兩個方向來討論不同情況如何計算 PV 操作。
3.2、并聯進程趨于合并
并聯進程趨于合并是并聯進程中較為簡單的,我在這里舉一例較為經典的例題。進程前驅圖如下:
題干信息:使用 PV 操作控制進程 P1、P2、P3、P4 并發執行的過程,設置 4 個信號量分別為 S1、S2、S3、S4 且初值均為零。分別列出 5 個進程的進程執行圖來計算每個進程的 PV 操作。
3.2.1、計算前驅節點 PV
對于前驅的首結點,以 P1 進程為例,進程 P1 從初始狀態執行操作的結果就是從阻塞隊列中喚醒一個進程,即喚醒 P4,故其只有 V 操作,并占用一個信號量 S1,故進程 P1 執行 V(S1)操作。P1 進程執行圖如下圖所示:
同理,P2、P3 進程與 P1 相同,三個進程分別各占三個信號量S1、S2、S3,進程執行圖如下圖所示:
3.2.2、計算中間節點 PV
對于中間節點進程 P4,只有在前驅進程 P1、P2、P3 都已經完成之后才可以執行,而進程 P1、P2、P3 均有可能在阻塞隊列中,故進程 P4 需要先等待 P1、P2、P3 進程的執行(即 P 操作)接收信號量,然后執行 P4 自身進程喚醒 P5 操作(即 V 操作)占用一條信號量 S4。P4 進程執行圖如下圖所示:
3.2.3、計算尾節點 PV
對于 P5 進程,同理,需要接收到 P4 進程的信號量才可以運行,然后進程結束。P5 進程執行圖如下圖所示:
3.3、并聯進程趨于展開
并聯進程趨于展開是并聯進程中較為難的一種,但是理清了思緒還是得心應手的。舉例題如下:
題干信息:使用 PV 操作控制進程 P1、P2、P3、P4、P5 執行的過程,設置 5 個信號量分別為 S1、S2、S3、S4、S5 且初值均為零。分別列出 5 個進程的進程執行圖來計算每個進程的 PV 操作。
分析:對于本前驅圖,我們應該注意 P2、P3、P4 進程,信號量的判別根據進程標識順序走。
3.3.1、計算前驅節點 PV
前驅節點進程 P1跟之前我們講到的一樣,這里不再贅述。P1 進程執行圖如下圖所示:
3.3.2、計算中間節點 PV
對于進程 P2,需要等到 P1 的信號量 S1,并喚醒 P3、P4 進程分別占用信號量 S1、S2。P2 進程執行圖如下圖所示:
對于進程 P3,需要等到進程 P2 的信號量 S2 才可以執行,然后激活進行 P4,占用一個信號量 S4。P3 進程執行圖如下圖所示:
對于進程 P4,需要等到進程 P2、P3 的信號量 S3、S4 才可以執行,然后激活進程 P5,并占用一個信號量 S5。P4 進程執行圖如下圖所示:
3.3.3、計算尾節點 PV
對于尾節點進程 P5,需要等到進程 P4 的信號量 S5 才可以執行,直到進程結束。P5 進程執行圖如下圖所示:
總結
本文給大家介紹了操作系統基本原理中的一個重要知識點,進程管理之 PV 操作。我們通過對不同的前驅圖進行分類,總結了兩大類最為常見的前驅圖類型,在不同的情境下設置不同的處理思路。循序漸進,從單進程到多進程,處理思路跟著題目給出的前驅圖表示順序走(跟著順序走你會發現都是單進程的計算方式)。相信本篇文章更能讓你在計算過程中起到事半功倍的效果。我是白鹿,一個不懈奮斗的程序猿。望本文能對你有所裨益,歡迎大家的一鍵三連!若有其他問題、建議或者補充可以留言在文章下方,感謝大家的支持!