




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、Unit 2進程與線程操作系統(tǒng)原理1CPU管理是OS的核心資源管理功能之一,其任務就是實現(xiàn)CPU的分配CPU調(diào)度。很多教科書把CPU管理歸結為進程管理,理由是與進程及線程密切相關。本章的內(nèi)容包括:進程概述、進程服務、線程。2主題進程概念 進程服務 線程概念31 進程概念進程定義進程的基本狀態(tài)及其轉換進程的內(nèi)存映像進程家族41.1 進程定義進程是操作系統(tǒng)中最重要的基本概念。現(xiàn)代操作系統(tǒng)都以進程作為基本的設計工具和系統(tǒng)中的基本運行單位及資源受配單位,整個系統(tǒng)的設計是以進程為基礎的。進程(Process)的定義很多,至今也沒有一個公認的統(tǒng)一的定義,關鍵是要理解進程的實質(zhì)。進程是程序在處理器上的并發(fā)執(zhí)
2、行。(Dijkstra)進程是一個具有一定獨立功能的程序在某個數(shù)據(jù)集合上的一次運行活動。(1987年全國操作系統(tǒng)會議)進程是進程映象的執(zhí)行。(UNIX)進程是程序關于某個資源集合的一次執(zhí)行過程。(Windows)5進程是程序處于一個執(zhí)行環(huán)境中在一個數(shù)據(jù)集上的運行過程,它是系統(tǒng)進行資源分配和調(diào)度的一個可并發(fā)執(zhí)行的獨立單位。(教材)簡單地說:進程是進展中的程序。 進程是運行中的程序。6 【深入理解】 進程與程序有本質(zhì)的差異進程和程序有著密切的聯(lián)系,但它們是兩種完全不同的概念。程序是種靜態(tài)概念。程序是一組可執(zhí)行的指令序列,平時以文件形式存放在外存中,可被長期保存,其存在可以是永久的。進程是動態(tài)概念。
3、進程是某個程序被裝入內(nèi)存后的一次運行過程,具有從動態(tài)產(chǎn)生到動態(tài)消亡的生命周期,當程序的任務執(zhí)行完時,該進程也就隨之消亡,即進程只是計算機系統(tǒng)中的一種暫時性的個體。進程是程序運行的一次動態(tài)過程,程序是進程的靜態(tài)文本。7 列車(交通工具)程序列車的一次運行過程進程電影拷貝程序影片的一次放映進程列車和電影拷貝都是可以長期存在的實體靜態(tài)物體;一次列車的運行過程和一次影片的放映活動則有開始和結束,只延續(xù)有限的時間動態(tài)過程。8 進程的存在依賴于特定的運行配置每個進程都需要執(zhí)行一定的程序,程序定義了進程要完成的功能及算法。另外,每個進程需要對一定的對象進行操作,如某些數(shù)據(jù)或文件;每個進程還需要獲取并占有一定
4、的CPU時間和一定的內(nèi)存空間等系統(tǒng)資源;此外,為了隨機地記錄進程的運行狀態(tài)、掌控進程的運行過程,操作系統(tǒng)為每個進程動態(tài)設置有專門的數(shù)據(jù)結構進程控制塊(PCB)。所有這些配置了一個進程特有的映象。進程是在特定運行配置下的程序運行過程。一個進程的形成不僅依賴于特定的程序,也依賴于特定的運行配置(環(huán)境)。9列車運行,除了要有列車外,還需要動力、鐵軌、車站、調(diào)度員、司乘人員及乘客貨物等構成的列車運行配置。電影放映,除了影片拷貝外,還需要包括影院、放映設備、影院工作人員及觀眾等。10進程和程序不是一一對應的一個程序與不同的運行配置構成的是不同的進程,每個進程的運行配置都是唯一的;反之,不同的進程可含有相
5、同的程序,即一個程序可以被多個不同的獨立進程共享。同一列火車,在不同的時間或不同的線路上運行,構成的是不同車次的運行列車。例如,同一列CRH2型列車(程序),8時從南京發(fā)往上海是D301次列車(進程A);12時從上海發(fā)往南京則是D302次列車(進程B)。這里進程A和進程B共享了同一個程序。11進程是并發(fā)運行的不同進程的操作在時間上可以重疊,一個進程的第一個操作可以在另一個進程的最后一個操作結束之前開始。每個進程都以各自獨立的速度向前推進,宏觀上它們是并行執(zhí)行的。但由于競爭系統(tǒng)資源,進程之間相互制約,獲得所需資源的進程可繼續(xù)前進,而未獲得所需資源的進程只能暫停等待。最典型的是所有進程都在競爭CP
6、U,某個時刻,獲得CPU的進程可繼續(xù)執(zhí)行它的程序代碼,而其他就緒進程都必須等待。故在微觀上,各進程都呈現(xiàn)一種走走停停的運行狀態(tài)。12同一線路且同一時間段上的不同列車并發(fā)運行,相互制約。例如,在8時9時的時段上,滬寧線上有10輛列車在運行(10個進程并發(fā)運行)。每一輛列車時而正在某路段上行駛(進程執(zhí)行),時而可能正停在某個站上上下乘客或為讓車而停(進程的輸入輸出進程阻塞),也可能在某路段上被臨時停車(進程阻塞)。在某一時刻,每一輛列車不管是正在行駛,還是到站停車,或是中途趴窩,宏觀上它們都在并發(fā)運行中。131.2 進程的基本狀態(tài)及其轉換進程是一個動態(tài)實體,有自己的生命周期。一個進程在其生命周期中
7、有多種狀態(tài),每一種狀態(tài)刻畫了進程在不同時段的運行行為。進程在某個時刻總是處于某種狀態(tài)之一,隨著其自身的推進和外界條件的變化,進程的狀態(tài)也隨之而變。進程的三種基本狀態(tài):執(zhí)行態(tài):進程占有了CPU,CPU正在執(zhí)行該進程的程序代碼。就緒態(tài):進程已具備了執(zhí)行條件,只等系統(tǒng)將CPU分配給它(萬事具備,只欠東風)。阻塞態(tài):進程因等待某一事件而暫時不能執(zhí)行。14進程基本狀態(tài)的轉換 就緒執(zhí)行處于就緒態(tài)的進程被OS的進程調(diào)度程序選中,獲得了分配給它的的一個CPU時間周期(時間片),于是從就緒態(tài)變?yōu)閳?zhí)行態(tài)。執(zhí)行就緒導致這種轉換的發(fā)生有兩種情況:執(zhí)行態(tài)進程的當前時間片到限,發(fā)生了時間片中斷。有更高優(yōu)先級的進程進入了就
8、緒態(tài)。于是執(zhí)行態(tài)進程被剝奪執(zhí)行權而變?yōu)榫途w態(tài)。執(zhí)行阻塞執(zhí)行態(tài)進程需要等待某個事件的完成后才能繼續(xù)執(zhí)行,如讀盤文件、鍵盤輸入,因此讓出CPU而進入阻塞態(tài)。15阻塞就緒因進程所等待的事件完成了而被解阻喚醒,從阻塞態(tài)切換為就緒態(tài)?!緩娬{(diào)】只有就緒態(tài)進程能轉換為執(zhí)行態(tài)。阻塞態(tài)進程被喚醒后進入就緒態(tài),而不能直接進入執(zhí)行態(tài)。上述各種轉換只有“執(zhí)行阻塞”是由進程自己激發(fā)的,其他轉換都由操作系統(tǒng)激發(fā)。除了三種基本的進程狀態(tài)外,有些系統(tǒng)還設置有掛起、死鎖、終止等狀態(tài)。16執(zhí)行就緒阻塞創(chuàng)建調(diào)度等待某事件事件發(fā)生因時間片到限等被剝奪執(zhí)行結束圖2-1 進程基本狀態(tài)的轉換171.3 進程的內(nèi)存映象進程的內(nèi)存映象是進程映
9、象的關鍵部分,也稱進程的存儲配置或存儲實體。一個進程的內(nèi)存映象大致包括四個部分。1. 正文段進程的正文(主體)就是進程需執(zhí)行的程序。用高級語言編寫的源程序一般都是可重入的“純代碼”執(zhí)行代碼空間與數(shù)據(jù)(變量)空間分離。純代碼程序可被多個進程共享。故由高級語言生成的程序代碼也稱共享正文段。用戶進程的正文段通常都是共享正文段。正文段中還可包括只讀的常量。182. 數(shù)據(jù)段(區(qū))用于存放程序執(zhí)行時用到的各種變量。有些系統(tǒng)把它進一步劃分為靜態(tài)數(shù)據(jù)區(qū)和動態(tài)數(shù)據(jù)區(qū),靜態(tài)數(shù)據(jù)區(qū)用于存放靜態(tài)變量和外部變量,動態(tài)數(shù)據(jù)區(qū)則存放局部(自動)變量。3. 棧段工作區(qū)存放過程調(diào)用和系統(tǒng)調(diào)用時的調(diào)用參數(shù)和返回參數(shù)。有些系統(tǒng)還用
10、它來存放現(xiàn)場信息。棧段又可進一步分為核心棧和用戶棧,進程在核心態(tài)下執(zhí)行時使用的是核心棧,在用戶態(tài)下執(zhí)行時則使用用戶棧。棧段一般是進程的私有實體。19 4. 進程控制塊(PCB)也稱進程表,是OS在內(nèi)存為進程設置的專門數(shù)據(jù)結構。每個進程都捆綁有一個PCB,它記錄了進程所有的靜態(tài)和動態(tài)屬性,是OS實施進程管理與通信的最重要依據(jù)。PCB與進程一一對應,且動態(tài)產(chǎn)生和消亡。當為一項任務創(chuàng)建一個進程時,系統(tǒng)為該進程建立一個PCB并初始化,此后便利用PCB對進程實施管理和控制。撤消一個進程時,系統(tǒng)消除它的PCB,該進程也就隨之消亡。換言之,操作系統(tǒng)是根據(jù)PCB而感知進程的存在。從這個意義上講,PCB是進程存
11、在的唯一標志。PCB與進程存儲映象中的其他實體是分離的,所有進程的PCB被集中存放在內(nèi)核存儲區(qū),受系統(tǒng)的保護。20PCB的內(nèi)容與組織PCB一般包括以下信息:進程基本信息:如進程標識數(shù)(標識碼)PID、用戶標識數(shù)UID、進程的創(chuàng)建時間等。進程家族信息:如祖先(根)進程指針、父進程指針、子進程鏈指針、兄弟進程鏈指針。進程的狀態(tài)與調(diào)度信息:如進程的當前狀態(tài)(執(zhí)行態(tài)、就緒態(tài)、阻塞態(tài)等之一)、相應的狀態(tài)隊列指針(包括隊首指針和next指針)、以及進程優(yōu)先級。存儲映象的指針與大?。捍鎯τ诚笤趦?nèi)存和虛存的指針和大小?,F(xiàn)場保留區(qū):存放進程被阻塞或被中斷時的現(xiàn)場(上下文)信息,即CPU中各寄存器的值,包括PSW
12、寄存器的值。21進程通信信息:如信號量(燈)、消息隊列指針、信箱指針句柄、接收到的信號等。所用資源信息:如打開文件的句柄(描述字)。PCB需占用較大的空間,UNIX將PCB分成兩個部分:常駐內(nèi)存部分稱為proc結構,非常駐內(nèi)存部分為user結構。Linux的PCB則稱為task_struct。通常,操作系統(tǒng)在內(nèi)核存儲區(qū)中開辟一個線性的PCB表,該表的每個元素就是一個PCB,表長為系統(tǒng)允許存在的最大進程數(shù)(Linux默認為512)。在創(chuàng)建一個新進程時,首先要從PCB表中找尋一個空閑PCB,用它來創(chuàng)建新進程。有些系統(tǒng)也用鏈表形式組織PCB。22Linux采用哈希表方法來組織PCB表。進程創(chuàng)建時被分
13、配有一個唯一的PID,用它計算出的哈希值就是該進程的PCB在PCB表中的位置。為了方便管理,通常把處于各種不同狀態(tài)的進程鏈接成不同的隊列。進程隊列實際就是PCB隊列。對于單CPU系統(tǒng),通常設置有:一個執(zhí)行隊列(只有一個隊列元素)。一個多個就緒隊列(按優(yōu)先級別范圍設置)若干阻塞隊列(每種阻塞事件對應一個阻塞隊列)。系統(tǒng)為每個隊列設置一個全局變量的隊頭指針Head。在PCB中設置有隊列鏈接指針。 231.4 進程家族 系統(tǒng)中所有獨立的活動都可以構成一個進程。在批處理系統(tǒng)中,系統(tǒng)為每個用戶作業(yè)創(chuàng)建一個用戶作業(yè)進程;在交互式系統(tǒng)中,系統(tǒng)為每個登錄的用戶創(chuàng)建一個登錄用戶進程。一個用戶進程還可以為它的相對
14、獨立的子任務創(chuàng)建子進程。子進程可以繼承父進程的全部或部分資源并和父進程并發(fā)執(zhí)行。父與子的概念是相對的,子進程又可以創(chuàng)建自己的子進程,構成新的父子關系。一個進程還可以創(chuàng)建多個平行的子進程。于是,多層次的父子關系便形成了一個樹結構(倒掛樹)的進程家族。在進程樹中,樹的頂節(jié)點是進程家族中所有進程的祖先(根),它最先被創(chuàng)建,最后被撤消。顯然,一個進程可以有多個子孫進程,但每個進程只有一個父進程(除根進程外)。對于一個進程家族,當其根進程被撤消后,整個進程家族亦就隨之消亡。24一個用戶進程家族是隨著某個用戶作業(yè)的啟動或交互用戶登錄成功而動態(tài)產(chǎn)生并隨著進展而動態(tài)形成,隨著用戶作業(yè)的終止或用戶退出系統(tǒng)而動態(tài)
15、消亡。系統(tǒng)進程的產(chǎn)生與消亡是與用戶進程不同的。在系統(tǒng)初啟時,首先創(chuàng)建一個系統(tǒng)總控進程系統(tǒng)根進程(如UNIX的0#進程,Linux的init進程),再由該系統(tǒng)根進程創(chuàng)建其他系統(tǒng)服務進程,這些系統(tǒng)服務進程之間的關系是平等的,不存在隸屬關系和資源繼承關系,而且系統(tǒng)服務進程一旦被創(chuàng)建便永無休止地參與并發(fā)運行,為所有用戶進程提供服務,直至系統(tǒng)終止時,由系統(tǒng)總控進程撤消所有系統(tǒng)服務進程,并最終自行消亡。252 進程服務創(chuàng)建系統(tǒng)調(diào)用阻塞系統(tǒng)調(diào)用喚醒系統(tǒng)調(diào)用撤消系統(tǒng)調(diào)用26進程服務是現(xiàn)代操作系統(tǒng)向用戶和用戶程序提供的一項重要且必不可少的服務功能,包括:創(chuàng)建、阻塞、喚醒、終止、撤消、查詢等。執(zhí)行這些服務功能的是
16、內(nèi)核函數(shù)。用戶進程可通過兩種方式來訪問這些內(nèi)核函數(shù):在提供進程服務器的系統(tǒng)上,用戶進程可通過進程服務器獲得相應服務;而在一些系統(tǒng)上,用戶進程可直接通過系統(tǒng)調(diào)用的方式來訪問這些內(nèi)核函數(shù)。習慣上也把這些內(nèi)核服務函數(shù)稱為系統(tǒng)調(diào)用函數(shù)或直稱系統(tǒng)調(diào)用。此外,用戶可使用shell命令請求某些進程服務。272.1 “創(chuàng)建”系統(tǒng)調(diào)用一個進程可以將一項相對獨立的任務交由一個子進程來完成,它可通過系統(tǒng)調(diào)用“創(chuàng)建”來創(chuàng)建其子進程,創(chuàng)建后,父子進程可并發(fā)執(zhí)行。1. 創(chuàng)建進程算法創(chuàng)建進程的一般算法是:為新進程分配一個唯一的PID和一個空閑的PCB;為進程映象分配內(nèi)存空間;將進程正文(可執(zhí)行程序)從磁盤讀入內(nèi)存;初始化P
17、CB及其他映象;將PCB插入就緒隊列。系統(tǒng)調(diào)用返回28Windows操作系統(tǒng)的創(chuàng)建算法基本同上,提供的相應系統(tǒng)調(diào)用是CreateProcess。UNIXLinux所采用的算法則有所不同,它提供了兩個系統(tǒng)調(diào)用:fork和exec。2. fork系統(tǒng)調(diào)用fork很有特色,它采用“克隆”(clone)的方法,創(chuàng)建一個與當前進程(新進程的父進程)的運行配置完全一樣的子進程。fork很復雜,大致完成以下操作:29(1)為新進程分配一個PID和PCBfork首先檢查系統(tǒng)是否有足夠的內(nèi)存資源來建立一個新進程以及系統(tǒng)中的進程數(shù)是否已超限。如果資源不足或進程數(shù)超限,則返回-1,表示創(chuàng)建失??;否則,為新進程分配一
18、個唯一的PID和一個空閑的PCB,該PID其實就是其PCB在PCB表中的索引號。(2)復制PCB并初始化復制一個父進程的PCB副本到子進程的PCB中,然后把其中的PID的值改為新進程的PID,當前進程置為子進程的父進程,以及其他必要的初始化工作。所以,子進程擁有與父進程一樣的UID、GID、優(yōu)先數(shù)值、當前目錄、用戶文件描述符表等。30(3)共享父進程的所有文件資源把與父進程相連的文件表和索引節(jié)點表的引用計數(shù)器加1。這些文件自動地與子進程相連。(4)創(chuàng)建子進程的內(nèi)存實體按父進程的數(shù)據(jù)段和棧段的大小為新進程分配內(nèi)存空間,并復制父進程的數(shù)據(jù)段和棧段的內(nèi)容,同時修改新進程PCB中的相應指針。(注意:新
19、進程完全共享父進程的正文段) (5)給新進程返回0,給父進程返回新進程的PID。31由上可知,當一個子進程剛被創(chuàng)建時,它與父進程共享正文段,且起始執(zhí)行位置相同,雖然有新分配的數(shù)據(jù)段和棧段,但它們的內(nèi)容也與父進程的相同。那么兩者以后是否只能執(zhí)行相同的程序代碼和完成相同的功能呢?關鍵在于上述第5步,fork采用了“一次調(diào)用,分叉(fork)返回兩值”的技術,即它給父進程返回子進程的PID,給子進程返回0(注:fork把返回值分別送入兩個進程各自的堆棧中)。由于父子進程共享同一程序,所以只要在該程序中的系統(tǒng)調(diào)用的返回點安排一條if 語句,就可以通過判斷返回值使父子進程分別執(zhí)行各自代碼。32在父進程的
20、執(zhí)行程序中創(chuàng)建“克隆”子進程的一般方法:int pid;while(pid=fork()=-1); /*調(diào)用fork創(chuàng)建子進程,直到成功*/if(pid=0) /*收到返回值0,執(zhí)行下面的子進程代碼*/ exit(0); /*系統(tǒng)調(diào)用exit,子進程自行終止*/ else /*收到返回值為子進程的pid ,執(zhí)行下面的父進程代碼*/ 33其中的系統(tǒng)調(diào)用exit(0)執(zhí)行的功能是:回收調(diào)用者的除了PCB之外的各種內(nèi)存映像,同時把PCB中的進程運行狀態(tài)置為“僵死(終止)”態(tài),然后向該進程的父進程發(fā)出“已終止”軟中斷信號。在這種方法中,子進程的執(zhí)行代碼嵌入在父進程的程序代碼中。顯然,這種方法適合于子進
21、程代碼量較少的情況。fork的這種“克隆”式的子進程創(chuàng)建方法在很多情況下是很有用的且效率高。例如,Web服務器在每收到一個用戶請求后,就創(chuàng)建一個新的但一模一樣配置的克隆進程來響應用戶的服務請求。而在windows下過程就要更復雜一些。342. exec系統(tǒng)調(diào)用使用fork創(chuàng)建的是父進程的一個克隆子進程。如果想創(chuàng)建一個擁有獨立程序代碼的子進程,則可以在調(diào)用了fork后再調(diào)用exec。exec較fork簡單,它完成以下操作:(1)如果新進程的程序不在內(nèi)存,則為指定的程序文件分配內(nèi)存空間(正文段),然后將該程序文件從磁盤讀入正文段;否則,與該程序建立共享鏈接。(2)修改新進程PCB中的有關數(shù)據(jù),如正
22、文段的指針和大小、正文段的入口指針、棧指針等。35在父進程的程序代碼中創(chuàng)建非克隆子進程的一般方法:int pid;while(pid=fork()=-1); /*調(diào)用fork創(chuàng)建子進程,直到成功*/if(pid=0) /*收到返回值0 ,執(zhí)行下面的子進程代碼*/ exec( pfile, argv); /*調(diào)用exec,加載子進程的獨立程序*/else/*收到返回值為子進程的pid ,執(zhí)行下面的父進程代碼*/ 362.2 “阻塞“系統(tǒng)調(diào)用當現(xiàn)行進程需要等待某個事件時,可通過“阻塞“系統(tǒng)調(diào)用阻塞自己。1. 阻塞進程算法阻塞的一般算法是:保存現(xiàn)行進程的現(xiàn)場;將現(xiàn)行進程從執(zhí)行態(tài)切換為阻塞態(tài);將該進程
23、加入到相應事件的阻塞隊列中;跳轉到進程調(diào)度程序執(zhí)行新一輪的進程調(diào)度。進程調(diào)度程序也是內(nèi)核模塊。 372. Linux的“阻塞”系統(tǒng)調(diào)用Linux提供了2個實現(xiàn)阻塞功能的系統(tǒng)調(diào)用:wait和sleep。wait()的功能是調(diào)用者等待某個子進程的執(zhí)行終止。wait()的算法:(1)首先查找調(diào)用者進程是否有子進程,若無,則返回出錯碼;(2)如果找到一處于“僵死”(終止)狀態(tài)的子進程,則將該子進程的執(zhí)行時間加到調(diào)用者(父進程)的執(zhí)行時間上,并釋放子進程的PCB,即銷毀了該子進程;然后立即返回調(diào)用者,調(diào)用者可繼續(xù)執(zhí)行。38(3)如果未找到已“僵死”的子進程,則將調(diào)用者置成“睡眠”(即阻塞)狀態(tài),并加入到
24、睡眠隊列中,等待其子進程發(fā)來軟中斷信號時被喚醒。另外,也可以使用wait(pid),其中的參數(shù)pid是某子進程的PID,即該wait系統(tǒng)調(diào)用使調(diào)用者進程進入睡眠,一直到其指定的子進程執(zhí)行終止為止。sleep(second)的功能是使調(diào)用者進程進入睡眠,直到second秒后喚醒。392.3 “喚醒“系統(tǒng)調(diào)用完成或發(fā)現(xiàn)某事件的進程可通過“喚醒”系統(tǒng)調(diào)用,喚醒因等待該事件而被阻塞的某個進程。1. 喚醒進程算法喚醒的一般算法是:從指定事件的阻塞隊列中找到要喚醒進程的PCB;修改PCB中的有關信息,將該進程置為就緒態(tài);將該PCB從阻塞隊列中移出,并插入到就緒隊列中。系統(tǒng)調(diào)用返回402. Linux的“喚
25、醒”系統(tǒng)調(diào)用Linux提供的“喚醒”系統(tǒng)調(diào)用是wake_up(),它有多種原型,如wake_up、wake_up_all、wake_up_nr、wake_up_locked等。412.4 “撤消“系統(tǒng)調(diào)用父進程可通過“撤消”系統(tǒng)調(diào)用來撤消它的子進程,包括正常撤消和異常撤消。前者是子進程在完成了任務并報告了父進程后實施的正常撤消;后者則是父進程對子進程進行的強制性撤消(如撤消死鎖態(tài)進程)。1. 撤消進程算法撤消的一般算法是:從PCB集中找到要撤消子進程的PCB;若該子進程還有其子進程,則遞歸撤消子孫進程;回收子進程所使用的資源;回收子進程的PCB。系統(tǒng)調(diào)用返回422. Linux的“撤消”系統(tǒng)調(diào)
26、用正常情況下,子進程使用exit(0)系統(tǒng)調(diào)用終止自己,父進程則使用wait()系統(tǒng)調(diào)用撤消其子進程。父進程還可以使用kill(pid, SIGKILL)系統(tǒng)調(diào)用來強制“殺死”指定的pid子進程。433線 程 線程概念線程管理模式線程的困惑44線程(thread)是操作系統(tǒng)領域中較晚出現(xiàn)的一個概念,是繼進程之后的又一個關鍵概念。傳統(tǒng)的操作系統(tǒng)以進程為中心,系統(tǒng)的結構、設計及執(zhí)行均以進程為基礎,故通常稱傳統(tǒng)的操作系統(tǒng)為面向進程的操作系統(tǒng)模式,簡稱進程模式。線程是對進程的發(fā)展,線程的引入進一步提高了系統(tǒng)的并發(fā)性,并顯著改善了系統(tǒng)的運行效率。引入線程的操作系統(tǒng)也被稱之為“進程線程模式”,或稱“多線程
27、模式”。當前的許多主流操作系統(tǒng)都不同程度地采用了多線程模式,如 UNIX、Linux、Windows、OS/390等。453.1 線程概念 1. 線程的引入傳統(tǒng)的進程集兩種重要角色于一身:(1) 進程是擁有系統(tǒng)資源的獨立實體每個進程擁有一個獨立的地址空間(邏輯地址構成的存儲空間),用于存放該進程的所有映象。在進程運行過程中,進程還可以動態(tài)獲取CPU、I/O處理器、I/O設備和文件等資源。進程在擁有資源的期間,對這些資源具有控制權,其他進程不經(jīng)允許是不能訪問這些資源的。OS對每個進程擁有的資源實施保護。(2) 進程是可被調(diào)度和受配CPU的執(zhí)行實體每當OS需要進行CPU分配時,就根據(jù)某種調(diào)度算法從
28、所有就緒進程中選擇一個合適的進程,把CPU分配給該進程使用一個CPU時段。獲得CPU使用權的進程可在46 CPU上執(zhí)行它的程序。這兩種角色是傳統(tǒng)進程的本質(zhì)所在,是多道程序并發(fā)運行的基礎。但是這種集兩種角色于一身的進程也帶來了一些副作用。例如:進程是并發(fā)運行的,每個進程在其執(zhí)行過程中經(jīng)常要被打斷,呈現(xiàn)走走停停的情形。在進程模式中,當發(fā)生一個中斷時,通常要進行進程切換,完成一次進程切換需要花費不少的CPU時間開銷;為提高并發(fā)性以加快進程的運行速度,每個進程都可以為它的某個相對獨立的子任務動態(tài)創(chuàng)建子進程,子進程可與父進程并發(fā)運行,子進程與子進程也可并發(fā)運行。子進程完成其任務后,可被動態(tài)終止和撤消。但
29、創(chuàng)建和最終撤消一個進程同樣需要花費不少的CPU開銷。47另外,進程之間共享軟資源難以實現(xiàn)。例如,一進程的多個子進程需要共享某個變量,顯然只能把該變量作為全局變量定義在父進程中,但子進程與父進程的地址空間是隔離的,即子進程是不能直接訪問父進程的地址空間的??傊谶M程模式中,進程切換和進程的創(chuàng)建及撤消都需要一定的CPU開銷,如果這些操作比較頻繁的話,那么系統(tǒng)就要為此付出較大的額外CPU開銷,這在一定程度上降低了進程并發(fā)運行所帶來的好處,影響了系統(tǒng)的有效性。此外,進程之間共享軟資源也難以實現(xiàn)。48為此,操作系統(tǒng)專家們研究如何在支持系統(tǒng)高并發(fā)性的前提下,盡量減少需要付出的額外系統(tǒng)開銷,以改善系統(tǒng)的執(zhí)
30、行效率?;灸繕耸潜M量減少進程切換和進程的創(chuàng)建及撤消的次數(shù)。切入點是進程所承擔的兩種獨立的角色。專家們設想,既然傳統(tǒng)進程所承擔的兩種角色是相互獨立的,那么就可以將它們分離,分別交由兩種不同的實體來承擔,使僅作為執(zhí)行程序的實體都能“輕裝”運行。于是就引入了“線程”,并獨立承擔傳統(tǒng)進程的第二種角色,而新的進程就只承擔原先的第一種角色,即引入線程后,雖然仍保留了進程,但現(xiàn)在的進程主要是系統(tǒng)資源的擁有者,而線程是可被調(diào)度和受配CPU的執(zhí)行實體。492. 線程與進程在“進程線程模式”中,進程和線程都是系統(tǒng)中可并發(fā)的實體,但分別承擔了兩種不同的角色,它們的特性及關系如下:進程是擁有系統(tǒng)資源的獨立實體,每個
31、進程擁有一個受操作系統(tǒng)保護的獨立的進程地址空間,進程還可以動態(tài)獲取CPU、I/O設備、文件等資源。線程是進程內(nèi)的一種專門負責執(zhí)行程序的執(zhí)行實體,是隸屬于進程的相對獨立實體。線程利用所屬進程所擁有的資源,執(zhí)行該進程的程序代碼。作為程序執(zhí)行實體,線程是物理CPU的實際受配者。50進程為執(zhí)行它的程序任務,可創(chuàng)建一個或多個線程,每個進程至少含有一個線程,在創(chuàng)建進程時同時創(chuàng)建了該進程的第一個線程。一個進程擁有的全部資源可供該進程內(nèi)的所有線程共享。一個進程內(nèi)的所有線程共享該進程的正文段和數(shù)據(jù)段,但每個線程都擁有自己的私有映象:線程控制塊(TCB)和棧段。TCB包含了一個線程的專有屬性及其執(zhí)行現(xiàn)場信息。51
32、PCB正文段數(shù)據(jù)段TCB棧段TCB棧段TCB棧段 線程1 線程2 線程n 其中:PCB存放于內(nèi)核空間;正文段和數(shù)據(jù)段以及各線程的棧段存放在進程地址空間中;TCB或存放于內(nèi)核空間(內(nèi)核級線程)或存放于進程地址空間(用戶級線程)。圖2-2 多線程進程的地址空間52一個線程具有生命期,并至少具有三種基本運行狀態(tài):就緒、執(zhí)行及阻塞。線程可動態(tài)創(chuàng)建其他線程(隸屬同一進程),一個進程內(nèi)的所有線程可并發(fā)執(zhí)行。3. 多線程模式的優(yōu)點多線程模式較之進程模式的優(yōu)點主要在于顯著改進了系統(tǒng)的執(zhí)行效率,提高了系統(tǒng)的并發(fā)性,具體體現(xiàn)在:(1) 線程較之進程更為活躍。因此,在進程模式中創(chuàng)建和撤消進程的工作在進程線程模式中大
33、多被轉化成線程的創(chuàng)建和撤消,而用于創(chuàng)建和撤消線程的系統(tǒng)開銷要少得多。創(chuàng)建線程時僅需建立TCB和工作棧。而在創(chuàng)建進程時要建立PCB,建立進程地址空間,裝入進程的正文和53數(shù)據(jù)等,這比創(chuàng)建線程時的工作量要大得多,周期要長得多。據(jù)研究表明,創(chuàng)建一個線程的速度比在進程模式中創(chuàng)建一個進程提高約10倍。(2) 在多線程模式中,進程切換的次數(shù)也要大大減少。線程是執(zhí)行程序的實際實體,故因CPU切換導致的主要是線程切換。而在同一進程中的線程切換所需的系統(tǒng)開銷比進程切換要少得多,因為這種線程切換只需切換線程的執(zhí)行現(xiàn)場以及更新相關的狀態(tài)隊列,無需進行進程地址空間的切換,特別是如果為用戶級線程,線程切換時還無需進行C
34、PU執(zhí)行狀態(tài)的切換。但當線程切換在隸屬不同進程的線程之間發(fā)生時仍將導致進程切換。 54(3) 多線程模式提高了執(zhí)行實體之間的通信效率。進程之間的通信需要內(nèi)核的支持,由于各進程的地址空間是隔離的,故它們相互傳遞的信號或消息需通過內(nèi)核轉遞,而內(nèi)核的每次干預必將引起兩次CPU執(zhí)行狀態(tài)的切換:從用戶態(tài)到核心態(tài),又從核心態(tài)到用戶態(tài)。但在一個進程中,并發(fā)線程之間的通信可直接進行,無需內(nèi)核的干預,因為它們共享該進程的數(shù)據(jù)段和文件。(4)在進程模式下,實現(xiàn)一進程的多個子進程共享變量很復雜,難以實現(xiàn)。而在多線程模式下,由于線程共享其父進程的地址空間,故實現(xiàn)這項功能沒有絲毫問題。(子進程是已成年且分家獨立的孩子,
35、線程是未分家獨立的孩子。)55在操作系統(tǒng)的各種服務器進程中引入線程可大大提高系統(tǒng)的服務質(zhì)量。例如Web服務器,每當傳來一個Web服務請求時, Web服務器便立即響應并創(chuàng)建一個Web服務線程。一個Web服務器可同時具有多個Web服務線程,分別處理不同的服務請求,它們可并發(fā)執(zhí)行。當現(xiàn)行Web服務線程被阻塞時,可切換到另一個就緒態(tài)線程。因此宏觀上, Web服務器同時響應并處理多個Web服務請求。如果Web服務器運行在多處理器的機器上,那么服務器中的多個線程可被調(diào)度到不同的處理器上并行執(zhí)行。有時也把進程模式叫做單線程模式,即進程只包含一個線程。563.2 線程管理模式 線程的管理類似于進程管理,通常包
36、括如下功能:線程服務,包括:創(chuàng)建、撤消、阻塞、喚醒等線程調(diào)度線程同步線程通信實現(xiàn)線程管理有兩種基本模式:KLT和ULT 571. ULT(User-level Threads)模式操作系統(tǒng)內(nèi)核自身并不具有線程管理功能,而是借助線程庫為用戶程序提供提供線程機制。由此產(chǎn)生和運行的線程稱之為用戶級線程(ULT)。線程庫是由語言系統(tǒng)(如Java、C)提供的供用戶程序使用的公用軟件包,其中定義了一組用于線程管理的函數(shù)以及相關的數(shù)據(jù)結構。線程庫被連接(包含)到用戶程序中,作為用戶程序的功能在進程的地址空間中執(zhí)行。在用戶程序中可直接利用函數(shù)調(diào)用來訪問線程管理函數(shù),而無需通過系統(tǒng)調(diào)用。線程庫是完全獨立于內(nèi)核的
37、,內(nèi)核并不知道線程庫和ULT的存在,內(nèi)核既不維護TCB,也不支持線程調(diào)度,內(nèi)核管理的仍然是進程,CPU的調(diào)度和受配對象依然是進 58程。線程的實現(xiàn)和管理實際上只是用戶程序自身的行為,是用戶程序借助線程庫來實現(xiàn)的,ULT對操作系統(tǒng)內(nèi)核完全透明。其優(yōu)點如下:實現(xiàn)簡單。ULT與內(nèi)核無關,不需要修改內(nèi)核,因此便于實現(xiàn)。便于移植。ULT的創(chuàng)建、調(diào)度和其他管理的算法與內(nèi)核無關,很容易在多個操作系統(tǒng)之間移植。開銷小。因為不需要內(nèi)核的干預,線程的創(chuàng)建、切換等開銷小。其缺點如下:一個進程的多個線程不能同時執(zhí)行。因為內(nèi)核的調(diào)度單位是進程,故內(nèi)核只可能給一個進程一次分配一個59CPU,即便是在多核(多CPU)系統(tǒng)中
38、。換言之,ULT不能提高進程內(nèi)的并發(fā)性。當一個線程被阻塞,則整個進程被阻塞,即該進程的其他所有線程也同時被阻塞。因為沒有內(nèi)核干預,有些功能難于實現(xiàn)。例如,采用動態(tài)優(yōu)先級線程調(diào)度需要知道每個線程的執(zhí)行時間,沒有內(nèi)核干預很難準確地得到這樣的信息。602. KLT(Kernel-Level Threads)模式由操作系統(tǒng)內(nèi)核提供并完成所有的線程管理工作,即內(nèi)核中設計有完成各種線程管理功能的原語,它們由相關的系統(tǒng)調(diào)用和中斷所驅動,在CPU的核心態(tài)下執(zhí)行。由此產(chǎn)生和運行的線程稱之為內(nèi)核級線程(KLT)。其優(yōu)點如下:一個進程的多個線程可同時執(zhí)行。在KLT模式中,內(nèi)核的調(diào)度單位通常為線程。因此在多處理器系統(tǒng)中,內(nèi)核可將一進程的多個線程同時調(diào)度到多個CPU上并行執(zhí)行,從而大大加快進程的運行速度。一個線程的阻塞不會影響到該進程的其他線程。KLT模式的缺點是實現(xiàn)復雜,內(nèi)核需要專門的數(shù)據(jù)結構和程序模塊來描述線程。另外,KLT的創(chuàng)建和管理均需要內(nèi)核的干預,因此,和ULT
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 暑假廣場活動方案
- 最美家庭答辯活動方案
- 景區(qū)好評活動方案
- 松鼠開業(yè)活動方案
- 松原開業(yè)活動方案
- 機關古爾邦節(jié)活動方案
- 暑假杭州活動方案
- 智能體驗活動方案
- 2025-2030中國輔助生殖技術行業(yè)市場發(fā)展趨勢與前景展望戰(zhàn)略研究報告
- 中醫(yī)茶飲培訓課件模板
- (湖北省高考卷)2024年湖北省普通高中學業(yè)水平選擇性考試高考物化生+政史地真題試卷及答案
- 康養(yǎng)醫(yī)養(yǎng)中心建設項目可行性研究報告
- 2024-2025學年人教PEP英語六年級下學期期末模擬試卷(含答案含聽力原文無音頻)
- T/CCBD 19-2022品牌餐廳評價規(guī)范
- GSK質(zhì)量管理體系介紹培訓課件
- 學生宿舍改造設計方案
- 出國培訓考試試題及答案
- 2025年中國樂器網(wǎng)數(shù)據(jù)監(jiān)測研究報告
- 西方文化導論試題及答案
評論
0/150
提交評論