王令群 韓彥嶺 李凈
摘要: 在《操作系統》課程中,線程是一個非常重要的概念,一直都是該課程的授課難點。結合幾年來的教學經驗,作者對其教法進行探討和總結,提出了教授該概念的技巧和方法,實踐證明學生可徹底掌握線程的概念。
關鍵詞: 《操作系統》線程教學方法
1.引言
在《操作系統》課程中,線程是非常重要的概念之一,但由于其抽象性,學生在掌握理解時有一定難度,歷來都是教學難點。我在參加全國高校操作系統課程培訓交流時,發現很多授課老師對線程的概念很含糊,解釋不清為何線程切換付出的時空代價比進程切換小,學生更是一頭霧水。本文有針對性地采用實例教學和原理比較教學,注重對學生興趣的培養,采用將理論與實踐相結合的教學方法,打開學生的謎團,徹底理解線程的概念。授課中先以生活中生動的實例解釋概念,使學生產生最直觀的認識和理解,然后從原理出發,揭開線程的面紗。
理解線程,必須首先掌握程序、進程的概念,本文首先介紹程序、進程和線程的關系與區別,其次進一步從原理出發解釋進程和線程切換過程及切換中系統付出的代價,最后提出通過線程仿真編程使學生徹底掌握線程的概念。
2.程序、進程和線程的關系與區別
2.1程序和進程
程序(Program)是為實現特定目標或解決特定問題而用計算機語言編寫的命令序列的集合,是存儲在外存儲器的,是靜態的。而進程(Process)則是程序的一次執行過程,是動態的。對此概念的理解可以使用例子:可以把一首歌曲的曲譜看成是程序,根據曲譜演奏音樂就是進程,曲譜可以長期保存,而演奏是個動態的過程,同一個曲譜可以多次演奏,一次演奏也可以綜合多個曲譜。
關于進程的進一步講解如下。
程序在運行過程中需要占有計算機的各種資源才能運行。如果任一時刻,系統中只有一道程序,即單道程序系統,程序則在整個運行過程中獨占計算機全部資源,整個程序運行的過程就非常簡單,管理起來也非常容易。比方說當今的房價和租金都非常高,如果一個職員A獨自租了一套房子,他想看電視就看電視,想去衛生間就去衛生間,就沒人和他搶占資源。但為了提高資源利用率和系統處理能力,現代計算機系統都是多道程序系統,即多道程序并發執行。程序的并發執行帶來了一些新的問題,如資源的共享與競爭,它會改變程序的執行速度。好比上例中由于租金過高,A經濟壓力過大,只好和B合租一套,當A想去衛生間的時候,如果此時B在使用衛生間,則A只得等待,影響了A的節奏。如果程序執行速度不當,就會導致程序的執行結果失去封閉性和可再現性,這是我們不希望看到的。因此應該采取措施制約、控制各并發程序段的執行速度。由于程序是靜態的,我們看到的程序是存儲在存儲介質上的,它無法反映出程序執行過程中的動態特性,而且程序在執行過程中不斷申請資源,程序作為共享資源的基本單位是不合適的,需要引入一個概念,它能描述程序的執行過程而且可以作為共享資源的基本單位,這個概念就是進程。
2.2進程和線程
在操作系統中引入進程的目的是使多個程序并發執行,改善資源利用率及提高系統的吞吐量;再引入線程(Thread)則是為了減少程序并發執行時付出的時空開銷,使操作系統具有更好的并發性。
“線程”其實并不是一個新的概念,實際上它是進程概念的延伸。如果一個程序只有一個進程就可以處理所有的任務,它就是單一線程的。如果一個程序可以被分解為多個進程共同完成程序的任務,這個程序被分解的不同進程就叫做線程(如圖1),也叫輕量級進程(Light Weight Processes)。線程有幾種模式,如單線程、單元線程模式和自由線程模式。
為了使學生理解線程概念,可以將程序比喻成一個搬家的過程:將所有物品從一所房子搬到另外一所房子。如果采用單線程方法,就需要你自己完成從打包到扛箱子、運輸再到拆包的所有工作。如果使用多線程的單元模式,表示邀請了幾位朋友來幫忙,每個朋友都負責一個單獨的工作,并且不能幫助其他人,他們各自負責自己空間內的物品搬運。如果采用自由線程模式,邀請來的所有朋友就可以隨時在任何一個房間工作,共同打包物品。例子中搬家就是運行所有線程的進程,參與搬家的每個朋友所承擔的工作都是一個線程。顯然使用線程能夠更有效、更迅速地執行程序。
3.對線程的進一步理解
線程為輕量級進程,也是CPU調度和分派的基本單元,線程不能夠獨立執行,必須依存在某個進程中;進程則被稱為重量級進程,它是系統分配資源的單位,可擁有多個線程,能同時執行多個任務,他們之間的關系可以簡單地由圖2表示。
線程和進程的關系如下:線程是屬于進程的,線程運行在進程空間內,同一進程產生的線程共享同一內存空間,當進程退出時該進程產生的線程都會被強制退出并清除。線程可與屬于同一進程的其他線程共享進程擁有的全部資源,但是其本身基本上不擁有系統資源,只擁有一些在運行中必不可少的信息(如程序計數器、一組寄存器和棧)。此外,由于一個進程中的多個線程具有相同的地址空間,在同步和通信的實現方面線程也比進程容易。在一些操作系統中,線程的切換、同步和通信都無須操作系統內核的干預。
由于進程是一個資源的擁有者,因而在創建、撤銷和切換中,系統必須為之付出較大的時空開銷。在系統中設置的進程,其數目不宜過多,進程切換的頻率也不宜過高,這就限制了并發程度的進一步提高。引入線程后,因線程基本不攜帶資源,切換時系統付出的時空代價遠小于進程的切換,在這點上,很多老師講解不清為何線程攜帶資源少,切換時付出的時空代價也小,下面分別介紹進程切換和線程切換的過程,以便幫助老師和學生理解線程切換的代價為何遠小于進程切換,進而對線程有更深入的認識。
3.1進程的切換過程
進行進程切換就是從正在運行的進程中收回處理器,然后使待運行的進程占用處理器。這里所說的從某個進程收回處理器,實質上就是把進程存放在處理器的寄存器中的中間數據找個地方存起來,從而把處理器的寄存器騰出來讓其他進程使用,被中止運行進程的中間數據則被存在進程的私有堆棧中。讓進程占用處理器,則是把該進程存放在私有堆棧中寄存器的數據(前一次本進程被中止時的中間數據)再恢復到處理器的寄存器中,并把待運行進程的斷點送入處理器的程序指針PC,于是待運行進程就開始被處理器運行了,也就是這個進程已經占有處理器的使用權了。這好比教室的切換,第一大節課結束后,正在使用教室的老師和學生帶著自己的物品離開教室,老師會記住這堂課講到課本的第幾頁,然后第二大節課在該教室上課的老師和學生進入該教室,開始上課,這就是教室使用權切換的過程。
在切換時,一個進程存儲在處理器各寄存器中的中間數據叫做進程的上下文,所以進程的切換實質上就是被中止運行進程與待運行進程上下文的切換。在進程未占用處理器時,進程的上下文是存儲在進程的私有堆棧中的。
在進程切換時,被中止進程保護斷點和待運行進程恢復斷點的示意圖,見圖3,被終止進程需將處理器PC寄存器、PSW等寄存器的值保存至被中止進程的私有堆棧,SP寄存器等值則保存至進程控制塊;待運行進程則從進程控制塊和私有堆棧中取出PC值、SP值、PSW值等上次被中斷時各寄存器的值并送入處理器的各個寄存器。在該過程中,需要保存和恢復的數據很多,系統付出的時間和空間代價比較大。
3.2線程切換過程
線程作為獨立調度和分派的基本單位,只擁有在運行中必需的少量資源(程序計數器,一組寄存器和棧),它和同屬一個進程的其他線程共享進程擁有的全部資源。
在進程切換時,涉及當前進程CPU環境的保存及新被調度運行進程的CPU環境的設置,需要保存和恢復大量的數據。而同一進程的線程切換則僅需保存和設置少量寄存器內容,程序和數據的地址空間不變,即不涉及存儲器管理方面的操作,故其切換代價遠低于進程。但如果從一個進程中的線程切換到另一個進程中的線程,就會引起進程的切換。
4.通過仿真實驗掌握線程的概念
在深入理解線程的概念后,對于程序設計基礎比較好的學生,使用VC或JAVA語言多線程技術編寫線程的同步與互斥程序,使他們通過學習和實際動手編寫程序更好地掌握線程的概念,提高思考和編程能力。
5.結語
線程是操作系統非常重要的概念,但因其概念抽象,不易理解,一直是教學難點之一,本文的實例教學和原理比較教學,可以使學生在短時間內深入了解線程的概念,實踐證明了該方法的有效性,實例教學提高了學生對操作系統學習的興趣,后期的編程仿真增強了學生的編程能力,教學效果顯著。
參考文獻:
[1]湯子贏,哲鳳屏,湯小丹.計算機操作系統[M].西安電子科技大學出版社,2006.
[2]陳渝,操作系統-精髓與設計原理[M].電子工業出版社,2006.
[3]趙正德,吳紹春,陶永振等.“操作系統”課程教學改革與建設的研究與實踐[J].計算機教育,2009,(14):16-18.
[4]徐欽桂,楊桃欄.比較教學法在操作系統教學中的應用與實踐[J].計算機教育,2010,(10):95-99.
[5]葉保留,費翔林,葛季棟等.“操作系統”實驗課程建設與教學探討[J].計算機教育,2009,(14):122-125.
基金項目:上海市教委重點課程建設項目(A-2601-12-0009)。