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