學(xué)習(xí)材料:計算機操作系統(tǒng)(第2版,人民郵電出版社)
一、進(jìn)程控制
概念:是對系統(tǒng)中的所有進(jìn)程實施有效的管理,是處理機管理功能的一部分。為了實現(xiàn)共享,協(xié)調(diào)并發(fā)進(jìn)程的關(guān)系。進(jìn)程管理的功能應(yīng)包括:進(jìn)程控制、進(jìn)程調(diào)度、實現(xiàn)進(jìn)程之間的同步協(xié)調(diào)和通信。
1)進(jìn)程創(chuàng)建
- 系統(tǒng)啟動時,創(chuàng)建并產(chǎn)生一些必須的、承擔(dān)系統(tǒng)資源分配的管理工作的系統(tǒng)進(jìn)程。
- 用戶進(jìn)程,用戶在程序提交給系統(tǒng)時創(chuàng)建的。
- 進(jìn)程創(chuàng)建也是進(jìn)程管理的基本功能之一。用戶不能直接創(chuàng)建進(jìn)程,只能通過操作系統(tǒng)提供進(jìn)程創(chuàng)建原語,以系統(tǒng)請求方式向操作系統(tǒng)申請一個進(jìn)程。
2)進(jìn)程撤銷
功能:
撤銷本進(jìn)程,撤銷一個指定標(biāo)識符的進(jìn)程或撤銷一組子進(jìn)程。
過程:
- 由運行指針得到當(dāng)前進(jìn)程的PCB。
- 釋放本進(jìn)程所占用的資源給父進(jìn)程。
- 釋放此PCB結(jié)構(gòu)。
- 轉(zhuǎn)進(jìn)程調(diào)度。
3)進(jìn)程阻塞與喚醒
進(jìn)程阻塞:進(jìn)程需要等待某一時間完成時,調(diào)用阻塞原語將自己掛起。進(jìn)程一旦被掛起,它只能由另一個進(jìn)程喚醒。也就是,先停止調(diào)用進(jìn)程的執(zhí)行,將CPU現(xiàn)場保留到該進(jìn)程的PCB現(xiàn)場保護(hù)區(qū)(也即完成了多少工作,將其保存),改變其狀態(tài)為等待,并插入等待隊列。最后使控制轉(zhuǎn)向進(jìn)程調(diào)度。
本質(zhì):進(jìn)程需要等待某一資源,指令無法繼續(xù)執(zhí)行,此時將進(jìn)程掛起,調(diào)度其他進(jìn)程。
進(jìn)程喚醒:當(dāng)進(jìn)程等待的事件發(fā)生時,喚醒等待該事件的進(jìn)程。
進(jìn)城喚醒的步驟:
- 將該進(jìn)程移出等待隊列。
- 置進(jìn)程狀態(tài)為就緒。
- 將進(jìn)程PCB插入就緒隊列。
4)進(jìn)程約束關(guān)系
分兩種情況:
1.競爭系統(tǒng)資源而引起的間接相互制約關(guān)系。
2.進(jìn)程之間存在共享數(shù)據(jù)而引起的直接相互制約關(guān)系。
重點:進(jìn)程互斥
臨界資源:通常把一次僅允許一個進(jìn)程使用的資源稱為臨界資源。一般輸入機,打印機等都有這種性質(zhì)。
臨界區(qū):每個進(jìn)程中,訪問該臨界資源的那段程序稱為臨界區(qū)。是進(jìn)程對公共變量或存儲區(qū)進(jìn)行訪問與修改的程序段。
上面那些滿足條件的進(jìn)程進(jìn)入臨界區(qū)必須互斥!
互斥:多進(jìn)程對公共存儲區(qū)這樣的臨界資源有這樣的恩特店,共享的各方不能同時讀寫同一數(shù)據(jù)區(qū),只有當(dāng)一方讀寫完畢后,另一方才可以讀寫。這種進(jìn)程的制約關(guān)系稱之為互斥。
重點:進(jìn)程同步
概念:相互合作的一組并發(fā)進(jìn)程。在一些關(guān)鍵點上可能需要互相等待與互通消息,這種相互制約的等待與互通消息稱為進(jìn)程同步。
重點:同步機構(gòu)
首先,鎖。包含上鎖和開鎖兩種操作。鎖就是一個物理實體,采用一個標(biāo)志(上鎖開鎖標(biāo)志)代表某種資源的狀態(tài)或并發(fā)程序當(dāng)前的狀態(tài)。
鎖同步機構(gòu)中,每一個共享的臨界資源都要有一個單獨的鎖位。“0”表示資源可用,“1”表示資源被占用。
進(jìn)程使用共享資源之前必須完成如下操作:
1)檢測鎖位的值。 2)如果原來的值為0,將鎖位置置1 。 3)如果原來為1,返回1再考察(有一定時間間隔),不是立即。
使用完資源后,將鎖置0,稱為開鎖。PV操作。S為可用資源。
P操作:1)S--,相當(dāng)于占用了一個資源。2)減完大于等于0,進(jìn)程繼續(xù)執(zhí)行(相當(dāng)于還有資源或資源剛好夠用)。3)小于0(缺少資源,等待),該進(jìn)程被封鎖,并將它插入到該信號燈的等待隊列中,轉(zhuǎn)入調(diào)度。
V操作:1)s++,提供一個資源。 2)相加結(jié)果大于0,進(jìn)程繼續(xù)執(zhí)行。 3)相加結(jié)果小于或等于0,等待隊列移出一個進(jìn)程(它獲得了剛釋放出來的資源)。然后返回本進(jìn)程繼續(xù)執(zhí)行。
進(jìn)程同步的兩個例子:
一、病員就診:
- 分為看病進(jìn)程,化驗進(jìn)程。
- 首先看病進(jìn)程執(zhí)行一部分,開出化驗單,轉(zhuǎn)入化驗進(jìn)程。
- 化驗進(jìn)程化驗完畢得到化驗結(jié)果,并發(fā)送給看病進(jìn)程轉(zhuǎn)入,否則必須等待。
我們用PV操作來實現(xiàn),首先先要理解的是,下面的程序是需要來回轉(zhuǎn)入轉(zhuǎn)出的,不是一個程序執(zhí)行到底,這也體現(xiàn)了進(jìn)程同步的概念。
下面是偽代碼:
main()
{
int s1=0;//信號燈1,表示看病進(jìn)程,也可以理解為有無化驗單
int s2=0;//信號燈2,表示化驗進(jìn)程,也可以理解為有無化驗結(jié)果
cobegin
labora();
diagnosis();
coend
}
labora()
{
while(化驗工作未完成)
{
p(s1);
化驗工作;
v(s2);
}
}
diagnosis()
{
while(看病工作未完成)
{
看病;
v(s1); //看完病才會提供化驗單
p(s2);
diagnosis;
}
}
解讀:
- 首先執(zhí)行l(wèi)abora(),缺少s1,掛起。
- 進(jìn)入diagnosis(),執(zhí)行看病,看完病v(s1)提供化驗所需要的資源(可以理解為提供了化驗單,化驗工作才能進(jìn)行)。
- p(s2),s2是化驗進(jìn)程,可以理解為缺少化驗進(jìn)程完的結(jié)果,所以掛起,執(zhí)行l(wèi)abora()。
- 執(zhí)行化驗工作,然后提供化驗結(jié)果(即提供了v(s2))。
- 化驗進(jìn)程結(jié)束,轉(zhuǎn)入診斷進(jìn)程,執(zhí)行p(s2),可以理解為獲得了化驗進(jìn)程的結(jié)果才能診斷,最后進(jìn)程完成。
生產(chǎn)者——消費者問題
概念:簡單地來說,就是有一塊公用緩沖區(qū),生產(chǎn)者生產(chǎn)資源,將資源放置到緩沖區(qū)去,而消費者讀消息進(jìn)程, 從緩沖區(qū)提取資源。
設(shè)置:公用緩沖區(qū)是臨界資源,因此設(shè)置三個信號燈empty,full,mutex,分別表示空緩沖區(qū)(默認(rèn)為緩沖區(qū)大小n),滿緩沖區(qū)(初始為0),以及互斥信號燈,占用時為1,占用后為0。
//生產(chǎn)者和消費者操作過程中的偽代碼:
producer()
{
while(生產(chǎn)未完成)
{
……
生產(chǎn)一個產(chǎn)品;
p(empty);
p(mutex);
送到有界緩沖區(qū);
v(mutex);
v(full);
}
}
consumer()
{
while(還要繼續(xù)消費)
{
p(full);
p(mutex);
從有界緩沖區(qū)取產(chǎn)品;
v(mutex);
v(empty);
……
消費一個產(chǎn)品;
}
}
試想:如果把生產(chǎn)者前兩行申請占用資源的代碼換一下,會發(fā)生什么情況?
提示:死鎖。