楊雪
摘 要: 計算機專業的學生需要更多地關心計算系統的整體特性。計算機科學與技術專業教學指導分委員會系統研究組對課程在系統能力培養方面的作用進行了層次劃分,操作系統屬于重組內容的核心課程。為探討操作系統課程對學生系統能力培養的作用,以在Windows平臺開展“生產者-消費者”實驗為例,探討了在操作系統實驗課中運用“啟發式”教學法。
關鍵詞: 系統能力培養; 啟發式教學法; 操作系統; “生產者-消費者”實驗
中圖分類號:G642 文獻標志碼: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年,教育部計算機科學與技術專業教學指導委員會系統研究組提出要加強學生系統能力培養,明確指出學生的系統能力核心是:“在掌握計算系統基本原理的基礎上,熟悉如何進一步開發構建以計算技術為核心的應用系統。”同時建議把計算機專業課程分成三個層次,即:計算機系統基礎課程、重組內容的核心課程和側重不同計算系統的若干相關平臺應用課程。操作系統課程被劃分到第二層次,是計算機系統能力培養最基本的核心課程[1]。
操作系統課程具有概念抽象、系統性差、原理性強等特點,教師授課難度較大,學生在學習過程中也往往感到非常抽象和難以理解。要將課程中抽象的原理與具體繁瑣的操作系統實現技術有機結合起來,并以比較直觀的、易于理解和易于掌握的形式展現,就必須輔以相應的實驗。然而,以知識傳授為核心的靜態實驗教學方式(即教師在課堂上把實驗原理、目的、步驟及注意事項均詳細講解一遍,學生只需按部就班地操作,用不著查資料,也不需思考實驗中還有沒有需要改進的地方。)會使學生完全處于被動狀態,壓抑他們的學習興趣和主動參與實驗的積極性[2]。“啟發式”教學法與傳統的灌輸式教學不同,它更強調學生在教師的引領和啟示下,主動參與到發現問題、尋求答案的過程中,從而提高他們獨立思考、解決問題的能力[3]。下面以操作系統原理中經典的“生產者-消費者”實驗為例,對在實驗課中應用“啟發式”教學法培養學生的系統能力進行初步探索。
1 問題描述
“生產者-消費者”是一個著名的進程同步問題。它描述的是:有一群生產者進程在生產產品,并將這些產品提供給消費者進程去消費。為使生產者進程和消費者進程能并發執行,在兩者之間設置了一個具有n個緩沖區的緩沖池,生產者進程可以將其所生產的產品放入一個緩沖區中;消費者進程可從一個緩沖區中取走產品去消費。盡管所有的生產者進程和消費者進程都是以異步方式運行的,但它們之間必須保持同步,既不允許消費者進程到一個空緩沖區去取產品,也不允許生產者進程向一個已裝滿產品且尚未被取走的緩沖區中投放產品[4]。
“生產者-消費者”實驗安排在“經典的進程同步問題”理論課之后。通過學習,學生已經熟悉“生產者-消費者”模型,知道各進程應該互斥地使用緩沖池,且生產者進程和消費者進程之間需要用信號量同步。生產者和消費者進程通過信號量實現同步和互斥的偽代碼如表1所示。
表1中,P操作實現信號量的申請,V操作實現信號量的釋放。緩沖池是臨界資源,用長度為n的數組buffer[]表示,每個元素buffer[i]都是一個緩沖區,用來存儲生產者生產的產品。互斥量mutex保證各進程互斥地訪問緩沖池,初始值為1。生產者和消費者分別用in和out來操作緩沖池中的各緩沖區,并通過信號量full和empty同步。full代表緩沖池中存有產品的緩沖區的個數,初始值為0;empty代表緩沖池中沒有存放產品的緩沖區的個數,初始值為n。
2 組織實施
為減少學生對教師的依賴,加大他們在實驗中的參與度,培養他們的系統能力,我們把“生產者-消費者”實驗的組織劃分為三個階段:課前布置任務、課內檢查引導、課后收集反饋。
2.1 課前布置任務
為加大學生對實驗的參與度,我們在實驗課前向學生明確實驗任務并提供相關API函數的簡單說明,要求學生學習資料并思考“生產者-消費者”模型實現的方法。
2.1.1 明確實驗任務
在理解“生產者-消費者”模型的基礎上,利用多線程技術模擬實現一組生產者和消費者;并假設這些生產者和消費者等效,即:只要緩沖池未滿,生產者就可將產品送入緩沖池;只要緩沖池非空,消費者就可以從中取產品進行消費。
2.1.2 提供學習資料
由于大多數學生在本次實驗前未接觸過多線程編程,因此我們向學生提供一些與偽代碼中各操作相對應的Windows API。“生產者-消費者”實驗涉及到創建生產者與消費者、操作信號量及使用臨界資源。我們整理了與之對應的三類函數供學生預習,分別是多線程操作函數、信號量操作函數和互斥量操作函數(通過互斥量保證生產者和消費者對臨界資源互斥訪問)。多線程操作函數包括創建線程的函數_beginthreadex()和等待多個線程結束的函數WaitForMultipleObject()。信號量操作函數包括創建信號量的函數CreateSemaphore()、申請信號量的函數WaitForSingleObject()和釋放信號量的函數ReleaseSemaphore()。互斥量操作函數包括創建互斥量的函數CreateMutex()、申請互斥量的函數WaitForSingleObject()和釋放互斥量的函數ReleaseMutex()。當生產者和消費者完成所有工作后,需要銷毀線程、信號量和互斥量等資源。線程、信號量和互斥量都是內核級資源,用CloseHandle()函數銷毀。
需要注意的是,我們只對上述函數進行簡單說明,學生需要借助互聯網等資源學習它們的具體使用方法。
2.1.3 提出具體要求
提供預習資料的同時要求學生思考:實現“生產者-消費者”模型應考慮哪些技術細節?
2.2 課內檢查引導
與教師詳細講解實驗原理、目的、步驟及注意事項,學生只需按部就班地操作不同,啟發式教學法注重發揮學生在實驗課上的主動性,積極引導學生思考并對學生的結論進行總結,從而完成實驗。本階段又可分為預習成果檢查和總結引導兩部分。
2.2.1 預習成果檢查
實驗課開始時我們通過提問檢查學生的預習情況,重點考察他們對實驗中可能會遇到的技術問題的思考。檢查預習的好處在于:一方面,教師的監督可以強迫學生獨立思考,減少學生對教師的依賴;另一方面,通過提問教師能夠了解學生對實驗的理解程度,有助于總結引導。
2.2.2 總結引導
根據經驗,大部分學生會對實驗中可能遇到的技術問題進行思考,但可能不夠全面。因此,在聽取學生對問題的回答后,應進行總結,并進一步啟發學生。我們以共用緩沖池(包含10個緩沖區)的二個生產者和二個消費者為例,實現該“生產者-消費者”模型需要考慮以下三個技術細節。
⑴ 該模型使用的數據結構;
⑵ 程序的流程;
⑶ 實現生產者和消費者的具體操作。
以上三個技術細節的實現是本實驗的關鍵。學生在課前已經對相關函數進行了預習,因此我們并不立即給出答案,而是啟發學生基于預習和已有的編程知識,嘗試解決這三個問題。
問題一:由表1中偽代碼可知,生產者和消費者之間通過信號量同步,并互斥地訪問緩沖池。因此,信號量和臨界區是實現該模型必不可少的數據結構。
問題二:程序的流程在main函數中設定。具體可分為數據結構的初始化、創建多線程和資源回收。其中,資源的初始化及回收可以直接調用相關函數,較為復雜的是創建多線程。講解創建多線程的方法時可以這樣啟發學生:每調用一次_beginthreadex()函數可以創建一個線程(用來模擬生產者或消費者),因此,創建多個生產者和消費者要多次調用_beginthreadex(),這種重復執行相同的動作顯然要用循環結構,從而引導學生寫出創建多線程的語句。創建2個生產者和2個消費者的示例代碼如下。
上述代碼中的ProducerFun和ConsumerFun分別是生產者和消費者線程的入口函數,即生產者和消費者將執行的具體操作,需要重點實現。
問題三:實現生產者和消費者的具體操作,即編程實現函數ProducerFun()和ConsumerFun()。由于生產者和消費者類似,我們以實現ProducerFun()函數為例,啟發學生在此基礎上獨立完成ConsumerFun()函數的編寫。
在本例中,信號量empty的初始值為10,full的初始值為0,它們的最大值與緩沖池中緩沖區的個數相同(都為10);互斥量mutex保證緩沖池被互斥地訪問。可根據生產者的偽代碼對應寫出源程序。函數ProducerFun()與生產者Producer的偽代碼之間的對應關系如表2所示。
2.3 課后收集反饋
學生的課后反饋是對實驗課的重要補充。可由課代表收集學生對本次實驗的感受和仍存在的疑問,統一反饋給教師。這種反饋能夠加強教師和同學之間的聯系,幫助教師掌握學生的整體情況,并對教學手段進行改進。在此階段,可以向編程基礎較差的學生提供示例代碼,并對其輔導,盡量照顧到各層次的學生。
3 結束語
以知識傳授為核心的靜態實驗教學方式要求學生按教師講解的步驟按部就班進行實驗,容易使學生陷于被動,失去對實驗課的興趣。本文針對操作系統課程的特點,提出了適用于操作系統實驗課的“啟發式”教學方法,并以“生產者-消費者”實驗為例,闡述了該方法在教學過程中的應用。經驗證,采用啟發式教學法能夠加大學生在實驗課中的參與度,提高學生的獨立思考能力,對學生系統能力的培養取得了初步成效。同時,該方法對計算機操作系統課程其他問題及實驗的講解具有一定的借鑒作用。
參考文獻:
[1] 王志英,周興社,袁春風等.計算機專業學生系統能力培養和系統課程體系設置研究[J].計算機教育.2013,(09):1-6
[2] 楊雯雯,張小崗.高校實驗教學改革的問題及對策[C].北京高教學會實驗室工作研究會,2007:327-330
[3] 劉曉平,陳欣,李琳等.面向操作系統課程的“啟發——探究式”教學方法初探[J].計算機教育,2011.2:50-53
[4] 湯小丹,梁紅兵,哲鳳屏等.計算機操作系統(第四版)[M].西安電子科技大學出版社,2014.