楊雪
摘 要: 計(jì)算機(jī)專業(yè)的學(xué)生需要更多地關(guān)心計(jì)算系統(tǒng)的整體特性。計(jì)算機(jī)科學(xué)與技術(shù)專業(yè)教學(xué)指導(dǎo)分委員會系統(tǒng)研究組對課程在系統(tǒng)能力培養(yǎng)方面的作用進(jìn)行了層次劃分,操作系統(tǒng)屬于重組內(nèi)容的核心課程。為探討操作系統(tǒng)課程對學(xué)生系統(tǒng)能力培養(yǎng)的作用,以在Windows平臺開展“生產(chǎn)者-消費(fèi)者”實(shí)驗(yàn)為例,探討了在操作系統(tǒng)實(shí)驗(yàn)課中運(yùn)用“啟發(fā)式”教學(xué)法。
關(guān)鍵詞: 系統(tǒng)能力培養(yǎng); 啟發(fā)式教學(xué)法; 操作系統(tǒng); “生產(chǎn)者-消費(fèi)者”實(shí)驗(yàn)
中圖分類號:G642 文獻(xiàn)標(biāo)志碼:A 文章編號:1006-8228(2015)04-68-03
Abstract: Computer science students need to be more concerned about the overall characteristics of the computing system and their ability of developing application systems. The system research group of computer science and technology teaching steering committee have divided the curriculums into several partitions relying on their role of culturing students' system ability. According to their division, operating system course belongs to curriculums reorganizing the core content. In order to explore the role of this course in culturing students' system ability, taking the "producer-consumer" experiment as an example, the application of heuristic teaching in OS experiment lessons is proposed.
Key words: culturing students' system ability; heuristic teaching; Operating System; the "producer-consumer" experiment
0 引言
2013年,教育部計(jì)算機(jī)科學(xué)與技術(shù)專業(yè)教學(xué)指導(dǎo)委員會系統(tǒng)研究組提出要加強(qiáng)學(xué)生系統(tǒng)能力培養(yǎng),明確指出學(xué)生的系統(tǒng)能力核心是:“在掌握計(jì)算系統(tǒng)基本原理的基礎(chǔ)上,熟悉如何進(jìn)一步開發(fā)構(gòu)建以計(jì)算技術(shù)為核心的應(yīng)用系統(tǒng)。”同時建議把計(jì)算機(jī)專業(yè)課程分成三個層次,即:計(jì)算機(jī)系統(tǒng)基礎(chǔ)課程、重組內(nèi)容的核心課程和側(cè)重不同計(jì)算系統(tǒng)的若干相關(guān)平臺應(yīng)用課程。操作系統(tǒng)課程被劃分到第二層次,是計(jì)算機(jī)系統(tǒng)能力培養(yǎng)最基本的核心課程[1]。
操作系統(tǒng)課程具有概念抽象、系統(tǒng)性差、原理性強(qiáng)等特點(diǎn),教師授課難度較大,學(xué)生在學(xué)習(xí)過程中也往往感到非常抽象和難以理解。要將課程中抽象的原理與具體繁瑣的操作系統(tǒng)實(shí)現(xiàn)技術(shù)有機(jī)結(jié)合起來,并以比較直觀的、易于理解和易于掌握的形式展現(xiàn),就必須輔以相應(yīng)的實(shí)驗(yàn)。然而,以知識傳授為核心的靜態(tài)實(shí)驗(yàn)教學(xué)方式(即教師在課堂上把實(shí)驗(yàn)原理、目的、步驟及注意事項(xiàng)均詳細(xì)講解一遍,學(xué)生只需按部就班地操作,用不著查資料,也不需思考實(shí)驗(yàn)中還有沒有需要改進(jìn)的地方。)會使學(xué)生完全處于被動狀態(tài),壓抑他們的學(xué)習(xí)興趣和主動參與實(shí)驗(yàn)的積極性[2]?!皢l(fā)式”教學(xué)法與傳統(tǒng)的灌輸式教學(xué)不同,它更強(qiáng)調(diào)學(xué)生在教師的引領(lǐng)和啟示下,主動參與到發(fā)現(xiàn)問題、尋求答案的過程中,從而提高他們獨(dú)立思考、解決問題的能力[3]。下面以操作系統(tǒng)原理中經(jīng)典的“生產(chǎn)者-消費(fèi)者”實(shí)驗(yàn)為例,對在實(shí)驗(yàn)課中應(yīng)用“啟發(fā)式”教學(xué)法培養(yǎng)學(xué)生的系統(tǒng)能力進(jìn)行初步探索。
1 問題描述
“生產(chǎn)者-消費(fèi)者”是一個著名的進(jìn)程同步問題。它描述的是:有一群生產(chǎn)者進(jìn)程在生產(chǎn)產(chǎn)品,并將這些產(chǎn)品提供給消費(fèi)者進(jìn)程去消費(fèi)。為使生產(chǎn)者進(jìn)程和消費(fèi)者進(jìn)程能并發(fā)執(zhí)行,在兩者之間設(shè)置了一個具有n個緩沖區(qū)的緩沖池,生產(chǎn)者進(jìn)程可以將其所生產(chǎn)的產(chǎn)品放入一個緩沖區(qū)中;消費(fèi)者進(jìn)程可從一個緩沖區(qū)中取走產(chǎn)品去消費(fèi)。盡管所有的生產(chǎn)者進(jìn)程和消費(fèi)者進(jìn)程都是以異步方式運(yùn)行的,但它們之間必須保持同步,既不允許消費(fèi)者進(jìn)程到一個空緩沖區(qū)去取產(chǎn)品,也不允許生產(chǎn)者進(jìn)程向一個已裝滿產(chǎn)品且尚未被取走的緩沖區(qū)中投放產(chǎn)品[4]。
“生產(chǎn)者-消費(fèi)者”實(shí)驗(yàn)安排在“經(jīng)典的進(jìn)程同步問題”理論課之后。通過學(xué)習(xí),學(xué)生已經(jīng)熟悉“生產(chǎn)者-消費(fèi)者”模型,知道各進(jìn)程應(yīng)該互斥地使用緩沖池,且生產(chǎn)者進(jìn)程和消費(fèi)者進(jìn)程之間需要用信號量同步。生產(chǎn)者和消費(fèi)者進(jìn)程通過信號量實(shí)現(xiàn)同步和互斥的偽代碼如表1所示。
表1中,P操作實(shí)現(xiàn)信號量的申請,V操作實(shí)現(xiàn)信號量的釋放。緩沖池是臨界資源,用長度為n的數(shù)組buffer[]表示,每個元素buffer[i]都是一個緩沖區(qū),用來存儲生產(chǎn)者生產(chǎn)的產(chǎn)品?;コ饬縨utex保證各進(jìn)程互斥地訪問緩沖池,初始值為1。生產(chǎn)者和消費(fèi)者分別用in和out來操作緩沖池中的各緩沖區(qū),并通過信號量full和empty同步。full代表緩沖池中存有產(chǎn)品的緩沖區(qū)的個數(shù),初始值為0;empty代表緩沖池中沒有存放產(chǎn)品的緩沖區(qū)的個數(shù),初始值為n。
2 組織實(shí)施
為減少學(xué)生對教師的依賴,加大他們在實(shí)驗(yàn)中的參與度,培養(yǎng)他們的系統(tǒng)能力,我們把“生產(chǎn)者-消費(fèi)者”實(shí)驗(yàn)的組織劃分為三個階段:課前布置任務(wù)、課內(nèi)檢查引導(dǎo)、課后收集反饋。
2.1 課前布置任務(wù)
為加大學(xué)生對實(shí)驗(yàn)的參與度,我們在實(shí)驗(yàn)課前向?qū)W生明確實(shí)驗(yàn)任務(wù)并提供相關(guān)API函數(shù)的簡單說明,要求學(xué)生學(xué)習(xí)資料并思考“生產(chǎn)者-消費(fèi)者”模型實(shí)現(xiàn)的方法。
2.1.1 明確實(shí)驗(yàn)任務(wù)
在理解“生產(chǎn)者-消費(fèi)者”模型的基礎(chǔ)上,利用多線程技術(shù)模擬實(shí)現(xiàn)一組生產(chǎn)者和消費(fèi)者;并假設(shè)這些生產(chǎn)者和消費(fèi)者等效,即:只要緩沖池未滿,生產(chǎn)者就可將產(chǎn)品送入緩沖池;只要緩沖池非空,消費(fèi)者就可以從中取產(chǎn)品進(jìn)行消費(fèi)。
2.1.2 提供學(xué)習(xí)資料
由于大多數(shù)學(xué)生在本次實(shí)驗(yàn)前未接觸過多線程編程,因此我們向?qū)W生提供一些與偽代碼中各操作相對應(yīng)的Windows API?!吧a(chǎn)者-消費(fèi)者”實(shí)驗(yàn)涉及到創(chuàng)建生產(chǎn)者與消費(fèi)者、操作信號量及使用臨界資源。我們整理了與之對應(yīng)的三類函數(shù)供學(xué)生預(yù)習(xí),分別是多線程操作函數(shù)、信號量操作函數(shù)和互斥量操作函數(shù)(通過互斥量保證生產(chǎn)者和消費(fèi)者對臨界資源互斥訪問)。多線程操作函數(shù)包括創(chuàng)建線程的函數(shù)_beginthreadex()和等待多個線程結(jié)束的函數(shù)WaitForMultipleObject()。信號量操作函數(shù)包括創(chuàng)建信號量的函數(shù)CreateSemaphore()、申請信號量的函數(shù)WaitForSingleObject()和釋放信號量的函數(shù)ReleaseSemaphore()。互斥量操作函數(shù)包括創(chuàng)建互斥量的函數(shù)CreateMutex()、申請互斥量的函數(shù)WaitForSingleObject()和釋放互斥量的函數(shù)ReleaseMutex()。當(dāng)生產(chǎn)者和消費(fèi)者完成所有工作后,需要銷毀線程、信號量和互斥量等資源。線程、信號量和互斥量都是內(nèi)核級資源,用CloseHandle()函數(shù)銷毀。
需要注意的是,我們只對上述函數(shù)進(jìn)行簡單說明,學(xué)生需要借助互聯(lián)網(wǎng)等資源學(xué)習(xí)它們的具體使用方法。
2.1.3 提出具體要求
提供預(yù)習(xí)資料的同時要求學(xué)生思考:實(shí)現(xiàn)“生產(chǎn)者-消費(fèi)者”模型應(yīng)考慮哪些技術(shù)細(xì)節(jié)?
2.2 課內(nèi)檢查引導(dǎo)
與教師詳細(xì)講解實(shí)驗(yàn)原理、目的、步驟及注意事項(xiàng),學(xué)生只需按部就班地操作不同,啟發(fā)式教學(xué)法注重發(fā)揮學(xué)生在實(shí)驗(yàn)課上的主動性,積極引導(dǎo)學(xué)生思考并對學(xué)生的結(jié)論進(jìn)行總結(jié),從而完成實(shí)驗(yàn)。本階段又可分為預(yù)習(xí)成果檢查和總結(jié)引導(dǎo)兩部分。
2.2.1 預(yù)習(xí)成果檢查
實(shí)驗(yàn)課開始時我們通過提問檢查學(xué)生的預(yù)習(xí)情況,重點(diǎn)考察他們對實(shí)驗(yàn)中可能會遇到的技術(shù)問題的思考。檢查預(yù)習(xí)的好處在于:一方面,教師的監(jiān)督可以強(qiáng)迫學(xué)生獨(dú)立思考,減少學(xué)生對教師的依賴;另一方面,通過提問教師能夠了解學(xué)生對實(shí)驗(yàn)的理解程度,有助于總結(jié)引導(dǎo)。
2.2.2 總結(jié)引導(dǎo)
根據(jù)經(jīng)驗(yàn),大部分學(xué)生會對實(shí)驗(yàn)中可能遇到的技術(shù)問題進(jìn)行思考,但可能不夠全面。因此,在聽取學(xué)生對問題的回答后,應(yīng)進(jìn)行總結(jié),并進(jìn)一步啟發(fā)學(xué)生。我們以共用緩沖池(包含10個緩沖區(qū))的二個生產(chǎn)者和二個消費(fèi)者為例,實(shí)現(xiàn)該“生產(chǎn)者-消費(fèi)者”模型需要考慮以下三個技術(shù)細(xì)節(jié)。
⑴ 該模型使用的數(shù)據(jù)結(jié)構(gòu);
⑵ 程序的流程;
⑶ 實(shí)現(xiàn)生產(chǎn)者和消費(fèi)者的具體操作。
以上三個技術(shù)細(xì)節(jié)的實(shí)現(xiàn)是本實(shí)驗(yàn)的關(guān)鍵。學(xué)生在課前已經(jīng)對相關(guān)函數(shù)進(jìn)行了預(yù)習(xí),因此我們并不立即給出答案,而是啟發(fā)學(xué)生基于預(yù)習(xí)和已有的編程知識,嘗試解決這三個問題。
問題一:由表1中偽代碼可知,生產(chǎn)者和消費(fèi)者之間通過信號量同步,并互斥地訪問緩沖池。因此,信號量和臨界區(qū)是實(shí)現(xiàn)該模型必不可少的數(shù)據(jù)結(jié)構(gòu)。
問題二:程序的流程在main函數(shù)中設(shè)定。具體可分為數(shù)據(jù)結(jié)構(gòu)的初始化、創(chuàng)建多線程和資源回收。其中,資源的初始化及回收可以直接調(diào)用相關(guān)函數(shù),較為復(fù)雜的是創(chuàng)建多線程。講解創(chuàng)建多線程的方法時可以這樣啟發(fā)學(xué)生:每調(diào)用一次_beginthreadex()函數(shù)可以創(chuàng)建一個線程(用來模擬生產(chǎn)者或消費(fèi)者),因此,創(chuàng)建多個生產(chǎn)者和消費(fèi)者要多次調(diào)用_beginthreadex(),這種重復(fù)執(zhí)行相同的動作顯然要用循環(huán)結(jié)構(gòu),從而引導(dǎo)學(xué)生寫出創(chuàng)建多線程的語句。創(chuàng)建2個生產(chǎn)者和2個消費(fèi)者的示例代碼如下。
上述代碼中的ProducerFun和ConsumerFun分別是生產(chǎn)者和消費(fèi)者線程的入口函數(shù),即生產(chǎn)者和消費(fèi)者將執(zhí)行的具體操作,需要重點(diǎn)實(shí)現(xiàn)。
問題三:實(shí)現(xiàn)生產(chǎn)者和消費(fèi)者的具體操作,即編程實(shí)現(xiàn)函數(shù)ProducerFun()和ConsumerFun()。由于生產(chǎn)者和消費(fèi)者類似,我們以實(shí)現(xiàn)ProducerFun()函數(shù)為例,啟發(fā)學(xué)生在此基礎(chǔ)上獨(dú)立完成ConsumerFun()函數(shù)的編寫。
在本例中,信號量empty的初始值為10,full的初始值為0,它們的最大值與緩沖池中緩沖區(qū)的個數(shù)相同(都為10);互斥量mutex保證緩沖池被互斥地訪問。可根據(jù)生產(chǎn)者的偽代碼對應(yīng)寫出源程序。函數(shù)ProducerFun()與生產(chǎn)者Producer的偽代碼之間的對應(yīng)關(guān)系如表2所示。
2.3 課后收集反饋
學(xué)生的課后反饋是對實(shí)驗(yàn)課的重要補(bǔ)充??捎烧n代表收集學(xué)生對本次實(shí)驗(yàn)的感受和仍存在的疑問,統(tǒng)一反饋給教師。這種反饋能夠加強(qiáng)教師和同學(xué)之間的聯(lián)系,幫助教師掌握學(xué)生的整體情況,并對教學(xué)手段進(jìn)行改進(jìn)。在此階段,可以向編程基礎(chǔ)較差的學(xué)生提供示例代碼,并對其輔導(dǎo),盡量照顧到各層次的學(xué)生。
3 結(jié)束語
以知識傳授為核心的靜態(tài)實(shí)驗(yàn)教學(xué)方式要求學(xué)生按教師講解的步驟按部就班進(jìn)行實(shí)驗(yàn),容易使學(xué)生陷于被動,失去對實(shí)驗(yàn)課的興趣。本文針對操作系統(tǒng)課程的特點(diǎn),提出了適用于操作系統(tǒng)實(shí)驗(yàn)課的“啟發(fā)式”教學(xué)方法,并以“生產(chǎn)者-消費(fèi)者”實(shí)驗(yàn)為例,闡述了該方法在教學(xué)過程中的應(yīng)用。經(jīng)驗(yàn)證,采用啟發(fā)式教學(xué)法能夠加大學(xué)生在實(shí)驗(yàn)課中的參與度,提高學(xué)生的獨(dú)立思考能力,對學(xué)生系統(tǒng)能力的培養(yǎng)取得了初步成效。同時,該方法對計(jì)算機(jī)操作系統(tǒng)課程其他問題及實(shí)驗(yàn)的講解具有一定的借鑒作用。
參考文獻(xiàn):
[1] 王志英,周興社,袁春風(fēng)等.計(jì)算機(jī)專業(yè)學(xué)生系統(tǒng)能力培養(yǎng)和系統(tǒng)課程體系設(shè)置研究[J].計(jì)算機(jī)教育.2013,(09):1-6
[2] 楊雯雯,張小崗.高校實(shí)驗(yàn)教學(xué)改革的問題及對策[C].北京高教學(xué)會實(shí)驗(yàn)室工作研究會,2007:327-330
[3] 劉曉平,陳欣,李琳等.面向操作系統(tǒng)課程的“啟發(fā)——探究式”教學(xué)方法初探[J].計(jì)算機(jī)教育,2011.2:50-53
[4] 湯小丹,梁紅兵,哲鳳屏等.計(jì)算機(jī)操作系統(tǒng)(第四版)[M].西安電子科技大學(xué)出版社,2014.