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