『操作系统』 进程的描述与控制 Part3 管程
文章目錄
- 2.6 管程
- 管程的基本概念
- 1.管程的組成
- 2.管程的主要特性
- 3.條件變量
- 4.管程的實現
- 5.管程和進程的異同點
- 練習題
- 2.7 進程通信
- 進程通信的類型
- 共享存儲器系統
- 練習題
- 消息傳遞系統
- 管道通信系統
- 客戶機-服務器系統
- 消息傳遞通信的實現方法
- 直接通信方式
- 間接通信方式——信箱
- 消息傳遞系統實現中的若干問題
- 1.通信鏈路
- 2.消息的格式
- 3.進程同步方式
- 練習題
- 消息緩沖隊列通信機制
2.6 管程
信號量同步機制存在的問題
- 同步操作分散:信號量機制中,同步操作分散在各個進程中,使用不當就可能導致進程死鎖;
- 易讀性差:要了解對于一組共享變量及信號量的操作是否正確,必須通讀整個系統或者并發程序;
- 不利于修改和維護:各模塊的獨立性差,任一組變量或一段代碼的修改都可能影響全局;
- 正確性難以保證:操作系統或并發程序通常很大,很難保證這樣一個復雜的系統沒有邏輯錯誤;
管程的基本概念
管程:管程是關于共享資源的數據結構及一組針對該資源的操作過程所構成的軟件模塊。
管程:管理過程
1.管程的組成
(1)名稱:
(2)數據結構說明:一組局部于管程的共享變量;
(3)操作過程:對共享變量進行操作的一組過程;
(4)初始化代碼:對共享變量進行初始化的代碼。
2.管程的主要特性
共享性、安全性、互斥性
- 模塊化:一個管程是一個基本程序單位,可以單獨編譯;
- 抽象數據類型:管程是一種特殊的數據類型,其中不僅有數據,而且有對數據進行操作的代碼;
- 信息封裝:管程中的內部過程(函數)實現了某些功能,至于這些功能是怎樣實現的,在其外部則是不可見的;
- 局部于管程的數據只能被局部于管程內的過程所訪問;
- 一個進程只能通過調用管程內的過程才能進入管程訪問共享數據;
- 每次僅允許一個進程在管程內執行某個內部過程;
3.條件變量
- 條件變量:當調用管程的進程無法運行時,用于阻塞進程的信號量;
- 同步原語wait:當一個管程過程發現無法繼續時(如發現沒有可用資源時),它在某些條件變量上執行wait,這個動作引起調用進程阻塞;
- 同步原語signal:喚醒等待隊列中的隊首進程。
等待及喚醒操作
- c.wait:進程將自己阻塞在c隊列上;
- c.signal:將c隊列中的一個等待進程喚醒。
- signal操作的作用:
喚醒c隊列中一個被阻塞的進程,
若c隊列為空則signal操作不產生任何效果,
這與信號量機制中的signal操作不同。
管程要解決的問題
(1)互斥
管程是互斥進入的: 為了保證管程中數據結構的數據完整性, 管程的互斥性是由編譯器負責保證的。
(2)同步
- 管程內設置條件變量及等待/喚醒操作來實現同步;
- 可以讓一個進程在條件變量上等待(此時,應先釋放管程的使用權);
- 也可通過發送信號將等待在條件變量上的進程喚醒。
4.管程的實現
- 各進程必須互斥調用管程
- 同步原語具有條件變量,以區別不同條件的wait和signal同步操作
HOARE管程__條件變量的實現
條件變量——在管程內部說明和使用的一種特殊類型的變量
var c:condition;
對于條件變量,可以執行wait和signal操作
c.wait:
如果緊急等待隊列非空,則喚醒第一個等待者,否則釋放管程的互斥權;執行此操作的進程進入c鏈末尾。
c.signal:
如果c鏈為空,則相當于空操作,執行此操作的進程繼續執行;否則喚醒第一個等待者,執行此操作的進程進入緊急等待隊列的末尾。
5.管程和進程的異同點
(1)設置進程和管程的目的不同:
進程:實現系統的并發性
管程:解決共享資源的使用(互斥)
(2)系統管理數據結構不同:
進程:PCB
管程:等待隊列
(3)管程被進程調用
練習題
1. 下列關于管程的描述中,哪一個是不正確的?(C)
A.管程的主要作用是管理共享資源(數據結構)
B.進程只能調用管程提供的過程對管程中的數據結構進行處理
C.管程中需要提供互斥量以保證管程的互斥性
D.管程有自己的名字
2. 下列關于管程的描述,正確的是(BCD)。
A.管程只能用于實現進程的互斥
B.管程是由程序設計語言支持的進程互斥同步機制
C.任何時候只能有一個進程在管程中執行
D.管程中定義的變量只能被管程內的過程訪問
3. [2016考研真題 32]下列關于管程的敘述中,錯誤的是:(A)
A.管程只能用于實現進程的互斥
B.管程是由編程語言支持的進程同步機制
C.任何時候只能有一個進程在管程中執行
D.管程中定義的變量只能被管程內的過程訪問
2.7 進程通信
進程之間的信息交換
(1)低級通信——進程同步
- 低效、少量數據傳遞
- 通信實現細節對用戶不透明
(2)高級通信——進程通信 - 高效、大量數據傳遞
- 通信實現細節對用戶透明
進程通信的類型
共享存儲器系統
在共享存儲器系統中,相互通信的進程共享某些存儲區,進程之間能夠通過這些空間進行通信。
練習題
1. 采用共享內存進行進程間通信的方法需要程序員解決的問題是(C)
A.保證共享內存空間不被破壞
B.分配共享內存空間的大小
C.處理進程在使用共享內存過程中的互斥關系
D.設計共享內存空間的訪問原語
消息傳遞系統
進程間的數據交換,以格式化的消息為單位。
計算機網絡中:消息稱為報文。程序員直接利用系統提供的一組通信命令(原語)進行通信。
分類
- 直接通信方式(消息緩沖機制)
- 間接通信方式(信箱通信方式)
管道通信系統
所謂“管道”,是指用于連接一個讀進程和一個寫進程以實現他們之間通信的一個共享文件,又名pipe文件。
向管道(共享文件)提供輸入的發送進程(即寫進程),以字符流形式將大量的數據送入管道;
而接收管道輸出的接收進程(即讀進程),可從管道接收數據;
由于發送和接收都是利用管道進行通信的,故稱為管道通信。
特點
- 管道是半雙工的,數據只能向一個方向流動;需要雙向通信時,需要建立起兩個管道;
- 只能用于父子進程或者兄弟進程之間(具有親緣關系的進程);
- 單獨構成一種獨立的文件系統:管道對于管道兩端的進程而言,就是一個文件,但它不是普通的文件,它不屬于某種文件系統,而是自立門戶,單獨構成一種文件系統,并且只存在于內存中。
管道通信控制
為了協調雙方的通信,管道通信機制必須提供以下三方面的協調能力:
- 互斥。 一個進程正在對pipe進行讀/寫操作時,另一進程必須等待。
- 同步。 當寫(輸入)進程把一定數量的數據寫入pipe后,便去睡眠等待,直到讀(輸出)進程取走數據將其喚醒;當讀進程讀空pipe,也應睡眠等待,直至寫進程將數據寫入管道,才將其喚醒。
- 對方是否存在。 只有確定對方已存在時,才能進行管道通信,否則會造成因對方不存在而無限期等待。
客戶機-服務器系統
(1)socket
好像一條通信線兩端的接口;
一對進程通過網絡進行通信要用一對socket,每個進程一個。
三個要素:
網絡地址:表明一個socket用于哪種網絡
連接類型:表明網絡通信所遵循的模式,主要分為“有連接”和“無連接”模式。
網絡規程:表明具體網絡的規程。一般來說,網絡地址和連接類型結合在一起就基本上確定了適用的規程。
消息傳遞通信的實現方法
在進程之間通信時,源進程可以直接或間接地將消息傳送給目標進程。
直接通信方式
(1)對稱尋址方式:要求發送及接收進程均以顯式方式提供對方標識符。
- Send(Receiver, message);
發送一個消息給接收進程(Receiver) - Receive(Sender, message);
接收Sender發來的消息
(2)非對稱通信方式:接收進程可能需要與多個發送進程通信,無法事先指定發送進程。
- Send(P, message);
發送一個消息給接收進程P - Receive(id, message);
接收來自任何進程發來的消息,id參數變量的值可以是發送方的進程id或名稱。
間接通信方式——信箱
- 消息在信箱中可以安全地保存,只允許核準的目標用戶隨時讀取。
- 利用信箱通信方式,既可實時通信,又可非實時通信。
系統為信箱通信提供若干原語
- 信箱的創建和撤消
- 消息的發送和接收
Send(mailbox, message);
將一個消息發送到指定信箱
Receive(mailbox, message);
從指定信箱中接收一個消息
信箱的分類
- 私用信箱
- 公用信箱
- 共享信箱
四種關系
- 一對一關系
- 多對一關系
- 一對多關系
- 多對多關系
消息傳遞系統實現中的若干問題
1.通信鏈路
(1)通信鏈路的建立:顯示、隱式
(2)通信鏈路的鏈接方法:點-點、多點鏈接
(3)按通信方式分:單向通信、雙向通信
2.消息的格式
(1)消息:
消息頭:消息傳輸時的控制信息
- 源進程名
- 目標進程名
- 消息長度
- 消息類型
- 日期與時間
- 消息編號
消息正文:傳輸的數據
(2)消息的長度
固定長度
可變長度
3.進程同步方式
⑴發送進程阻塞、接收進程阻塞。 用于進程間雙向通信,發送進程和接收進程之間無緩沖。即通信雙方聯系非常緊密,得到對方的應答才能推進。
⑵發送進程不阻塞、接收進程阻塞。 普遍,適合于那些不等待消息的到來就無法繼續工作的進程。如服務器上的服務進程,平時總是處于阻塞狀態,只有在請求服務的消息到達時,它們才會被喚醒以便提供服務。
⑶發送進程和接收進程均不阻塞。 常用于分布式系統中,因為采用阻塞方式進行通信時,一旦傳遞的數據丟失,將會使阻塞進程無限期地等待下去。而采用非阻塞發送、接收的方式就可以避免這種情況。接收進程有消息時就處理消息,無消息時繼續執行。
練習題
1. 服務器進程為多個客戶進程提供服務或資源時,采用(B)的消息傳遞方式較為常見。
A.阻塞發送,阻塞接收
B.不阻塞發送,阻塞接收
C.不阻塞發送,不阻塞接收
D.阻塞發送,不阻塞接收
消息緩沖隊列通信機制
發送進程利用Send原語,將消息直接發送給接收進程;接受進程則利用Receive原語接收消息。
1. 消息緩沖隊列通信機制中的數據結構
(1)消息緩沖區
(2)PCB中有關通信的數據項
增加用于對消息隊列進行操作和實現同步的信號量,并將它們置入進程的PCB中。
消息緩沖通信的過程如下:
- 當某個進程需要向另一個進程發送消息時,便向系統申請一個消息緩沖區,并把要發送的數據送到消息緩沖區;
- 調用Send原語通過OS把該消息插入到接受進程的消息隊列中。
- 接受進程在接受消息時,通過Receive原語從本進程的消息隊列中摘下一個消息緩沖區,即可獲取所需的信息;
- 取出消息后把該消息緩沖區交還給系統。
總結
以上是生活随笔為你收集整理的『操作系统』 进程的描述与控制 Part3 管程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何隐藏文件(九大隐藏文件或者文件夹的方
- 下一篇: python怎么打开dcm文件