摘要:操作系統(tǒng)實踐教學(xué)應(yīng)該為學(xué)生提供一個實驗環(huán)境,使學(xué)生能夠觸摸到真實的操作系統(tǒng)內(nèi)部,幫助學(xué)生理解抽象的操作系統(tǒng)原理和機制;使學(xué)生能夠親身體驗操作系統(tǒng)功能的設(shè)計和實現(xiàn)過程,培養(yǎng)學(xué)生應(yīng)用操作系統(tǒng)知識的能力。本文分析了操作系統(tǒng)實踐教學(xué)的目標,闡述了具體實驗項目及其設(shè)計理念。
關(guān)鍵詞:操作系統(tǒng);實踐教學(xué);實驗設(shè)計
中圖分類號:G642文獻標識碼:B
文章編號:1672-5913 (2007) 20-0008-03
1引言
操作系統(tǒng)是計算機科學(xué)與技術(shù)專業(yè)的一門重要基礎(chǔ)課程,其教學(xué)目的使學(xué)生通過學(xué)習(xí)各種資源管理的原理和機制,建立起關(guān)于操作系統(tǒng)如何工作的理論知識基礎(chǔ)。但操作系統(tǒng)同時也是學(xué)生們認為比較難學(xué)的專業(yè)課程之一。其原因有二:一是操作系統(tǒng)課程講述的是計算機資源管理的原理和機制,其中包含了許多抽象的概念和算法;二是操作系統(tǒng)作為最底層的核心軟件,深藏于“用戶界面”之下,學(xué)生們難以找到學(xué)習(xí)內(nèi)容的參照對象。因此,操作系統(tǒng)實踐教學(xué)作為教學(xué)輔助環(huán)節(jié)十分重要,它的作用在于通過動手做實驗,幫助學(xué)生解決從抽象理論到具體對象的認識問題,培養(yǎng)學(xué)生應(yīng)用知識解決問題的能力。
與程序設(shè)計、編譯原理和數(shù)據(jù)庫等軟件課程的實踐教學(xué)相比,操作系統(tǒng)課程的實踐教學(xué)有其特殊的地方。前者可以通過實現(xiàn)一個小型的應(yīng)用程序或簡化的編譯器、數(shù)據(jù)庫來完成實踐教學(xué),而后者不能這樣做。因為操作系統(tǒng)不僅與硬件平臺密切相關(guān),而且內(nèi)部結(jié)構(gòu)非常復(fù)雜,即使讓學(xué)生實現(xiàn)一個最簡單的操作系統(tǒng)也是不現(xiàn)實的。近年來,我們以開源的Linux操作系統(tǒng)和WMware虛擬機作為實踐平臺,針對不同的教學(xué)對象和教學(xué)要求,精心設(shè)計了多種方式的實驗項目,在操作系統(tǒng)實踐教學(xué)上做了一些有益的探索。本文首先分析操作系統(tǒng)實踐教學(xué)的目標,然后說明如何具體設(shè)計實驗項目。
2實踐教學(xué)目標
我們認為,操作系統(tǒng)實踐教學(xué)作為輔助教學(xué)環(huán)節(jié),有兩個主要目標。
(1) 幫助學(xué)生理解操作系統(tǒng)的基本概念、原理和機制
操作系統(tǒng)包含了許多抽象的基本概念如進程、線程和虛存,也包含了復(fù)雜的資源管理算法和機制,如進程調(diào)度和頁式存儲管理。這些知識對于本科學(xué)生而言是比較難以理解的,因為他們平時使用的是操作系統(tǒng)的用戶界面,很少也很難窺視到操作系統(tǒng)的內(nèi)部。操作系統(tǒng)的實踐教學(xué)應(yīng)該讓學(xué)生了解一個真實操作系統(tǒng)的內(nèi)部實現(xiàn),從而幫助學(xué)生更好地理解操作系統(tǒng)的基本概念、原理和機制。
我們采用開源的Linux操作系統(tǒng)作為實踐教學(xué)的教材,指導(dǎo)學(xué)生閱讀和分析Linux的部分源碼,將學(xué)生帶入一個真實而復(fù)雜的操作系統(tǒng)內(nèi)部世界。在閱讀和分析源碼的過程中,學(xué)生能夠了解抽象的進程和線程所對應(yīng)的具體數(shù)據(jù)結(jié)構(gòu),了解進程調(diào)度算法的實現(xiàn)過程,并應(yīng)用所學(xué)的操作系統(tǒng)原理知識分析和討論Linux的調(diào)度策略。另外,我們要求學(xué)生在做每項實驗前自學(xué)Linux操作系統(tǒng)的相關(guān)知識,使學(xué)生清楚地看到操作系統(tǒng)的原理知識是如何體現(xiàn)在一個實際系統(tǒng)中的。
(2) 培養(yǎng)學(xué)生應(yīng)用操作系統(tǒng)知識的能力
操作系統(tǒng)是計算機系統(tǒng)的核心軟件,從事計算機行業(yè)的專業(yè)人員都需要操作系統(tǒng)的原理知識,但他們擔任的角色不同,面臨的問題就不同,因而所具備的操作系統(tǒng)知識的應(yīng)用能力也不同。系統(tǒng)管理員需要根據(jù)操作系統(tǒng)知識和用戶的需求,合理地配置系統(tǒng)資源,需要及時了解系統(tǒng)運行狀態(tài),調(diào)整資源管理策略,使系統(tǒng)性能達到最佳;系統(tǒng)程序員需要詳細了解操作系統(tǒng)的內(nèi)核結(jié)構(gòu)、資源管理機制和功能模塊接口,為操作系統(tǒng)添加新功能或編寫設(shè)備驅(qū)動程序;應(yīng)用程序員則需要正確理解操作系統(tǒng)的功能和資源管理策略,編寫出高效率且安全的應(yīng)用軟件。操作系統(tǒng)的實踐教學(xué)必須考慮到上述不同能力培養(yǎng)的特點,以滿足學(xué)生未來任職需要。
我們以開源的Linux操作系統(tǒng)和WMware虛擬機作為實踐平臺,精心設(shè)計實驗項目,從多個方面培養(yǎng)學(xué)生應(yīng)用操作系統(tǒng)知識的能力。例如,學(xué)習(xí)使用Linux的proc文件系統(tǒng),對內(nèi)核運行狀態(tài)、資源管理狀態(tài)和進程運行狀態(tài)進行動態(tài)查詢;學(xué)習(xí)Linux的系統(tǒng)調(diào)用機制和內(nèi)核模塊動態(tài)加載機制,掌握為操作系統(tǒng)添加新功能的方法和過程;編寫進程通信應(yīng)用程序,掌握各種進程通信、同步互斥機制的特點和使用方法。
3實驗項目設(shè)計
我們在上述的實踐教學(xué)目標的指導(dǎo)下,設(shè)計了多個實驗項目,內(nèi)容涵蓋了操作系統(tǒng)的主要知識點,包括用戶界面、進程通信、proc文件系統(tǒng)、系統(tǒng)調(diào)用機制、進程調(diào)度、內(nèi)核同步互斥機制、驅(qū)動程序接口等??紤]到學(xué)生的知識和經(jīng)驗背景,實驗項目的安排從簡到難,從依靠指導(dǎo)到自主設(shè)計。除必做的實驗項目外,還設(shè)計了選做的實驗項目,為有能力的同學(xué)提供更多的學(xué)習(xí)空間。下面分別介紹我們設(shè)計的九個實驗項目。其中,前三個實驗項目是為應(yīng)用程序員和系統(tǒng)管理員設(shè)計的,使學(xué)生掌握如何使用操作系統(tǒng)的命令界面、進程機制和系統(tǒng)性能管理工具;第4個實驗安排學(xué)生閱讀和分析源碼,理解操作系統(tǒng)原理在實際系統(tǒng)中的實現(xiàn)過程;后五個實驗項目是為系統(tǒng)程序員設(shè)計的,讓學(xué)生體驗操作系統(tǒng)內(nèi)核編程的全過程。
(1)Linux命令界面及shell編程
該項實驗的目的是學(xué)習(xí)使用操作系統(tǒng)的命令用戶界面。實驗內(nèi)容是:了解和使用Linux的常用命令,包括如何使用聯(lián)機幫助手冊和管道線命令;學(xué)習(xí)使用命令程序語言shell進行簡單的編程,從而理解命令解釋程序的工作過程。由于學(xué)生平時使用的是windows的圖形用戶界面,面對Linux的命令界面感到很陌生。所以,我們先給學(xué)生一個shell例子程序,讓學(xué)生按照說明步驟上機運行該程序,然后要求學(xué)生參照此程序?qū)崿F(xiàn)一個應(yīng)用管道線的shell程序。
(2) 進程間通信
該項實驗的目的是加強學(xué)生對進程概念的理解,使學(xué)生掌握不同的進程通信和同步互斥機制的特點和使用方法。實驗內(nèi)容是:設(shè)計應(yīng)用程序?qū)崿F(xiàn)父、子進程之間的數(shù)據(jù)交換,可采用各種方法實現(xiàn)父子進程之間的通信(共享區(qū)、文件、消息傳遞、管道文件)和同步互斥控制(信號量、信號)。
(3) 使用proc文件系統(tǒng)
該項實驗的目的是學(xué)習(xí)如何使用Linux的proc文件系統(tǒng),對內(nèi)核運行狀態(tài)、資源管理狀態(tài)和進程運行狀態(tài)進行動態(tài)查詢。實驗內(nèi)容有:先通過課堂講授讓學(xué)生了解proc文件系統(tǒng)的設(shè)計思想、工作原理和組織結(jié)構(gòu),然后要求學(xué)生利用proc文件系統(tǒng)中的數(shù)據(jù)來說明操作系統(tǒng)或進程的某些特性。例如,利用/proc/stat中的數(shù)據(jù)顯示CPU的使用情況——系統(tǒng)利用率和用戶利用率;利用/proc/intr中的數(shù)據(jù)顯示內(nèi)存容量對缺頁異常次數(shù)的影響。
(4) 分析進程調(diào)度算法和策略
該項實驗的目的是幫助學(xué)生深入理解進程調(diào)度過程,培養(yǎng)學(xué)生分析和研究問題的能力。實驗內(nèi)容是:閱讀和理解Linux的進程調(diào)度函數(shù)schedule()、進程數(shù)據(jù)結(jié)構(gòu)task_struct等內(nèi)核源碼,分析和研究Linux的進程調(diào)度算法和策略,寫出研究論文。要求學(xué)生在論文中討論以下問題:進程調(diào)度隊列是如何組織的;如何實現(xiàn)三種調(diào)度類型(SCHED_FIFO, SCHED_RR, SCHED_OHTER);進程的優(yōu)先級是如何定義和動態(tài)變化的;如何決定時間片的大小以及它與優(yōu)先級的關(guān)系;對實時進程和多CPU的支持;評價Linux的調(diào)度策略并提出改進意見。
(5)Linux內(nèi)核編譯
該項實驗的目的是學(xué)習(xí)如何生成新內(nèi)核,為后面進行操作系統(tǒng)內(nèi)核編程的實驗做準備。實驗內(nèi)容有:學(xué)習(xí)如何下載和解壓源碼,了解Linux內(nèi)核源碼的組織結(jié)構(gòu),學(xué)習(xí)配置、編譯、安裝和啟動Linux新內(nèi)核的全部過程。
(6) 添加系統(tǒng)調(diào)用
該項實驗的目的是讓學(xué)生理解操作系統(tǒng)的重要機制——系統(tǒng)調(diào)用機制的工作過程,學(xué)習(xí)如何添加系統(tǒng)調(diào)用。實驗內(nèi)容是:閱讀源碼文件,分析系統(tǒng)調(diào)用表等內(nèi)核數(shù)據(jù)結(jié)構(gòu);實現(xiàn)新的系統(tǒng)調(diào)用函數(shù),添加新的系統(tǒng)調(diào)用,編譯和生成新內(nèi)核;編寫應(yīng)用程序,驗證新系統(tǒng)調(diào)用的功能。
(7) 加載內(nèi)核模塊
該項實驗的目的是學(xué)習(xí)動態(tài)增加內(nèi)核功能的方法。內(nèi)核模塊動態(tài)加載/卸載是操作系統(tǒng)的另一重要機制,它使得用戶不僅能動態(tài)裁剪內(nèi)核功能,還能通過自己編寫內(nèi)核模塊或使用第三方軟件來動態(tài)增加內(nèi)核功能。實驗內(nèi)容有:首先通過課堂講授讓學(xué)生了解Linux模塊機制的工作原理、模塊的編程和編譯方法,然后要求學(xué)生采用內(nèi)核模塊編程方法,為proc文件系統(tǒng)添加一個新文件。在該項實驗中,學(xué)生不僅要學(xué)習(xí)內(nèi)核模塊的編程、編譯、加載和卸載全過程,還需要查找資料和閱讀源碼,搞清楚proc文件系統(tǒng)中關(guān)于創(chuàng)建文件、讀/寫文件和刪除文件的函數(shù)接口,以此鍛煉學(xué)生的自主動手的能力。
(8) 實現(xiàn)同步事件原語
該項實驗的目的是學(xué)習(xí)如何實現(xiàn)同步互斥機制。實驗內(nèi)容是,實現(xiàn)一組同步事件原語:能夠使多個進程阻塞在某個特定的事件上,直到另一個進程產(chǎn)生該事件,從而喚醒所有在此事件上阻塞的進程。這是一項綜合的復(fù)雜實驗。實驗者需要分析清楚同步事件原語的語義以及進程同步過程中的所有細節(jié)問題,正確設(shè)計同步事件的數(shù)據(jù)結(jié)構(gòu)和系統(tǒng)調(diào)用原型,分析Linux源碼中關(guān)于進程等待隊列和內(nèi)核信號量的相關(guān)函數(shù),并利用這些函數(shù)實現(xiàn)同步事件原語的系統(tǒng)調(diào)用。然后,采用內(nèi)核模塊方法將新的系統(tǒng)調(diào)用添加到Linux內(nèi)核中,并通過應(yīng)用程序驗證其正確性。
(9) 實現(xiàn)虛擬管道設(shè)備
該項實驗的目的是學(xué)習(xí)如何編寫驅(qū)動程序。實驗內(nèi)容是:使用內(nèi)存區(qū)(例如2048字節(jié))實現(xiàn)一個虛擬的字符管道設(shè)備:允許多個進程向管道寫入數(shù)據(jù),也允許多個進程從管道讀出數(shù)據(jù),保證數(shù)據(jù)的寫入順序與讀出順序是一致的。這也是一項綜合的復(fù)雜實驗,實驗者需要分析研究讀/寫管道設(shè)備過程中的同步互斥問題,利用內(nèi)核信號量函數(shù)和進程阻塞/喚醒函數(shù)解決同步互斥問題;分析研究Linux的字符設(shè)備驅(qū)動程序接口,學(xué)習(xí)如何編寫和注冊驅(qū)動程序的接口函數(shù)以及如何建立Linux設(shè)備文件。然后,采用內(nèi)核模塊方法將新功能添加到Linux內(nèi)核中,并通過應(yīng)用程序驗證其正確性。
4結(jié)束語
操作系統(tǒng)實踐教學(xué)應(yīng)該為學(xué)生提供一個實驗環(huán)境,使學(xué)生能夠觸摸真實的操作系統(tǒng)內(nèi)核,從而更好地理解操作系統(tǒng)的基本概念、原理和機制;使學(xué)生能夠親身體驗操作系統(tǒng)功能的設(shè)計和實現(xiàn)過程,培養(yǎng)學(xué)生應(yīng)用操作系統(tǒng)知識的能力。我們在操作系統(tǒng)實踐教學(xué)中做了一些有益的工作,教學(xué)效果也不錯,但還存在一些問題有待于進一步研究和探索。例如,如何與課堂教學(xué)互補,進一步激發(fā)學(xué)生學(xué)習(xí)操作系統(tǒng)的興趣;如何通過構(gòu)建實驗平臺將操作系統(tǒng)中更多的內(nèi)核機制(中斷機制、內(nèi)存管理機制等)呈現(xiàn)給學(xué)生;如何設(shè)計更為實用的、學(xué)生自主性更強的實驗項目,等等。
參考文獻
[1] 羅宇. 操作系統(tǒng)課程設(shè)計[M]. 北京:機械工業(yè)出版社,2004.
[2] 陳莉君. 深入理解Linux內(nèi)核[M]. 北京:中國電力出版社,2004.
[3] 李善平. 邊學(xué)邊干—Linux內(nèi)核指導(dǎo)[M]. 浙江大學(xué)出版社,2002.
作者簡介
鄧勝蘭(1961-),國防科技大學(xué)計算機學(xué)院研究員,曾經(jīng)多年從事巨型機操作系統(tǒng)的研制工作,目前主要從事操作系統(tǒng)的教學(xué)工作。
寧洪(1961-),國防科技大學(xué)計算機學(xué)院教授,長期從事軟件工程和數(shù)據(jù)庫的教學(xué)科研工作,曾榮獲全軍優(yōu)秀教師稱號。