管程的特点
管程將共享變量和對(duì)它們的操作集中在一個(gè)模塊中,操作系統(tǒng)或并發(fā)程序就由這樣的模塊構(gòu)成。這樣模塊之間聯(lián)系清晰,便于維護(hù)和修改,易于保證正確性。
從語(yǔ)言的角度看,管程主要有以下特性:
(1)模塊化。管程是一個(gè)基本程序單位,可以單獨(dú)編譯;?
(2)抽象數(shù)據(jù)類型。管程是中不僅有數(shù)據(jù),而且有對(duì)數(shù)據(jù)的操作;?
(3)信息掩蔽。管程外可以調(diào)用管程內(nèi)部定義的一些函數(shù),但函數(shù)的具體實(shí)現(xiàn)外部不可見(jiàn);?
對(duì)于管程中定義的共享變量的所有操作都局限在管程中,外部只能通過(guò)調(diào)用管程的某些函數(shù)來(lái)間接訪問(wèn)這些變量。因此管程有很好的封裝性。管程通常是用于管理資源的,因此管程中有進(jìn)程等待隊(duì)列和相應(yīng)的等待和喚醒操作。
管程有一個(gè)很重要的特性,即任一時(shí)刻管程中只能有一個(gè)活躍進(jìn)程,這一特性使管程能有效地完成互斥。管程是編程語(yǔ)言的組成部分,編譯器知道它們的特殊性,因此可以采用與其他過(guò)程調(diào)用不同的方法來(lái)處理對(duì)管程的調(diào)用。典型的處理方法是,當(dāng)一個(gè)進(jìn)程調(diào)用管程過(guò)程時(shí),該過(guò)程中的前幾條指令將檢查在管程中是否有其他的活躍進(jìn)程。如果有,調(diào)用進(jìn)程將被掛起,直到另一個(gè)進(jìn)程離開(kāi)管程將其喚醒。如果沒(méi)有活躍進(jìn)程在使用管程,則該調(diào)用進(jìn)程可以進(jìn)入。? ? 進(jìn)入管程時(shí)的互斥由編譯器負(fù)責(zé),但通常的做法是用一個(gè)互斥量或二元信號(hào)量。在任一時(shí)刻,寫(xiě)管程的人無(wú)須關(guān)心編譯器是如何實(shí)現(xiàn)互斥的。他只需知道將所有的臨界區(qū)轉(zhuǎn)換成管程過(guò)程即可,決不會(huì)有兩個(gè)進(jìn)程同時(shí)執(zhí)行臨界區(qū)中的代碼。
? ? 在管程入口有一個(gè)等待隊(duì)列,稱為入口等待隊(duì)列。當(dāng)一個(gè)已進(jìn)入管程的進(jìn)程等待時(shí),就釋放管程的互斥使用權(quán);當(dāng)已進(jìn)入管程的一個(gè)進(jìn)程喚醒另一個(gè)進(jìn)程時(shí),兩者必須有一個(gè)退出或停止使用管程。在管程內(nèi)部,由于執(zhí)行喚醒操作,可能存在多個(gè)等待進(jìn)程(等待使用管程),稱為緊急等待隊(duì)列,它的優(yōu)先級(jí)高于入口等待隊(duì)列。 一個(gè)進(jìn)程進(jìn)入管程之前要先申請(qǐng);離開(kāi)時(shí)釋放使用權(quán),如果緊急等待隊(duì)列不空,則喚醒第一個(gè)等待者。
總結(jié)
- 上一篇: question: student_li
- 下一篇: 管程,进程及线程之间的区别