張瓊聲 蔣玉新 李春華 劉童璇
摘要:進(jìn)程是資源分配和獨(dú)立運(yùn)行的基本單位,是操作系統(tǒng)的核心概念。“操作系統(tǒng)”教學(xué)中,進(jìn)程的概念以及進(jìn)程管理的實(shí)現(xiàn)原理抽象難懂,初學(xué)者難以掌握。本文闡述如何以圖形化方式設(shè)計(jì)和實(shí)現(xiàn)進(jìn)程管理的演示系統(tǒng),以輔助課堂教學(xué)。該系統(tǒng)的演示內(nèi)容包括:進(jìn)程的概念、進(jìn)程創(chuàng)建、進(jìn)程組織、進(jìn)程關(guān)系管理、進(jìn)程阻塞、進(jìn)程喚醒、進(jìn)程撤銷、進(jìn)程調(diào)度、進(jìn)程同步。
關(guān)鍵詞:進(jìn)程管理;演示系統(tǒng);操作系統(tǒng)
中圖分類號(hào):G642 文獻(xiàn)標(biāo)識(shí)碼:B
1前言
進(jìn)程管理是操作系統(tǒng)原理最主要的教學(xué)內(nèi)容之一,而進(jìn)程及進(jìn)程的控制原理是學(xué)生學(xué)習(xí)的重點(diǎn)和難點(diǎn)。如何使學(xué)生能夠在較短的時(shí)間內(nèi),深入了解進(jìn)程的概念及進(jìn)程控制的原理,如何把進(jìn)程的概念與程序運(yùn)行的軟硬件環(huán)境的變化聯(lián)系起來(lái)?如何把進(jìn)程管理的功能與數(shù)據(jù)結(jié)構(gòu)和算法的實(shí)現(xiàn)結(jié)合起來(lái)?使學(xué)生從根本上掌握進(jìn)程的概念,理解操作系統(tǒng)中進(jìn)程管理功能的實(shí)現(xiàn)原理和實(shí)現(xiàn)技術(shù),把抽象的理論與具體的實(shí)現(xiàn)技術(shù)結(jié)合起來(lái)?是“操作系統(tǒng)”課程教學(xué)面臨的重要問(wèn)題。
進(jìn)程管理演示系統(tǒng)主要用于輔助課堂教學(xué),試圖將抽象的理論與系統(tǒng)設(shè)計(jì)、實(shí)現(xiàn)的具體技術(shù)相結(jié)合,通過(guò)動(dòng)態(tài)的、圖形化的界面表現(xiàn)進(jìn)程概念的本質(zhì)、進(jìn)程管理的過(guò)程、進(jìn)程管理功能與數(shù)據(jù)結(jié)構(gòu)和算法實(shí)現(xiàn)的關(guān)系。把抽象的概念和原理實(shí)例化。幫助學(xué)生直觀地、深入地理解進(jìn)程的概念和進(jìn)程管理功能存在的必要性以及相應(yīng)的實(shí)現(xiàn)技術(shù)。
本系統(tǒng)主要實(shí)現(xiàn)進(jìn)程概念、進(jìn)程控制、進(jìn)程調(diào)度、進(jìn)程同步行為和實(shí)現(xiàn)原理的演示。該系統(tǒng)的特點(diǎn)是用圖形化的方式把操作系統(tǒng)原理與程序?qū)崿F(xiàn)結(jié)合起來(lái)。論文詳細(xì)說(shuō)明了該演示系統(tǒng)的設(shè)計(jì)方案與實(shí)現(xiàn)技術(shù)。
2系統(tǒng)設(shè)計(jì)
2.1系統(tǒng)模塊結(jié)構(gòu)
本系統(tǒng)包括進(jìn)程概念、進(jìn)程控制、進(jìn)程調(diào)度、進(jìn)程同步四個(gè)演示模塊。其中進(jìn)程控制演示模塊包括進(jìn)程創(chuàng)建、進(jìn)程終止、進(jìn)程阻塞與喚醒三個(gè)演示子模塊。進(jìn)程調(diào)度演示模塊包括單級(jí)隊(duì)列調(diào)度和多級(jí)隊(duì)列調(diào)度演示兩個(gè)子模塊。進(jìn)程同步演示模塊包括進(jìn)程互斥和讀者—寫者問(wèn)題演示兩個(gè)子模塊。
本系統(tǒng)用VC++6.0開發(fā),采用單文檔結(jié)構(gòu),所有演示過(guò)程都在視圖中通過(guò)VC控件交互實(shí)現(xiàn)。系統(tǒng)使用了延時(shí)機(jī)制,每當(dāng)執(zhí)行一個(gè)過(guò)程使界面發(fā)生變化或執(zhí)行了關(guān)鍵步驟后,執(zhí)行一個(gè)延時(shí)函數(shù),從而給用戶足夠的時(shí)間觀察界面的變化。
2.2進(jìn)程組織
(1) 鏈表組織
本系統(tǒng)實(shí)現(xiàn)多個(gè)進(jìn)程鏈表,包括總進(jìn)程鏈表、多個(gè)優(yōu)先權(quán)不同的就緒進(jìn)程鏈表和三個(gè)對(duì)應(yīng)不同阻塞事情的阻塞進(jìn)程鏈表。
(2) 進(jìn)程樹
系統(tǒng)按照進(jìn)程的親屬關(guān)系,建立進(jìn)程樹,實(shí)現(xiàn)了進(jìn)程樹的管理和圖形顯示。
(3) 進(jìn)程標(biāo)識(shí)符PID的管理
每一個(gè)進(jìn)程都有唯一的內(nèi)部標(biāo)識(shí)符PID,本系統(tǒng)通過(guò)循環(huán)使用來(lái)達(dá)到有限PID資源的合理利用。當(dāng)進(jìn)程創(chuàng)建時(shí)分配可用的PID,當(dāng)進(jìn)程終止時(shí),釋放占用的PID。
2.3進(jìn)程執(zhí)行過(guò)程的模擬
本系統(tǒng)通過(guò)定時(shí)器和執(zhí)行時(shí)間來(lái)模擬進(jìn)程的執(zhí)行過(guò)程。
創(chuàng)建進(jìn)程時(shí),給進(jìn)程一個(gè)隨機(jī)的執(zhí)行時(shí)間。執(zhí)行時(shí)間長(zhǎng)短根據(jù)系統(tǒng)參數(shù)配置進(jìn)行靈活控制。進(jìn)程同步中對(duì)臨界資源的訪問(wèn)過(guò)程也通過(guò)訪問(wèn)時(shí)間來(lái)模擬,根據(jù)進(jìn)程的執(zhí)行時(shí)間,進(jìn)程訪問(wèn)臨界資源的時(shí)間總是定義為一個(gè)比總執(zhí)行時(shí)間小的值。
給定進(jìn)程的執(zhí)行時(shí)間后,通過(guò)定時(shí)器控制進(jìn)程的執(zhí)行。進(jìn)程執(zhí)行一條指令用一個(gè)定時(shí)周期來(lái)模擬,在定時(shí)處理函數(shù)中對(duì)進(jìn)程控制塊的相關(guān)數(shù)據(jù)進(jìn)行修改并同步在界面上更新顯示,從而模擬出進(jìn)程的執(zhí)行過(guò)程。當(dāng)定時(shí)周期數(shù)等于給定的進(jìn)程執(zhí)行時(shí)間時(shí)(本系統(tǒng)在進(jìn)程控制塊中添加了已執(zhí)行時(shí)間來(lái)記錄執(zhí)行進(jìn)度,該值就等于定時(shí)周期數(shù)),進(jìn)程正常結(jié)束。
2.4進(jìn)程概念演示模塊
本模塊通過(guò)顯示當(dāng)前進(jìn)程的PCB信息、CPU寄存器的變化來(lái)演示進(jìn)程概念。模擬了進(jìn)程實(shí)體、進(jìn)程控制塊、動(dòng)態(tài)特征、短暫存在性、進(jìn)程切換、并發(fā)執(zhí)行、獨(dú)立性等特點(diǎn)。
系統(tǒng)界面上顯示的進(jìn)程信息都直接或間接地從進(jìn)程控制塊中獲取。
2.5進(jìn)程控制演示模塊
(1) 進(jìn)程創(chuàng)建演示模塊
本模塊實(shí)現(xiàn)進(jìn)程創(chuàng)建過(guò)程的演示。用戶可以輸入新進(jìn)程的外部標(biāo)識(shí)符即進(jìn)程名稱,若用戶沒(méi)有輸入,則系統(tǒng)自動(dòng)為進(jìn)程命名,每一個(gè)進(jìn)程的創(chuàng)建都是有引發(fā)事件的,用戶可以在界面上選擇一個(gè)引發(fā)進(jìn)程創(chuàng)建的事件。當(dāng)用戶點(diǎn)擊“創(chuàng)建進(jìn)程”按鈕時(shí)就開始執(zhí)行創(chuàng)建進(jìn)程過(guò)程并同步顯示進(jìn)程創(chuàng)建的每一個(gè)執(zhí)行步驟。
(2) 進(jìn)程終止演示模塊
本模塊實(shí)現(xiàn)并演示各種不同情況下進(jìn)程終止的過(guò)程。用戶可以通過(guò)輸入PID來(lái)終止某個(gè)進(jìn)程,也可以通過(guò)選擇界面上進(jìn)程列表中的某個(gè)進(jìn)程來(lái)終止被選中的進(jìn)程。執(zhí)行態(tài)進(jìn)程被終止后要轉(zhuǎn)進(jìn)程調(diào)度程序。
(3) 進(jìn)程阻塞與喚醒演示模塊
本模塊實(shí)現(xiàn)并演示進(jìn)程阻塞與喚醒的過(guò)程。進(jìn)程執(zhí)行過(guò)程中用戶可以選擇阻塞事件并阻塞當(dāng)前進(jìn)程。當(dāng)有阻塞態(tài)進(jìn)程時(shí),用戶可以選擇相關(guān)事件喚醒阻塞列表中的進(jìn)程。
本模塊設(shè)置了三個(gè)阻塞事件:打印機(jī)服務(wù)、I/O設(shè)備操作和無(wú)新數(shù)據(jù)輸入。
2.6進(jìn)程調(diào)度演示模塊
本模塊實(shí)現(xiàn)了單級(jí)隊(duì)列調(diào)度和多級(jí)隊(duì)列調(diào)度的演示。分別實(shí)現(xiàn)了搶占、非搶占、優(yōu)先級(jí)、時(shí)間片等調(diào)度策略的模擬。多級(jí)隊(duì)列調(diào)度的演示,模擬了Minix的三級(jí)隊(duì)列(任務(wù)級(jí)、服務(wù)級(jí)和用戶級(jí))調(diào)度 ,定義了三個(gè)優(yōu)先級(jí)不同的就緒隊(duì)列。
2.7進(jìn)程同步演示模塊
(1) 進(jìn)程互斥演示模塊
本模塊實(shí)現(xiàn)并演示了多個(gè)進(jìn)程互斥訪問(wèn)同一個(gè)臨界資源的控制過(guò)程。通過(guò)該演示過(guò)程,使用戶了解操作系統(tǒng)是如何實(shí)現(xiàn)進(jìn)程對(duì)臨界資源的互斥訪問(wèn)的。
本模塊中,對(duì)臨界資源的訪問(wèn)可以由用戶控制,也可以系統(tǒng)自動(dòng)控制。即在進(jìn)程執(zhí)行過(guò)程中,用戶可以發(fā)送訪問(wèn)臨界資源的命令,讓其執(zhí)行訪問(wèn)臨界資源的過(guò)程。自動(dòng)控制的設(shè)計(jì)是若某進(jìn)程沒(méi)有訪問(wèn)過(guò)臨界資源,則令其在執(zhí)行過(guò)程的最后時(shí)間段自動(dòng)訪問(wèn)臨界資源。
(2) 讀者—寫者問(wèn)題演示模塊
本模塊演示多個(gè)讀進(jìn)程與寫進(jìn)程同步訪問(wèn)共享數(shù)據(jù)區(qū)的管理過(guò)程。創(chuàng)建進(jìn)程時(shí),用戶要指定新進(jìn)程的類別(讀者進(jìn)程或?qū)懻哌M(jìn)程)。用戶可以通過(guò)進(jìn)程列表選擇任何進(jìn)程執(zhí)行,執(zhí)行過(guò)程中,用戶可以隨時(shí)讓進(jìn)程訪問(wèn)資源。
2.8系統(tǒng)參數(shù)配置
本系統(tǒng)為了靈活控制演示過(guò)程并滿足用戶的需要,設(shè)置了一些配置參數(shù),如定時(shí)周期、最小或最大延時(shí)時(shí)間、最小或最大執(zhí)行時(shí)間、優(yōu)先級(jí)、最大進(jìn)程數(shù)等。
2.9系統(tǒng)界面設(shè)計(jì)
演示界面設(shè)計(jì)如圖1所示:
3系統(tǒng)實(shí)現(xiàn)
3.1進(jìn)程控制塊PCB
(1)PCB結(jié)構(gòu)體定義
structPCB
{
//進(jìn)程標(biāo)識(shí)符信息
UINTnPID; //進(jìn)程的內(nèi)部標(biāo)識(shí)符
CString szName; //進(jìn)程的外部標(biāo)識(shí)符
PCB *pParent; //進(jìn)程的父進(jìn)程指針
PCB *pFirstChild; //進(jìn)程的子進(jìn)程指針
PCB *pNextSibling; //兄弟進(jìn)程指針
//處理機(jī)狀態(tài)信息
DWORD dwPC; //下一條指令地址
DWORD dwPSW; //程序狀態(tài)字
DWORD dwCS; //段地址
DWORD dwPageTableAddr; //最外層頁(yè)表地址,32位
//進(jìn)程調(diào)度信息
UINT iState; //進(jìn)程的狀態(tài)
UINT iPriority; //進(jìn)程的優(yōu)先級(jí)
UINT iPriorUpSteps; //優(yōu)先級(jí)動(dòng)態(tài)提升的級(jí)數(shù)
int nTotalTime; //進(jìn)程的總執(zhí)行時(shí)間
int nHasExecTime; //進(jìn)程已經(jīng)執(zhí)行的時(shí)間
int nWaitTime; //等待時(shí)間
UINT iWaitEvent; //等待事件
UINT iCritSrcSort; //進(jìn)程訪問(wèn)的臨界資源類別
int nCritSrcTotalT;
//進(jìn)程訪問(wèn)臨界資源的總時(shí)間
int nCritSrcHasExecT;
//進(jìn)程已經(jīng)訪問(wèn)臨界資源 的時(shí)間
UINT iCritSrcVisitPos;
//進(jìn)程訪問(wèn)臨界資源的階段
//進(jìn)程控制信息
int nKernelStackPos;//內(nèi)核棧指針位置
UINT iUser; //進(jìn)程的用戶名
UINT iSort; //進(jìn)程的類別
UINT nWaitedSema; //已經(jīng)等待過(guò)信號(hào)量的標(biāo)志
list_headpTasksList; //進(jìn)程鏈表的指針
list_head pStateList; //鏈接狀態(tài)鏈表的指針
RECT *aAddrSpace[3];//關(guān)聯(lián)進(jìn)程三部分模擬空間
};
(2)PCB結(jié)構(gòu)體說(shuō)明
? 組織進(jìn)程關(guān)系的域
pParent記錄每一個(gè)進(jìn)程的父進(jìn)程,pFirstChild記錄第一個(gè)兒子,pNextSibling記錄下一個(gè)兄弟,通過(guò)這種方式記錄了整個(gè)父子關(guān)系樹,進(jìn)程關(guān)系的管理通過(guò)這三個(gè)域?qū)崿F(xiàn)。
? 記錄寄存器信息的域
dwPC、dwPSW、dwCS、dwPageTableAddr分別保存了當(dāng)前CPU中主要的寄存器信息,通過(guò)這些信息來(lái)管理進(jìn)程并發(fā)執(zhí)行以及獨(dú)立運(yùn)行。dwPC在每一次定時(shí)處理中加1,模擬一條指令的執(zhí)行,dwPSW在執(zhí)行過(guò)程中隨機(jī)變化,模擬指令執(zhí)行對(duì)CPU標(biāo)志的影響。每個(gè)進(jìn)程的dwCS和dwPageTableAddr值不同且不變,在創(chuàng)建進(jìn)程時(shí)要保證它們的唯一性。
? 優(yōu)先級(jí)
iPriority是進(jìn)程的優(yōu)先級(jí)。本系統(tǒng)設(shè)定了六種優(yōu)先級(jí),分別為PRIO_REALTIME(實(shí)時(shí))、PRIO_HIGHER(高)、PRIO_UPSTANDARD(高于標(biāo)準(zhǔn))、PRIO_STANDARD(標(biāo)準(zhǔn))、PRIO_DOWNSTANDARD(低于標(biāo)準(zhǔn))、PRIO_LOWER(低)。該值是動(dòng)態(tài)的,在某些模塊中,創(chuàng)建進(jìn)程時(shí)系統(tǒng)自動(dòng)設(shè)為PRIO_STANDARD(標(biāo)準(zhǔn));在某些模塊中,創(chuàng)建進(jìn)程時(shí)由用戶指定。在所有模塊中,每一次進(jìn)程調(diào)度時(shí)根據(jù)nWaitTime(等待時(shí)間)以及系統(tǒng)參數(shù)m_nUpPrioSpan(優(yōu)先級(jí)升級(jí)的基數(shù),針對(duì)等待時(shí)間)對(duì)就緒進(jìn)程的iPriority值進(jìn)行相應(yīng)的修改,但最高只能升級(jí)到PRIO_HIGHER(高)。
? 執(zhí)行時(shí)間
nTotalTime是進(jìn)程的執(zhí)行時(shí)間,它決定了進(jìn)程的生存期,用于控制進(jìn)程的執(zhí)行。系統(tǒng)進(jìn)程(0號(hào)進(jìn)程和1號(hào)進(jìn)程)的PCB中,其值為-1,表示進(jìn)程一直存在。
? 已執(zhí)行時(shí)間
nHasExecTime是進(jìn)程的已執(zhí)行時(shí)間,用于控制進(jìn)程的執(zhí)行進(jìn)度。進(jìn)程執(zhí)行時(shí),在每一次定時(shí)處理中加該域值1,當(dāng)它等于nTotalTime時(shí),表示進(jìn)程執(zhí)行完畢。
? 等待時(shí)間
nWaitTime是進(jìn)程的等待時(shí)間,用于動(dòng)態(tài)修改進(jìn)程的優(yōu)先級(jí),該值在每一次定時(shí)處理中加1,但執(zhí)行態(tài)進(jìn)程的nWaitTime始終為0,只有當(dāng)執(zhí)行態(tài)進(jìn)程切換為其它狀態(tài)時(shí),才開始累積該值。當(dāng)進(jìn)程的狀態(tài)發(fā)生改變而鏈入到其它狀態(tài)鏈表中時(shí),該值清0。
? 等待事件
iWaitEvent是進(jìn)程的等待事件,本系統(tǒng)將此值的范圍進(jìn)行了擴(kuò)充。對(duì)于就緒進(jìn)程,該值為WAIT_CPU(等待CPU);對(duì)于執(zhí)行態(tài)進(jìn)程,該值為WAIT_NULL(沒(méi)有等待事件);對(duì)于阻塞進(jìn)程,該值表示阻塞事件,可以取值為WAIT_PRINTER(等待打印機(jī)),WAIT_IOSTREAM(等待I/O設(shè)備),WAIT_NEWDATA(等待新數(shù)據(jù));在進(jìn)程同步模塊中,對(duì)于等待臨界資源的進(jìn)程該值為WAIT_CRITSRC (等待臨界資源),等待的資源保存在iCritSrcSort中。
? 訪問(wèn)的臨界資源種類
iCritSrcSort是進(jìn)程訪問(wèn)臨界資源的種類,也就是對(duì)應(yīng)的信號(hào)量類別。本系統(tǒng)中可以取值為CRITSRC_PRINTER (打印機(jī)資源)、CRITSRC_GLOBAL (全局變量資源)、CRITSRC_READWRITE(讀寫資源)。對(duì)于不需要訪問(wèn)臨界資源的進(jìn)程來(lái)說(shuō)該值為CRITSRC_NULL(無(wú)臨界資源)。
? 訪問(wèn)臨界資源的時(shí)間
nCritSrcTotalT是進(jìn)程訪問(wèn)臨界資源的總時(shí)間,用于控制進(jìn)程對(duì)臨界資源的訪問(wèn)過(guò)程,該值是在進(jìn)程創(chuàng)建時(shí)根據(jù)nTotalTime隨機(jī)產(chǎn)生的,總是小于nTotalTime。
? 已訪問(wèn)臨界資源時(shí)間
nCritSrcHasExecT是進(jìn)程已訪問(wèn)臨界資源的時(shí)間,用于控制進(jìn)程訪問(wèn)臨界資源的進(jìn)度,在定時(shí)處理中加1,當(dāng)?shù)扔趎CritSrcTotalT時(shí)表示訪問(wèn)臨界資源結(jié)束,該域主要在進(jìn)程同步模塊中使用,在其他模塊中該值一律為0。
? 訪問(wèn)臨界資源的階段
iCritSrcVisitPos是進(jìn)程對(duì)臨界資源的訪問(wèn)階段,可以取值為CRITSRC_VISIT_NULL(沒(méi)有訪問(wèn)),CRITSRC_ VISIT_ENTEY(進(jìn)入?yún)^(qū))、CRITSRC_VISIT_CRITICAL(臨界區(qū))、CRITSRC_VISIT_EXIT(退出區(qū))、CRITSRC_ VISIT_FINISH(完成訪問(wèn)),該域用于標(biāo)識(shí)和記錄進(jìn)程訪問(wèn)資源階段,在進(jìn)程同步模塊中使用。
? 內(nèi)核棧棧頂位置
nKernelStackPos模擬進(jìn)程的內(nèi)核棧指針位置,即棧頂位置,創(chuàng)建進(jìn)程時(shí)置為0,模擬進(jìn)程執(zhí)行過(guò)程中內(nèi)核棧的變化,該域主要在進(jìn)程概念演示模塊中使用。
? 進(jìn)程用戶名
iUser是進(jìn)程的用戶名,可以取值為SYSTEM(系統(tǒng))和USER(用戶)。本系統(tǒng)中為了能夠比較全面地模擬操作系統(tǒng)中的進(jìn)程,設(shè)置了0號(hào)系統(tǒng)進(jìn)程和1號(hào)系統(tǒng)進(jìn)程。
? 進(jìn)程類別
iSort是進(jìn)程的類別,可以取值為NORMALTASK(一般進(jìn)程)、READTASK(讀者進(jìn)程)、WRITETASK(寫者進(jìn)程),該域主要用于區(qū)分進(jìn)程同步模塊中的讀寫進(jìn)程,在其他模塊中,該值為NORMALTASK(一般進(jìn)程)。
? 等待信號(hào)量標(biāo)志
nWaitedSema用于進(jìn)程同步模塊,用來(lái)標(biāo)識(shí)進(jìn)程訪問(wèn)臨界資源過(guò)程中,是否執(zhí)行過(guò)wait(s)原語(yǔ),因?yàn)楫?dāng)進(jìn)程申請(qǐng)信號(hào)量失敗被阻塞后,它已經(jīng)對(duì)信號(hào)量值進(jìn)行減一操作了,當(dāng)再次被喚醒時(shí),是從被阻塞的位置往下執(zhí)行的,即不會(huì)再檢查信號(hào)量值了,由于本系統(tǒng)是模擬這一過(guò)程,需要一個(gè)標(biāo)志來(lái)做判斷,而進(jìn)程訪問(wèn)臨界資源的過(guò)程中可能要涉及多個(gè)信號(hào)量,所以將nWaitedSema定義為UINT類型,否則會(huì)使信號(hào)量值發(fā)生錯(cuò)誤。
? 鏈表鏈接域
pTasksList和pStateList用于鏈接進(jìn)程鏈表,它們都是list_head類型的通用雙向循環(huán)鏈表。list_head結(jié)構(gòu)的定義:
structlist_head
{
struct list_head * pPre;
struct list_head * pNext;
PCB * pThisPcb;
};
? 模擬內(nèi)存空間
aAddrSpace是一個(gè)具有三個(gè)元素的數(shù)組,用來(lái)模擬進(jìn)程的邏輯內(nèi)存空間,是RECT類型的。本系統(tǒng)用三個(gè)矩形模擬進(jìn)程三部分(正文段、用戶數(shù)據(jù)段和系統(tǒng)數(shù)據(jù)段)在內(nèi)存中的分布,在界面上顯示出來(lái),直觀地表示出進(jìn)程實(shí)體。在進(jìn)程創(chuàng)建演示中,由于要演示資源分配的過(guò)程,所以在進(jìn)程創(chuàng)建時(shí)對(duì)該數(shù)組進(jìn)程賦值(根據(jù)顯示區(qū)域合理的產(chǎn)生隨機(jī)值),而其它模塊中,在需要顯示進(jìn)程實(shí)體的分布時(shí)才給該數(shù)組賦值。
3.2信號(hào)量
在進(jìn)程同步演示模塊中,用到了記錄型信號(hào)量。
(1) 信號(hào)量結(jié)構(gòu)體定義
structSEMAPHORE
{
int nValue; //資源數(shù)量
CProcessLink * pBlockLink; //阻塞鏈表
};
(2) 結(jié)構(gòu)體說(shuō)明
每一個(gè)信號(hào)量都有一個(gè)標(biāo)識(shí)臨界資源數(shù)量的值,即結(jié)構(gòu)體中的nValue。在本系統(tǒng)的進(jìn)程同步模塊中,用到的都是互斥信號(hào)量,所以nValue初值都是1。當(dāng)該值小于0時(shí),nValue的絕對(duì)值表示阻塞鏈表中的等待進(jìn)程數(shù)。
因等待臨界資源而不能繼續(xù)執(zhí)行的進(jìn)程阻塞相應(yīng)信號(hào)量的阻塞鏈表中,該鏈表就是結(jié)構(gòu)體中的pBlockLink,當(dāng)進(jìn)程釋放臨界資源訪問(wèn)權(quán)時(shí),若判斷得出還有等待該資源的進(jìn)程,就從該鏈表中喚醒第一個(gè)進(jìn)程。
3.3模塊類
模塊類是本系統(tǒng)中實(shí)現(xiàn)進(jìn)程管理系統(tǒng)演示的核心類。由于本系統(tǒng)有多個(gè)模塊,且各個(gè)模塊具有一些共同特性,所以定義了一個(gè)基類CDlgPage,并定義了繼承類CDlgPage的各個(gè)模塊或子模塊類,如圖2所示。每個(gè)模塊都有一些重要的成員,說(shuō)明如下:
? m_pCurRunPcb指向當(dāng)前將要執(zhí)行的進(jìn)程或當(dāng)前正在執(zhí)行的進(jìn)程。
? m_nCurTimerEvent記錄定時(shí)器定時(shí)標(biāo)志。
? m_pTasksLink指向總進(jìn)程鏈表。
? m_pSysIdleTask是0號(hào)系統(tǒng)進(jìn)程,m_pSysInitTask是1號(hào)系統(tǒng)進(jìn)程,每個(gè)模塊中都有這兩個(gè)模擬的系統(tǒng)進(jìn)程,這兩個(gè)進(jìn)程在第一次演示當(dāng)前模塊時(shí)創(chuàng)建,一直存在。
? m_nProNum是當(dāng)前模塊中的進(jìn)程數(shù)。
? m_pSysInitTask是1號(hào)系統(tǒng)進(jìn)程。
? m_nProNum是當(dāng)前模塊中的進(jìn)程數(shù)。
? virtual void InitPage()該函數(shù)的功能是在用戶切換到當(dāng)前模塊時(shí)進(jìn)行一些初始化操作,即控件創(chuàng)建、信息顯示、等操作。
? virtual void ClearPage()該函數(shù)的功能是對(duì)當(dāng)前演示模塊進(jìn)行相關(guān)清除操作,即刪除界面控件、清除其它界面顯示、清除模塊對(duì)象與標(biāo)志記錄等操作。
用戶在切換演示模塊時(shí)先調(diào)用被切換模塊對(duì)象的ClearPage()函數(shù),再調(diào)用切換到的模塊對(duì)象的InitPage()函數(shù),從而實(shí)現(xiàn)演示模塊的切換。
4總結(jié)
本系統(tǒng)結(jié)合多種控件以及延時(shí)、同步刷新界面和突出顯示變化效果等實(shí)現(xiàn)了圖形化的進(jìn)程管理模擬系統(tǒng),達(dá)到了較好的演示效果。進(jìn)程管理中各個(gè)模塊獨(dú)立實(shí)現(xiàn),能較好地輔助操作系統(tǒng)原理的課堂教學(xué)。系統(tǒng)代碼結(jié)構(gòu)清晰,功能豐富,方案設(shè)計(jì)合理,擴(kuò)展性強(qiáng),有良好的交互性,有助于學(xué)生直觀、具體地理解進(jìn)程管理原理。
參考文獻(xiàn):
[1] 湯子瀛,哲鳳評(píng),湯小丹. 計(jì)算機(jī)操作系統(tǒng)原理(修訂版)[M].西安:西安電子科技大學(xué)出版社,2001:26-79.
[2] 陳莉君. 深入分析Linux內(nèi)核源代碼[M].北京:人民郵電出版社,2002:97-138.
[3] DANIEL P.BOVET,MARCO CESATI.深入理解Linux內(nèi)核[M].3版.陳莉君,譯.北京:中國(guó)電力出版社,2007:84-134,258-265.
[4] Andrew S.Tanenbaum. 操作系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[M]. 北京:電子工業(yè)出版社,1998:19-49.