摘要:操作系統(tǒng)中,進(jìn)程同步和互斥問題以及與之相關(guān)的信號量機制是教學(xué)過程中的重點和難點問題。本文介紹了教學(xué)實踐中總結(jié)的有關(guān)如何用信號量機制解決進(jìn)程同步與互斥問題的求解規(guī)律及教學(xué)經(jīng)驗,旨在提高教學(xué)效果,促進(jìn)學(xué)生對操作系統(tǒng)基本原理的理解和掌握。最后針對本課程的特點,提出了操作系統(tǒng)今后的教學(xué)研究方向。
關(guān)鍵詞:操作系統(tǒng);教學(xué)研究;進(jìn)程;同步;互斥;信號量
中圖分類號:G642文獻(xiàn)標(biāo)識碼:A文章編號:1009-3044(2009)04-0898-03
The Teaching Experience of Operating System Course
GE Yan, LIU Guo-zhu, DU Jun-wei, CAO Ling
(Institute of Information Science and Technology, Qingdao University of Science and Technology, Qingdao 266061, China)
Abstract: The process synchronization and process mutual exclusion and semaphore mechanism, which are emphases and difficulty in the Operating System course. This paper introduces some teaching experiences about how to imply the semaphore mechanism to solve process synchronization and process mutual exclusion problems, which are summed up in teaching practice. Those key contents would help university students to understand and master the keystone principle. Finally, according to the character of Operating System Course, the new teaching research direction is improved at the end of this paper.
Key words: Operating system; teaching research; process; synchronization; mutual exclusion; semaphore
1 引言
操作系統(tǒng)是計算機系統(tǒng)的核心和靈魂,是計算機系統(tǒng)必不可少的組成部分。操作系統(tǒng)作為計算機專業(yè)的核心課程,不但高校計算機相關(guān)專業(yè)學(xué)習(xí)必須學(xué)習(xí),也是從事計算機應(yīng)用人員必不可少的知識[1]。
操作系統(tǒng)課程的內(nèi)容是由計算機各種操作系統(tǒng)的組成結(jié)構(gòu)、設(shè)計思想、方法和理論綜合而形成。該課程具有以下特點:內(nèi)容龐雜、知識點多、涉及面廣;概念抽象,不易理解;而且實踐性強。學(xué)生在學(xué)習(xí)過程中往往對于一些重要的知識點感到不易理解,難于掌握。因此,需要系統(tǒng)地總結(jié)操作系統(tǒng)中重要知識點的教學(xué)方法,以提高教學(xué)質(zhì)量。
進(jìn)程的同步和互斥是操作系統(tǒng)對計算機系統(tǒng)進(jìn)行管理的核心問題,是操作系統(tǒng)課程的核心知識點,是教學(xué)過程中的重點和難點問題,也是考研的重點內(nèi)容,因此學(xué)生能否很好地理解并掌握這些知識點是影響教學(xué)效果的關(guān)鍵。
本文針對進(jìn)程同步與互斥問題探討操作系統(tǒng)課程的教學(xué)方法,總結(jié)教學(xué)實踐中的一些經(jīng)驗,旨在提高學(xué)生對用信號量機制實現(xiàn)進(jìn)程同步與互斥問題的理解和把握。
2 進(jìn)程同步與互斥
進(jìn)程是并發(fā)執(zhí)行的程序在執(zhí)行過程中分配和管理資源的基本單位。并發(fā)執(zhí)行是為了增強計算機系統(tǒng)的處理能力和提高資源利用率所采取的一種同時操作技術(shù)。在不考慮資源共享的情況下,各進(jìn)程的執(zhí)行是獨立的,執(zhí)行速度是異步的[2]。但是在計算機系統(tǒng)中,由于資源有限又導(dǎo)致了進(jìn)程之間的資源競爭和共享。那么,在進(jìn)程并發(fā)執(zhí)行過程中存在哪些制約呢?
并發(fā)進(jìn)程所受的制約有兩種:直接制約和間接制約。
1) 直接制約,又稱協(xié)作關(guān)系:某些進(jìn)程為完成同一任務(wù)需要分工協(xié)作等待來自其他進(jìn)程的信息,這種相互制約的關(guān)系稱為進(jìn)程同步。
2) 間接制約:進(jìn)程間競爭共有資源——獨占分配到的部分或全部共享資源,這種相互制約的關(guān)系稱為互斥。
并發(fā)進(jìn)程之間的同步和互斥關(guān)系如果處理不好就會產(chǎn)生死鎖。目前最有效的解決方法是信號量機制。
3 信號量機制
信號量機制是由荷蘭科學(xué)家E.W.Dijkstra提出的。他將交通管制中多種顏色的信號燈管理交通的方法引入操作系統(tǒng),讓兩個或多個進(jìn)程通過特殊變量進(jìn)行交互。一個進(jìn)程在某一特殊點上被迫停止執(zhí)行直到接收到一個對應(yīng)的特殊變量值,通過特殊變量這一設(shè)施,任何復(fù)雜的進(jìn)程交互要求都可得到滿足,這種特殊變量稱為信號量(semaphore)。為了通過信號量傳送信號,進(jìn)程可以通過P、V兩個特殊的操作來發(fā)送和接收信號[1]。
在操作系統(tǒng)中,信號量有如下幾個特點:
1) 信號量必須置一次且只能置一次初值。
2) 信號量的初值不能為負(fù)數(shù)。
3) 信號量只能通過初始化和兩個標(biāo)準(zhǔn)的PV原語對其進(jìn)行操作,沒有其他任何方法可以檢查和操作信號量。
4) PV原語是操作系統(tǒng)內(nèi)核中執(zhí)行時不可中斷的過程,不受進(jìn)程調(diào)度的打斷。
5) P原語操作的功能:將信號量s減l;若s<0,則調(diào)用P(s)的進(jìn)程被置成等待信號量s的狀態(tài),然后轉(zhuǎn)進(jìn)程調(diào)度;否則調(diào)用P(s)的進(jìn)程繼續(xù)執(zhí)行。
6) V原語操作的功能:將信號量s加1;若s的值小于或等于0,則喚醒一個等待信號量s的進(jìn)程,然后再返回原進(jìn)程繼續(xù)執(zhí)行或轉(zhuǎn)進(jìn)程調(diào)度;否則調(diào)用P(s)的進(jìn)程繼續(xù)執(zhí)行。
4 用信號量機制實現(xiàn)互斥和同步的方法
用PV操作解決進(jìn)程同步問題時首先應(yīng)確定問題的類型。如果并發(fā)的進(jìn)程間涉及到同一共享資源的使用,則為互斥關(guān)系;如果并發(fā)的進(jìn)程間執(zhí)行順序必須遵守某一規(guī)則,則為同步關(guān)系。當(dāng)然更多的問題中可能既有相互合作的關(guān)系,也有對共享資源的使用,使得進(jìn)程間的制約關(guān)系更為復(fù)雜。
4.1 用信號量機制實現(xiàn)進(jìn)程互斥
在進(jìn)程互斥問題中,要為多個進(jìn)程互斥訪問的臨界資源設(shè)置一個公用信號量mutex,該信號量與所有的并發(fā)進(jìn)程有關(guān)。公用信號量的值反映了可用該公用資源的數(shù)量。
在單純的互斥問題中,在每個進(jìn)程中將臨界區(qū)(進(jìn)程中訪問臨界資源的那段程序代碼)置于P(mutex)和V(mutex)原語之間。其模型如下圖1所示。
圖1中,信號量與PV操作的作用如下:
1) P操作的作用:判斷是否能進(jìn)入臨界區(qū),申請資源;
2) V操作的作用:退出臨界區(qū),釋放資源;
3) 信號量初值設(shè)置為臨界資源的可用個數(shù)。
4.2 用信號量機制實現(xiàn)進(jìn)程同步
與進(jìn)程互斥不同,進(jìn)程同步時的信號量只與制約進(jìn)程及被制約進(jìn)程有關(guān)而不是與整組并發(fā)進(jìn)程有關(guān),所以稱之為私用信號量。
以兩個進(jìn)程生產(chǎn)者和消費者共用同一個緩沖區(qū)發(fā)送和接收信息為例,介紹實現(xiàn)進(jìn)程同步的模型。設(shè)置兩個私用信號量:
empty: 表示緩沖區(qū)是否為空,初值為1。
full: 表示緩沖區(qū)是否為滿,初值為0。
該問題算法描述如圖2所示。
圖2中,P操作的作用是接收信息,判斷是否可以執(zhí)行;V操作的作用是發(fā)送消息告知對方。同一個私用信號量的P操作應(yīng)在接收信息的進(jìn)程中,V操作應(yīng)在發(fā)送信息的進(jìn)程中,只有含有V操作的進(jìn)程發(fā)送消息后,接收進(jìn)程才能執(zhí)行。
4.3 用信號量機制實現(xiàn)復(fù)雜的進(jìn)程同步與互斥問題
多個生產(chǎn)者和多個消費者問題是一個典型的既有進(jìn)程同步又有互斥的混合問題,即:多個生產(chǎn)者,多個消費者,共享多個緩沖區(qū)。其中,生產(chǎn)者與消費者之間要同步,而且還必須互斥地訪問緩沖區(qū)[3]。以該問題的求解為例分析進(jìn)程同步與互斥復(fù)雜問題的求解模型:
1) 定義三個信號量。
①公用信號量mutex:保證生產(chǎn)者進(jìn)程和消費者進(jìn)程之間的互斥,初值為1。
②私用信號量empty:表示緩沖區(qū)中的空單元個數(shù),初值為n;
③私用信號量full:表示緩沖區(qū)中的非空單元個數(shù),初值為0。
2) 算法描述如圖3。
用信號量機制實現(xiàn)進(jìn)程同步與互斥的注意事項如下:
不論是求解進(jìn)程同步還是互斥問題,在一組并發(fā)進(jìn)程中,P、V原語都是成對出現(xiàn)的:
1) 互斥操作時,它們在同一進(jìn)程中;
2) 同步操作時,它們處于不同進(jìn)程。
3) 在同步和互斥的混合問題中,應(yīng)先執(zhí)行用于同步信號量的P操作,然后再執(zhí)行互斥信號量的P操作。
5 用信號量機制實現(xiàn)進(jìn)程互斥和同步的例子
下面以幾個典型的實例,介紹如何利用信號量和PV操作有效地解決進(jìn)程同步與互斥問題。
問題的分析步驟如下:
1) 分析并發(fā)的進(jìn)程間的制約關(guān)系:是互斥、同步還是互斥與同步的混合問題。這一步的分析判斷是至關(guān)重要的。
2) 設(shè)定信號量的個數(shù)、初值和意義。
3) 決定并發(fā)進(jìn)程執(zhí)行過程中調(diào)用P、V操作原語的位置。
5.1 用信號量實現(xiàn)進(jìn)程互斥的例子
五個哲學(xué)家吃通心粉問題是操作系統(tǒng)中經(jīng)典的進(jìn)程互斥問題,如圖4所示。有五個哲學(xué)家圍坐在一個圓桌旁,桌中央有一盤通心粉,每人面前有一只空盤子,每兩人之間放一只叉子,每個哲學(xué)家的行為是思考,感到饑餓,然后吃通心粉。為了吃通心粉,每個哲學(xué)家必須拿到兩只叉子,并且每個人只能直接從自己的左邊或右邊去取叉子。
為了防止出現(xiàn)死鎖,要求奇數(shù)號的哲學(xué)家先取左手邊的叉子,偶數(shù)號的哲學(xué)家先取右手邊的叉子。
哲學(xué)家就餐問題的求解過程如下:
1) 把哲學(xué)家看做是進(jìn)程,進(jìn)程之間是互斥關(guān)系。每一把叉子是相鄰兩個哲學(xué)家共享的公用資源。哲學(xué)家編號i=0-4。
2) 為每一把叉子設(shè)置對應(yīng)的公用信號量,其初始值為1,規(guī)定每個哲學(xué)家左右的叉子和哲學(xué)家的編號相同。
fork[i]: semaphore; i=0,1,2,3,4
fork[i]=1;
3) 算法描述如下:
Process Pi (i=0,1,2,3,4)
begin
思考;
if i mod 2==0 then//偶數(shù)號哲學(xué)家
{P(fork[(i+1)mod5]);//拿右手邊的叉子
P(fork[i]); //拿左手邊的叉子 吃通心粉;
V(fork[(i+1)mod5]); //放下右手邊的叉子
V(fork[i]); //放下左手邊的叉子
}
else//奇數(shù)號哲學(xué)家
{P(fork[i]);//拿左手邊的叉子
P(fork[(i+1)mod5]); //拿右手邊的叉子
吃通心粉;
V(fork[i]);//放下左手邊的叉子
V(fork[(i+1)mod5]); //放下右手邊的叉子
}
end
5.2 用信號量機制實現(xiàn)進(jìn)程同步的例子
把并發(fā)進(jìn)程的同步和互斥問題一般化,可抽象為一般模型:生產(chǎn)者和消費者問題。該問題可以具體劃分為以下四種情況。
①一個生產(chǎn)者、一個消費者共享一個緩沖區(qū)
②一個生產(chǎn)者、一個消費者共享多個緩沖區(qū)
③多個生產(chǎn)者、多個消費者共享一個緩沖區(qū)
④多個生產(chǎn)者、多個消費者共享多個緩沖區(qū)
深入分析生產(chǎn)者和消費者問題將有助于深刻理解如何解決程互斥與同步問題。下面以第二種情況(一個生產(chǎn)者,一個消費者共享多個緩沖區(qū)),介紹進(jìn)程同步問題和進(jìn)程典型的進(jìn)程同步問題。該問題的求解過程如下:
1) 定義用于進(jìn)程同步的私用信號量:
empty: 表示緩沖區(qū)是否為空,初值為n。full: 表示緩沖區(qū)是否為滿,初值為0。
2) 程序描述如圖5。
5.3 用信號量機制實現(xiàn)復(fù)雜的進(jìn)程同步問題
復(fù)雜的生產(chǎn)者——消費者問題:
桌上有一只盤子,只能容納兩個水果,每次只能放入或取出一只水果。爸爸專向盤子中放蘋果(apple),媽媽專向盤子中放桔子(orange),一個兒子專等吃盤子中的桔子,一個女兒專等吃盤子中的蘋果。試用信號量和P、V操作來實現(xiàn)爸爸、媽媽、兒子和女兒之間的同步與互斥關(guān)系[4]。
解題思路:
1) 分析:該問題實質(zhì)上是兩個生產(chǎn)者和兩個消費者被連結(jié)到僅能放兩個個產(chǎn)品的緩沖區(qū)上。生產(chǎn)者需要指明是給哪個消費者的產(chǎn)品,而消費者取走產(chǎn)品后無需特別通知某個生產(chǎn)者,因為空出的緩沖區(qū)(盤子)可以由兩個生產(chǎn)者隨意爭奪。
2) 設(shè)置兩個公用信號量(plate, mutex)和兩個私用信號量(orange, apple)。
plate,控制盤子容納水果數(shù)目;初值為2。
mutex,控制對盤子的互斥訪問,初值為1。
orange表示盤子里有桔子,初值為0。
apple表示盤子里有蘋果,初值為0。
3) 算法描述如圖6。
在進(jìn)程同步和互斥的混合問題中,一定要重點提醒學(xué)生,每個進(jìn)程中各個P操作的次序是重要的:先檢查資源數(shù)目,再檢查是否互斥(否則可能死鎖)。讓學(xué)生思考為什么會產(chǎn)生死鎖,通過思考進(jìn)一步理解進(jìn)程的同步和互斥問題的求解方法。
6 總結(jié)
信號量機制是操作系統(tǒng)管理并發(fā)進(jìn)程執(zhí)行的有效方法。用信號量機制解決進(jìn)程同步與互斥問題是操作系統(tǒng)的重要知識點,是學(xué)生學(xué)習(xí)和理解其他相關(guān)知識點的前提和基礎(chǔ),也是教師講解過程中應(yīng)加以重視的環(huán)節(jié)。例如,進(jìn)程間的消息緩沖通信機制中,需要利用信號量機制實現(xiàn)發(fā)送和接收過程的同步與互斥;文件系統(tǒng)中,也需要利用信號量機制實現(xiàn)讀寫控制。
本文著重介紹了在《操作系統(tǒng)》課程的教學(xué)過程中對用信號量解決進(jìn)程同步與互斥問題這一核心知識點的教學(xué)體會。該教學(xué)方法經(jīng)過多年的教學(xué)實踐,已成為該課程的一個教學(xué)亮點。學(xué)生普遍感覺利用這些系統(tǒng)歸納總結(jié)出的求解思路、求解規(guī)律和求解方法.能夠比較熟練地解決這類問題,反映較好。
《操作系統(tǒng)》課程同其他計算機科學(xué)技術(shù)一樣,其技術(shù)也是日新月異,發(fā)展很快。因而對教學(xué)來說就要緊跟其發(fā)展,了解該學(xué)科的前沿信息。在教學(xué)過程中,充分把握好操作系統(tǒng)課程的特點,歸納出行之有效的教學(xué)方法,提高學(xué)生的學(xué)習(xí)興趣,充分提高學(xué)生的能力。
參考文獻(xiàn):
[1] 孫鐘秀. 操作系統(tǒng)教程[M]. 3版. 北京:高等教育出版社, 2005.
[2] 湯子贏. 計算機操作系統(tǒng)[M]. 西安:西安電子科技大學(xué)出版社,2000.
[3] 張堯?qū)W. 計算機操作系統(tǒng)教程[M]. 北京:清華大學(xué)出版社, 2006.
[4] 史湘寧, 凌云翔. 操作系統(tǒng)典型題解析與實戰(zhàn)模擬[M]. 長沙:國防科技大學(xué)出版社, 2002.
葛艷(1975-),女,山東泰安人,副教授,主要從事計算機專業(yè)教學(xué),智能控制理論與應(yīng)用研究。