二、操作系统——用信号量机制实现进程互斥、同步、前驱关系(详解)
一、什么是進(jìn)程同步?
二、什么是進(jìn)程互斥?
臨界資源:一個(gè)時(shí)間段內(nèi)只允許一個(gè)進(jìn)程使用的資源
為了實(shí)現(xiàn)對(duì)臨界資源的互斥訪問,同時(shí)保證系統(tǒng)整體性能,需要遵循以下原則:
注意:
5. 進(jìn)程同步也可以說是進(jìn)程之間的直接制約(合作)關(guān)系:因?yàn)檫M(jìn)程之間是有直接的合作的,需要進(jìn)程之間進(jìn)行相互配合,各進(jìn)程的工作推進(jìn)需要遵循一定的先后順序
6. 進(jìn)程互斥也可以說是進(jìn)程之間的互斥制約(合作)關(guān)系:因?yàn)檫M(jìn)程之間并沒有直接的合作關(guān)系,他們之間只是想要互斥的使用某種系統(tǒng)的臨界資源,所以才會(huì)產(chǎn)生這種制約關(guān)系
三、信號(hào)量機(jī)制
用戶進(jìn)程可以通過使用操作系統(tǒng)提供的一對(duì)原語來對(duì)信號(hào)量進(jìn)行操作,從而很方便的實(shí)現(xiàn)了進(jìn)程互斥、進(jìn)程同步。
wait、signal原語常簡稱為P、V操作(來自荷蘭語proberen和verhogen)。因此,做題的時(shí)候常把wait(S)、signal(S)兩個(gè)操作分別寫為P(S)、V(S)
1)整型信號(hào)量
2)記錄型信號(hào)量
進(jìn)入wait原語時(shí):
S.value 先進(jìn)行了-1操作,如果S.value的值在經(jīng)過-1操作之后 < 0,則說明原本的S.value的值是<=0的,而S.value的數(shù)值其實(shí)就代表著資源的數(shù)量,所以資源的數(shù)量是 <= 0, 則需要使用block原語來使該進(jìn)程由運(yùn)行態(tài)進(jìn)入阻塞態(tài),并掛到信號(hào)量S的等待(阻塞)隊(duì)列中。
進(jìn)入signal原語時(shí):
S.value 先進(jìn)行了+1操作,如果S.value的值在經(jīng)過+1操作之后 <= 0,則說明原本的S.value的值是<= -1的,而此時(shí)的S.value的數(shù)值的絕對(duì)值可以理解為等待隊(duì)列中的進(jìn)程數(shù)量,所以等待隊(duì)列中的進(jìn)程數(shù)量是 >= 1的, 則需要使用wakeup原語來喚醒等待隊(duì)列中的一個(gè)進(jìn)程(即位于隊(duì)頭的進(jìn)程),讓該進(jìn)程從阻塞態(tài)變?yōu)榫途w態(tài)。
四、用信號(hào)量機(jī)制實(shí)現(xiàn)進(jìn)程互斥
為什么要把互斥信號(hào)量mutex的初值設(shè)置為1?
答:信號(hào)量的初值其實(shí)表示的是系統(tǒng)中某種資源的數(shù)量,而臨界區(qū)在一個(gè)時(shí)間段內(nèi)也只能運(yùn)行一個(gè)進(jìn)程對(duì)它進(jìn)行訪問,所以我們可以把臨界區(qū)也理解成一種特殊的資源,并且這個(gè)資源只有一個(gè),也就是說臨界區(qū)只能被分配給一個(gè)進(jìn)程使用。只有這個(gè)進(jìn)程釋放了這個(gè)臨界區(qū)資源之后,才能被其他進(jìn)程訪問。
在臨界區(qū)之前執(zhí)行P(mutex)
在臨界區(qū)之后執(zhí)行V(mutex)
P、V操作必須成對(duì)出現(xiàn)。缺少P(mutex)就不能保證臨界資源的互斥訪問。缺少V(mutex)會(huì)導(dǎo)致資源永不被釋放,等待進(jìn)程永不被喚醒。
五、用信號(hào)量機(jī)制實(shí)現(xiàn)進(jìn)程同步
六、用信號(hào)量機(jī)制實(shí)現(xiàn)前驅(qū)關(guān)系
對(duì)于前驅(qū)圖的理解:只有S1執(zhí)行完之后,才能執(zhí)行S2、S3。而只有S2執(zhí)行完之后,才能執(zhí)行S4、S5。剩下的以此類推。。。
其實(shí),前驅(qū)關(guān)系可以看作是多層的同步關(guān)系
記住:
總結(jié)
以上是生活随笔為你收集整理的二、操作系统——用信号量机制实现进程互斥、同步、前驱关系(详解)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python找不到文件怎么办_pytho
- 下一篇: 七、操作系统——动态分区分配算法(详解)