版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第4章 進(jìn) 程 管 理,,4.1 進(jìn)程 4.2 進(jìn)程的運(yùn)行模式 4.3 進(jìn)程控制 4.4 進(jìn)程調(diào)度 4.5 進(jìn)程的互斥與同步 4.6 進(jìn)程通信 4.7 線程 習(xí)題,4.1 進(jìn) 程 進(jìn)程是現(xiàn)代操作系統(tǒng)的核心概念,它用來描述程序的執(zhí)行過程,是實(shí)現(xiàn)多任務(wù)操作系統(tǒng)的基礎(chǔ)。操作系統(tǒng)的其他所有內(nèi)容都是圍饒著進(jìn)程展開的。因此,正確地理解和認(rèn)識(shí)進(jìn)程是理解操作系統(tǒng)原理的基礎(chǔ)和關(guān)鍵。,,4.1.1 程序的順序執(zhí)
2、行與并發(fā)執(zhí)行 1. 程序的順序執(zhí)行 如果程序的各操作步驟之間是依序執(zhí)行的,程序與程序之間是串行執(zhí)行的,這種執(zhí)行程序的方式就稱為順序執(zhí)行。順序執(zhí)行是單道程序系統(tǒng)中的程序的運(yùn)行方式?! 〕绦虻捻樞驁?zhí)行具有如下特點(diǎn): (1) 順序性:CPU嚴(yán)格按照程序規(guī)定的順序執(zhí)行,僅當(dāng)一個(gè)操作結(jié)束后,下一個(gè)操作才能開始執(zhí)行。多個(gè)程序要運(yùn)行時(shí),僅當(dāng)一個(gè)程序全部執(zhí)行結(jié)束后另一個(gè)程序才能開始。,,(2) 封閉性:程序在封閉的環(huán)境中運(yùn)行,即程序運(yùn)行時(shí)
3、獨(dú)占全部系統(tǒng)資源,只有程序本身才能改變程序的運(yùn)行環(huán)境。因而程序的執(zhí)行過程不受外界因素的影響,結(jié)果只取決于程序自身?! ?3) 可再現(xiàn)性:程序執(zhí)行的結(jié)果與運(yùn)行的時(shí)間和速度無關(guān),結(jié)果總是可再現(xiàn)的,即無論何時(shí)重復(fù)執(zhí)行該程序都會(huì)得到同樣的結(jié)果。 總的說來,這種執(zhí)行程序的方式簡單,且便于調(diào)試。但由于順序程序在運(yùn)行時(shí)獨(dú)占全部系統(tǒng)資源,因而系統(tǒng)資源利用率很低。DOS程序就是采用順序方式執(zhí)行的。,,2. 程序的并發(fā)執(zhí)行 單道程序、封閉式運(yùn)行是
4、早期操作系統(tǒng)的標(biāo)志,而多道程序并發(fā)運(yùn)行是現(xiàn)代操作系統(tǒng)的基本特征。由于同時(shí)有多個(gè)程序在系統(tǒng)中運(yùn)行,使系統(tǒng)資源得到充分的利用,系統(tǒng)效率大大提高。 程序的并發(fā)執(zhí)行是指若干個(gè)程序或程序段同時(shí)運(yùn)行。它們的執(zhí)行在時(shí)間上是重疊的,即同一程序或不同程序的程序段可以交叉執(zhí)行。,,程序的并發(fā)執(zhí)行有以下特點(diǎn): (1) 間斷性:并發(fā)程序之間因競爭資源而相互制約,導(dǎo)致程序運(yùn)行過程的間斷。例如,在只有一個(gè)CPU的系統(tǒng)中,多個(gè)程序需要輪流占用CPU運(yùn)行,未獲
5、得CPU使用權(quán)的程序就必須等待?! ?2) 沒有封閉性:當(dāng)多個(gè)程序共享系統(tǒng)資源時(shí),一個(gè)程序的運(yùn)行受其他程序的影響,其運(yùn)行過程和結(jié)果不完全由自身決定。例如,一個(gè)程序計(jì)劃在某一時(shí)刻執(zhí)行一個(gè)操作,但很可能在那個(gè)時(shí)刻到來時(shí)它沒有獲得CPU的使用權(quán),因而也就無法完成該操作。,,(3) 不可再現(xiàn)性:由于沒有了封閉性,并發(fā)程序的執(zhí)行結(jié)果與執(zhí)行的時(shí)機(jī)以及執(zhí)行的速度有關(guān),結(jié)果往往不可再現(xiàn)?! 】梢钥闯?,并發(fā)執(zhí)行程序雖然可以提高系統(tǒng)的資源利用率和吞吐量
6、,但程序的行為變得復(fù)雜和不確定。這使程序難以調(diào)試,若處理不當(dāng)還會(huì)帶來許多潛在問題。,,3. 并發(fā)執(zhí)行的潛在問題 程序在并發(fā)執(zhí)行時(shí)會(huì)導(dǎo)致執(zhí)行結(jié)果的不可再現(xiàn)性,這是多道程序系統(tǒng)必須解決的問題。我們用下面的例子來說明并發(fā)執(zhí)行過程對(duì)運(yùn)行結(jié)果的影響,從而了解產(chǎn)生問題的原因?! ≡O(shè)某停車場使用程序控制電子公告牌來顯示空閑車位數(shù)??臻e車位數(shù)用一個(gè)計(jì)數(shù)器C記錄。車輛入庫時(shí)執(zhí)行程序A,車輛出庫時(shí)執(zhí)行程序B,它們都要更新同一個(gè)計(jì)數(shù)器C。程序A和程序B
7、的片段如圖4-1所示。,,,圖4?1 兩程序并發(fā)運(yùn)行,訪問計(jì)數(shù)器C,更新計(jì)數(shù)器C的操作對(duì)應(yīng)的機(jī)器語言有3個(gè)步驟:讀取內(nèi)存C單元的數(shù)據(jù)到一個(gè)寄存器中,修改寄存器的數(shù)值,然后再將其寫回C單元中。 由于車輛出入庫的時(shí)間是隨機(jī)的,程序A與程序B的運(yùn)行時(shí)間也就是不確定的。當(dāng)出入庫同時(shí)發(fā)生時(shí),將使兩程序在系統(tǒng)中并發(fā)運(yùn)行。它們各運(yùn)行一次后C計(jì)數(shù)器的值應(yīng)保持不變。但結(jié)果可能不是如此。,,如果兩個(gè)程序的運(yùn)行時(shí)序按圖4-2(a)所示的順序進(jìn)行,即一個(gè)
8、程序?qū)進(jìn)行更新的操作是在另一個(gè)程序的更新操作全部完成之后才開始,則C被正確地更新了。如果兩個(gè)程序的運(yùn)行時(shí)序如圖4-2(b)所示穿插地進(jìn)行,即當(dāng)一個(gè)程序正在更新C,更新操作還未完成時(shí),CPU發(fā)生了切換,另一個(gè)程序被調(diào)度運(yùn)行,并且也對(duì)C進(jìn)行更新。在這種情況下會(huì)導(dǎo)致錯(cuò)誤的結(jié)果?! 】梢钥闯觯瑢?dǎo)致C更新錯(cuò)誤的原因是兩個(gè)程序交叉地執(zhí)行了更新C的操作。概括地說,當(dāng)多個(gè)程序在訪問共享資源時(shí)的操作是交叉執(zhí)行時(shí),則會(huì)發(fā)生對(duì)資源使用上的錯(cuò)誤。,,圖4?
9、2 并發(fā)程序的執(zhí)行時(shí)序影響執(zhí)行結(jié)果,4.1.2 進(jìn)程的概念 進(jìn)程的概念最早出現(xiàn)在20世紀(jì)60年代中期,此時(shí)操作系統(tǒng)進(jìn)入多道程序設(shè)計(jì)時(shí)代。多道程序并發(fā)顯著地提高了系統(tǒng)的效率,但同時(shí)也使程序的執(zhí)行過程變得復(fù)雜而不確定。為了更好地研究、描述和控制并發(fā)程序的執(zhí)行過程,操作系統(tǒng)引入了進(jìn)程的概念。進(jìn)程概念對(duì)于理解操作系統(tǒng)的并發(fā)性有著極為重要的意義。,,1. 進(jìn)程 進(jìn)程(process)是一個(gè)可并發(fā)執(zhí)行的程序在某數(shù)據(jù)集上的一次運(yùn)行。簡單地
10、說,進(jìn)程就是程序的一次運(yùn)行過程。 進(jìn)程與程序的概念既相互關(guān)聯(lián)又相互區(qū)別。程序是進(jìn)程的一個(gè)組成部分,是進(jìn)程的執(zhí)行文本,而進(jìn)程是程序的執(zhí)行過程。兩者的關(guān)系可以比喻為電影與膠片的關(guān)系:膠片是靜態(tài)的,是電影的放映素材。而電影是動(dòng)態(tài)的,一場電影就是膠片在放映機(jī)上的一次“運(yùn)行”。對(duì)進(jìn)程而言,程序是靜態(tài)的指令集合,可以永久存在;而進(jìn)程是個(gè)動(dòng)態(tài)的過程實(shí)體,動(dòng)態(tài)地產(chǎn)生、發(fā)展和消失。,,此外,進(jìn)程與程序之間也不是一一對(duì)應(yīng)的關(guān)系,表現(xiàn)在: (1) 一
11、個(gè)進(jìn)程可以順序執(zhí)行多個(gè)程序,如同一場電影可以連續(xù)播放多部膠片一樣。 (2) 一個(gè)程序可以對(duì)應(yīng)多個(gè)進(jìn)程,就像一本膠片可以放映多場電影一樣。程序的每次運(yùn)行就對(duì)應(yīng)了一個(gè)不同的進(jìn)程。更重要的是,一個(gè)程序還可以同時(shí)對(duì)應(yīng)多個(gè)進(jìn)程。比如系統(tǒng)中只有一個(gè)vi程序,但它可以被多個(gè)用戶同時(shí)執(zhí)行,編輯各自的文件。每個(gè)用戶的編輯過程都是一個(gè)不同的進(jìn)程。,,2. 進(jìn)程的特性 進(jìn)程與程序的不同主要體現(xiàn)在進(jìn)程有一些程序所沒有的特性。要真正理解進(jìn)程,首先應(yīng)了解它
12、的基本性質(zhì)。進(jìn)程具有以下幾個(gè)基本特性: (1) 動(dòng)態(tài)性:進(jìn)程由“創(chuàng)建”而產(chǎn)生,由“撤銷”而消亡,因“調(diào)度”而運(yùn)行,因“等待”而停頓。進(jìn)程從創(chuàng)建到消失的全過程稱為進(jìn)程的生命周期?! ?2) 并發(fā)性:在同一時(shí)間段內(nèi)有多個(gè)進(jìn)程在系統(tǒng)中活動(dòng)。它們宏觀上是在并發(fā)運(yùn)行,而微觀上是在交替運(yùn)行。,,(3) 獨(dú)立性:進(jìn)程是可以獨(dú)立運(yùn)行的基本單位,是操作系統(tǒng)分配資源和調(diào)度管理的基本對(duì)象。因此,每個(gè)進(jìn)程都獨(dú)立地?fù)碛懈鞣N必要的資源,獨(dú)立地占有CPU并獨(dú)立
13、地運(yùn)行?! ?4) 異步性:每個(gè)進(jìn)程都獨(dú)立地執(zhí)行,各自按照不可預(yù)知的速度向前推進(jìn)。進(jìn)程之間的協(xié)調(diào)運(yùn)行由操作系統(tǒng)負(fù)責(zé)。,,3. 進(jìn)程的基本狀態(tài) 在多道系統(tǒng)中,進(jìn)程的個(gè)數(shù)總是多于CPU的個(gè)數(shù),因此它們需要輪流地占用CPU。從宏觀上看,所有進(jìn)程同時(shí)都在向前推進(jìn),而在微觀上,這些進(jìn)程是在走走停停之間完成整個(gè)運(yùn)行過程的。為了刻畫一個(gè)進(jìn)程在各個(gè)時(shí)期的動(dòng)態(tài)行為特征,通常采用狀態(tài)圖模型。 進(jìn)程有3個(gè)基本的狀態(tài),即: (1) 就緒態(tài):進(jìn)程已
14、經(jīng)分配到了除CPU之外的所有資源,這時(shí)的進(jìn)程狀態(tài)稱為就緒狀態(tài)。處于就緒態(tài)的進(jìn)程,一旦獲得CPU便可立即執(zhí)行。系統(tǒng)中通常會(huì)有多個(gè)進(jìn)程處于就緒態(tài),它們排成一個(gè)就緒隊(duì)列。,,(2) 運(yùn)行態(tài):進(jìn)程已經(jīng)獲得CPU,正在運(yùn)行,這時(shí)的進(jìn)程狀態(tài)稱為運(yùn)行態(tài)。在單CPU系統(tǒng)中,任何時(shí)刻只能有一個(gè)進(jìn)程處于運(yùn)行態(tài)。 (3) 等待態(tài):進(jìn)程因某種資源不能滿足,或希望的某事件尚未發(fā)生而暫停執(zhí)行時(shí),則稱它處于等待態(tài)。系統(tǒng)中常常會(huì)有多個(gè)進(jìn)程處于等待態(tài),它們按等待的事
15、件分類,排成多個(gè)等待隊(duì)列。,,4. 進(jìn)程狀態(tài)的轉(zhuǎn)換 進(jìn)程誕生之初是處于就緒狀態(tài),在其隨后的生存期間內(nèi)不斷地從一個(gè)狀態(tài)轉(zhuǎn)換到另一個(gè)狀態(tài),最后在運(yùn)行狀態(tài)結(jié)束。圖4-3所示是一個(gè)進(jìn)程的狀態(tài)轉(zhuǎn)換圖。 引起狀態(tài)轉(zhuǎn)換的原因如下: 運(yùn)行態(tài)→等待態(tài):正在執(zhí)行的進(jìn)程因?yàn)榈却呈录鵁o法執(zhí)行下去,比如,進(jìn)程申請(qǐng)某種資源,而該資源恰好被其他進(jìn)程占用,則該進(jìn)程將交出CPU,進(jìn)入等待狀態(tài)。,,,圖4?3 進(jìn)程的狀態(tài)轉(zhuǎn)換圖,等待態(tài)→就緒態(tài):處于等待狀
16、態(tài)的進(jìn)程,當(dāng)其所申請(qǐng)的資源得到滿足,則系統(tǒng)將資源分配給它,并將其狀態(tài)變?yōu)榫途w態(tài)?! ∵\(yùn)行態(tài)→就緒態(tài):正在執(zhí)行的進(jìn)程的時(shí)間片用完了,或者有更高優(yōu)先級(jí)的進(jìn)程到來,系統(tǒng)會(huì)暫停該進(jìn)程的運(yùn)行,使其進(jìn)入就緒態(tài),然后調(diào)度其他進(jìn)程運(yùn)行?! 【途w態(tài)→運(yùn)行態(tài):處于就緒狀態(tài)的進(jìn)程,當(dāng)被進(jìn)程調(diào)度程序選中后,即進(jìn)入CPU運(yùn)行。此時(shí)該進(jìn)程的狀態(tài)變?yōu)檫\(yùn)行態(tài)。,,4.1.3 進(jìn)程控制塊 進(jìn)程由程序、數(shù)據(jù)和進(jìn)程控制塊3部分組成,其中程序是進(jìn)程執(zhí)行的可執(zhí)行代碼,
17、數(shù)據(jù)是進(jìn)程所處理的對(duì)象,進(jìn)程控制塊記錄進(jìn)程的所有信息。它們存在于內(nèi)存,其內(nèi)容會(huì)隨著執(zhí)行過程的進(jìn)展而不斷變化。在某個(gè)時(shí)刻的進(jìn)程的內(nèi)容被稱為進(jìn)程映像(process image)?! ∠到y(tǒng)中每個(gè)進(jìn)程都是唯一的,用一個(gè)進(jìn)程控制塊描述。即使兩個(gè)進(jìn)程執(zhí)行的是同一程序,處理同一數(shù)據(jù),它們的進(jìn)程控制塊也是不同的。因此可以說,進(jìn)程控制塊是進(jìn)程的標(biāo)志。,,1. 進(jìn)程控制塊 進(jìn)程控制塊(Process Control Block,PCB)是系統(tǒng)為管
18、理進(jìn)程設(shè)置的一個(gè)數(shù)據(jù)結(jié)構(gòu),用于記錄進(jìn)程的相關(guān)信息。PCB是系統(tǒng)感知和控制進(jìn)程的一個(gè)數(shù)據(jù)實(shí)體。當(dāng)創(chuàng)建一個(gè)進(jìn)程時(shí),系統(tǒng)為它生成PCB;進(jìn)程完成后,撤銷它的PCB。因此,PCB是進(jìn)程的代表,PCB存在則進(jìn)程就存在,PCB消失則進(jìn)程也就結(jié)束了。在進(jìn)程的生存期中,系統(tǒng)通過PCB來了解進(jìn)程的活動(dòng)情況,對(duì)進(jìn)程實(shí)施控制和調(diào)度。因此,PCB是操作系統(tǒng)中的最重要數(shù)據(jù)結(jié)構(gòu)之一。,,2. 進(jìn)程控制塊的內(nèi)容 PCB記錄了有關(guān)進(jìn)程的系統(tǒng)所關(guān)心的所有信息,主要包
19、括以下4方面的內(nèi)容: 1) 進(jìn)程描述信息 進(jìn)程描述信息用于記錄一個(gè)進(jìn)程的特征和基本情況,通過這些信息可以識(shí)別該進(jìn)程,了解該進(jìn)程的歸屬信息,以及確定這個(gè)進(jìn)程與其他進(jìn)程之間的關(guān)系?! ∠到y(tǒng)為每個(gè)進(jìn)程分配了一個(gè)唯一的整數(shù)作為進(jìn)程標(biāo)識(shí)號(hào)PID,通過這個(gè)PID來標(biāo)識(shí)這個(gè)進(jìn)程。操作系統(tǒng)、用戶以及其他進(jìn)程都是通過PID來識(shí)別進(jìn)程的。此外,還要描述進(jìn)程的家族關(guān)系,即父進(jìn)程(創(chuàng)建該進(jìn)程的進(jìn)程)和子進(jìn)程(該進(jìn)程創(chuàng)建的進(jìn)程)的信息。,,2) 進(jìn)程控
20、制和調(diào)度信息 進(jìn)程是系統(tǒng)運(yùn)行調(diào)度的基本單位。進(jìn)程控制塊記錄了進(jìn)程的當(dāng)前狀態(tài)、調(diào)度信息、記時(shí)信息等。系統(tǒng)依據(jù)這些信息確定進(jìn)程的狀態(tài),實(shí)施進(jìn)程控制和調(diào)度?! ?) 資源信息 系統(tǒng)以進(jìn)程為單位分配資源,并將資源信息記錄在進(jìn)程的PCB中。資源包括該進(jìn)程使用的存儲(chǔ)器空間、打開的文件以及設(shè)備等。通過這些信息,進(jìn)程就可以得到運(yùn)行需要的相關(guān)程序段與數(shù)據(jù)段、使用文件和設(shè)備等資源。,,4) 現(xiàn)場信息 現(xiàn)場信息一般包括CPU的內(nèi)部寄存器和系統(tǒng)堆
21、棧等,它們的值刻畫了進(jìn)程的運(yùn)行狀態(tài)。退出CPU的進(jìn)程必須保存好這些現(xiàn)場狀態(tài),以便在下次被調(diào)度時(shí)繼續(xù)運(yùn)行。當(dāng)一個(gè)進(jìn)程被重新調(diào)度運(yùn)行時(shí),要用PCB中的現(xiàn)場信息來恢復(fù)CPU的運(yùn)行現(xiàn)場?,F(xiàn)場一旦切換,下一個(gè)指令周期CPU將精確地接著上次運(yùn)行的斷點(diǎn)處繼續(xù)執(zhí)行下去。,,4.1.4 進(jìn)程的組織 管理進(jìn)程就是管理進(jìn)程的PCB。一個(gè)系統(tǒng)中通??赡軗碛袛?shù)百乃至上千個(gè)進(jìn)程,為了有效地管理如此多的PCB,系統(tǒng)需要采用適當(dāng)?shù)姆绞綄⑺鼈兘M織在一起。所有的PC
22、B都存放在內(nèi)存中,通常采用的組織結(jié)構(gòu)有數(shù)組、索引和鏈表3種方式?! ?shù)組方式是將所有的PCB順序存放在一個(gè)一維數(shù)組中。這種方式比較簡單,但操作起來效率低,比如,要查找某個(gè)PCB時(shí)需要掃描全表?! ∷饕绞绞峭ㄟ^在PCB數(shù)組上設(shè)置索引表或散列表,以加快訪問速度。,,鏈表方式是將PCB鏈接起來,構(gòu)成鏈?zhǔn)疥?duì)列或鏈表。例如,所有就緒的PCB鏈成一個(gè)就緒隊(duì)列;所有等待的PCB按等待的事件鏈成多個(gè)等待隊(duì)列。這樣,在進(jìn)程調(diào)度時(shí)只要掃描就緒隊(duì)列即可
23、,等待的事件發(fā)生時(shí)只要掃描相應(yīng)的等待隊(duì)列即可。當(dāng)進(jìn)程狀態(tài)發(fā)生轉(zhuǎn)換時(shí),鏈?zhǔn)浇Y(jié)構(gòu)允許方便地向隊(duì)列插入和刪除一個(gè)PCB。 實(shí)際的系統(tǒng)中通常會(huì)結(jié)合采用這些方法,以求達(dá)到最好的效率。,,4.1.5 Linux系統(tǒng)中的進(jìn)程 在Linux系統(tǒng)中,進(jìn)程也稱為任務(wù)(task),兩者的概念是一致的?! ?. ?Linux進(jìn)程的狀態(tài) Linux的進(jìn)程共有5種基本狀態(tài),包括運(yùn)行、就緒、睡眠(分為可中斷的與不可中斷的)、暫停和僵死。狀態(tài)轉(zhuǎn)換圖如圖
24、4-4所示。,,,圖4-4 Linux系統(tǒng)的進(jìn)程狀態(tài)轉(zhuǎn)換圖,Linux將這些基本狀態(tài)歸結(jié)為4種并加以命名和定義,它們是: (1) 可執(zhí)行態(tài)(runnable):可執(zhí)行態(tài)實(shí)際包含了上述基本狀態(tài)中的運(yùn)行和就緒兩種狀態(tài)。處于可執(zhí)行態(tài)的進(jìn)程均已具備運(yùn)行條件。它們或正在運(yùn)行,或準(zhǔn)備運(yùn)行?! ?2) 睡眠態(tài)(sleeping):即等待態(tài)。進(jìn)程在等待某個(gè)事件或某個(gè)資源。睡眠態(tài)又細(xì)分為可中斷的(interruptible)和不可中斷的(unin
25、terruptible)兩種。它們的區(qū)別在于,在睡眠過程中,不可中斷狀態(tài)的進(jìn)程會(huì)忽略信號(hào),而處于可中斷狀態(tài)的進(jìn)程如果收到信號(hào)會(huì)被喚醒而進(jìn)入可執(zhí)行狀態(tài),待處理完信號(hào)后再次進(jìn)入睡眠狀態(tài)。,,(3) 暫停態(tài)(stopped):處于暫停態(tài)的進(jìn)程一般都是由運(yùn)行態(tài)轉(zhuǎn)換而來,等待某種特殊處理。比如調(diào)試跟蹤的程序,每執(zhí)行到一個(gè)斷點(diǎn),就轉(zhuǎn)入暫停態(tài),等待新的輸入信號(hào)?! ?4) 僵死態(tài)(zombie):進(jìn)程運(yùn)行結(jié)束或因某些原因被終止時(shí),它將釋放除PCB外
26、的所有資源。這種占有PCB但已經(jīng)無法運(yùn)行的進(jìn)程就處于僵死狀態(tài)。,,2. ?Linux進(jìn)程的狀態(tài)轉(zhuǎn)換過程 Linux進(jìn)程的狀態(tài)轉(zhuǎn)換過程是:新創(chuàng)建的進(jìn)程處于可執(zhí)行的就緒態(tài),等待調(diào)度執(zhí)行?! √幱诳蓤?zhí)行態(tài)的進(jìn)程在就緒態(tài)和運(yùn)行態(tài)之間輪回。就緒態(tài)的進(jìn)程一旦被調(diào)度程序選中,就進(jìn)入運(yùn)行狀態(tài)。等時(shí)間片耗盡之后,退出CPU,轉(zhuǎn)入就緒狀態(tài)等待下一次的調(diào)度。處于此輪回的進(jìn)程在運(yùn)行與就緒之間不斷地高速切換,可謂瞬息萬變。因此,對(duì)觀察者(系統(tǒng)與用戶)來說,
27、將此輪回概括為一個(gè)相對(duì)穩(wěn)定的可執(zhí)行態(tài)才有意義。,,運(yùn)行態(tài)、睡眠態(tài)和就緒態(tài)形成一個(gè)回路。處于運(yùn)行態(tài)的進(jìn)程,有時(shí)需要等待某個(gè)事件或某種資源的發(fā)生,這時(shí)已無法占有CPU繼續(xù)工作,于是它就退出CPU,轉(zhuǎn)入睡眠狀態(tài)。當(dāng)所等待的事件發(fā)生后,進(jìn)程被喚醒,進(jìn)入就緒狀態(tài)?! ∵\(yùn)行態(tài)、暫停態(tài)和就緒態(tài)也構(gòu)成一個(gè)回路。當(dāng)處于運(yùn)行態(tài)的進(jìn)程接收到暫停執(zhí)行信號(hào)時(shí),它就放棄CPU,進(jìn)入暫停態(tài)。當(dāng)暫停的進(jìn)程獲得恢復(fù)執(zhí)行信號(hào)時(shí),就轉(zhuǎn)入就緒態(tài)。 處于運(yùn)行態(tài)的進(jìn)程調(diào)用退
28、出函數(shù)exit之后,進(jìn)入僵死態(tài)。當(dāng)父進(jìn)程對(duì)該進(jìn)程進(jìn)行相應(yīng)的處理后,撤銷其PCB。此時(shí),這個(gè)進(jìn)程就完成了它的使命,從僵死走向徹底消失。,,3. ?Linux的進(jìn)程控制塊 Linux系統(tǒng)的PCB用一個(gè)稱為task_struct的結(jié)構(gòu)體來描述。系統(tǒng)中每創(chuàng)建一個(gè)新的進(jìn)程,就給它分配一個(gè)task_struct結(jié)構(gòu),并填入進(jìn)程的控制信息。task_struct主要包括以下內(nèi)容: (1) 進(jìn)程標(biāo)識(shí)號(hào)(PID):PID是標(biāo)識(shí)該進(jìn)程的一個(gè)整數(shù)。系
29、統(tǒng)通過這個(gè)標(biāo)識(shí)號(hào)來唯一地標(biāo)識(shí)一個(gè)進(jìn)程?! ?2) 用戶標(biāo)識(shí)(UID)和組標(biāo)識(shí)(GID):描述進(jìn)程的歸屬關(guān)系,即進(jìn)程的屬主和屬組的標(biāo)識(shí)號(hào)。系統(tǒng)通過這兩個(gè)標(biāo)識(shí)號(hào)判斷進(jìn)程對(duì)文件和設(shè)備的訪問權(quán)限。,,(3) 鏈接信息:用指針的方式記錄進(jìn)程的父進(jìn)程、兄弟進(jìn)程以及子進(jìn)程的位置(即PCB的地址)。系統(tǒng)通過鏈接信息確定進(jìn)程的家族關(guān)系以及其在整個(gè)進(jìn)程鏈中的位置?! ?4) 狀態(tài):進(jìn)程當(dāng)前的狀態(tài)。 (5) 調(diào)度信息:與系統(tǒng)調(diào)度相關(guān)的信息,包括優(yōu)先級(jí)
30、、時(shí)間片和調(diào)度策略?! ?6) 記時(shí)信息:包括時(shí)間和定時(shí)器。時(shí)間記錄進(jìn)程建立的時(shí)間以及進(jìn)程占用CPU的時(shí)間統(tǒng)計(jì),是進(jìn)程調(diào)度、統(tǒng)計(jì)和監(jiān)控的依據(jù)。定時(shí)器用于設(shè)定一個(gè)時(shí)間。時(shí)間到時(shí),系統(tǒng)會(huì)發(fā)定時(shí)信號(hào)通知進(jìn)程。,,(7) 通信信息:記錄有關(guān)進(jìn)程間信號(hào)量通信及信號(hào)通信的信息。 (8) 退出碼:記錄進(jìn)程運(yùn)行結(jié)束后的退出狀態(tài),供父進(jìn)程查詢用?! ?9) 文件系統(tǒng)信息:包括根目錄、當(dāng)前目錄、打開的文件以及文件創(chuàng)建掩碼等信息。 (10) 內(nèi)存
31、信息:記錄進(jìn)程的代碼映像和堆棧的地址、長度等信息?! ?11) 進(jìn)程現(xiàn)場信息:保存進(jìn)程放棄CPU時(shí)所有CPU寄存器及堆棧的當(dāng)前值。,,4. 查看進(jìn)程的信息 在Linux系統(tǒng)中,要查看進(jìn)程的信息可使用ps(process status)命令。該命令可查看記錄在進(jìn)程PCB中的幾乎所有信息?! s命令 【功能】查看進(jìn)程的信息?! 靖袷健縫s [選項(xiàng)] 【選項(xiàng)】 -e顯示所有進(jìn)程?! ?f以全格式顯示。,,-
32、r只顯示正在運(yùn)行的進(jìn)程?! ?o以用戶定義的格式顯示?! 顯示所有終端上的所有進(jìn)程?! 以面向用戶的格式顯示?! 顯示所有不控制終端的進(jìn)程?! 菊f明】 (1) 默認(rèn)只顯示在本終端上運(yùn)行的進(jìn)程,除非指定了-e、a、x等選項(xiàng)?! ?2) 沒有指定顯示格式時(shí),采用以下缺省格式,分4列顯示: PID TTY TIME CMD,,各字段的含義是: PID進(jìn)程標(biāo)識(shí)號(hào)。 TTY進(jìn)程
33、對(duì)應(yīng)的終端,?表示該進(jìn)程不占用終端?! IME進(jìn)程累計(jì)使用的CPU時(shí)間?! MD進(jìn)程執(zhí)行的命令名?! ?1) 指定-f選項(xiàng)時(shí),以全格式,分8列顯示: UID PID PPID C STIME TTY TIME CMD 各字段的含義是: UID進(jìn)程屬主的用戶名。 PPID父進(jìn)程的標(biāo)識(shí)號(hào)?! 進(jìn)程最近使用的CPU時(shí)間?! TIME進(jìn)程開始時(shí)間?! ∑溆嗤稀?,(2
34、) 指定u選項(xiàng)時(shí),以用戶格式,分11列顯示: USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND 各字段的含義是: USER同UID?! ?CPU進(jìn)程占用CPU的時(shí)間與進(jìn)程總運(yùn)行時(shí)間之比?! ?MEM進(jìn)程占用的內(nèi)存與總內(nèi)存之比?! SZ進(jìn)程虛擬內(nèi)存的大小,以KB為單位?! SS占用實(shí)際內(nèi)存的大小,以KB為單位?! TAT進(jìn)程當(dāng)前
35、狀態(tài),用字母表示。含義:R執(zhí)行態(tài);S睡眠態(tài);D不可中斷睡眠態(tài);T暫停態(tài);Z僵尸態(tài)。,,START同STIME?! OMMAND同CMD?! ∑溆嗤??! ±?.1 ps命令用法示例: $ ps#以缺省格式顯示本終端上的進(jìn)程的信息 PID TTY TIME CMD 9805 pts/0 00:00:00 bash
36、 9835 pts/0 00:00:00 ps $ ps -ef #以全格式顯示當(dāng)前系統(tǒng)中所有進(jìn)程的信息 UID PID PPID C STIME TTY TIME CMD root 1 0 0 11:26 ? 00:00:03 /sbin/init root 2 0 0 11:26 ? 00:0
37、0:00 [kthreadd] root 3 2 0 11:26 ? 00:00:00 [migration/0] root 4 2 0 11:26 ? 00:00:51 [ksoftirqd/0] …,,$ ps aux#以用戶格式顯示當(dāng)前系統(tǒng)中所有進(jìn)程的信息 USER PID %CPU %MEM VSZ RSS TTY STAT
38、START TIME COMMAND root 1 0.0 0.1 1948 816 ? S 11:26 0:03 /sbin/init root 2 0.0 0.0 ?0 ? 0 ? S 11:26 0:00 [kthreadd] … cherry 9805 0.0 0.2 6184 1524
39、pts/0 S 22:31 0:00 bash cherry 9876 0.0 0.1 5980 940 pts/0 R 22:36 0:00 ps aux … $,,5. Linux進(jìn)程的組織 Linux系統(tǒng)采用了多種方式來組織PCB,主要有以下幾種。 1) 進(jìn)程鏈表 系統(tǒng)將所有的PCB鏈成一個(gè)雙向循環(huán)鏈表,進(jìn)程通過PCB中的list_he
40、ad字段鏈入進(jìn)程鏈表。遍歷該鏈表即可順序地找到每個(gè)進(jìn)程?! ≡谠S多情況下,內(nèi)核需要根據(jù)進(jìn)程的PID查找進(jìn)程。順序掃描鏈表并逐個(gè)檢查PCB中的PID是相當(dāng)?shù)托У摹榱思铀俨檎?,?nèi)核還設(shè)置了幾個(gè)進(jìn)程散列表,將PID直接映射到PCB。,,2) 進(jìn)程樹鏈表 Linux系統(tǒng)中,進(jìn)程之間存在著父子關(guān)系。除了init進(jìn)程外,每個(gè)進(jìn)程都有一個(gè)父進(jìn)程,即創(chuàng)建了此進(jìn)程的進(jìn)程。一個(gè)進(jìn)程可以創(chuàng)建0至多個(gè)進(jìn)程,稱為它的子進(jìn)程。具有相同父進(jìn)程的進(jìn)程稱為兄弟進(jìn)
41、程。這樣,系統(tǒng)中的所有進(jìn)程形成了一棵進(jìn)程樹,每個(gè)進(jìn)程都是樹中的一個(gè)節(jié)點(diǎn),樹的根是init進(jìn)程,它是所有進(jìn)程的祖先進(jìn)程?! ≡赑CB中設(shè)置有父進(jìn)程指針parent、子進(jìn)程指針children和兄弟進(jìn)程指針sibling,它們構(gòu)造出了進(jìn)程樹的結(jié)構(gòu)。進(jìn)程通過這些指針可以直接找到它的家族成員。,,3) 可執(zhí)行隊(duì)列 為了方便進(jìn)程的調(diào)度,系統(tǒng)把所有處于可執(zhí)行狀態(tài)的PCB組織成一個(gè)可執(zhí)行隊(duì)列,處于可執(zhí)行狀態(tài)的進(jìn)程通過PCB中的run_list字
42、段鏈入隊(duì)列。可執(zhí)行隊(duì)列中設(shè)置了一個(gè)curr指針,它指向隊(duì)列中正在使用CPU的進(jìn)程,用來區(qū)別就緒態(tài)和運(yùn)行態(tài)的進(jìn)程。在進(jìn)程切換時(shí),進(jìn)程調(diào)度程序從可執(zhí)行隊(duì)列中選擇一個(gè)讓其運(yùn)行,并將curr指針指向它。,,4) 等待隊(duì)列 進(jìn)程因不同的原因而睡眠,例如,等待磁盤操作的數(shù)據(jù)、等待某系統(tǒng)資源可用或等待固定的時(shí)間間隔。系統(tǒng)將睡眠的進(jìn)程分類管理,每類對(duì)應(yīng)一個(gè)特定的事件,用一個(gè)等待隊(duì)列鏈接。等待隊(duì)列是一個(gè)雙向循環(huán)鏈表,鏈表的節(jié)點(diǎn)中包含了指向進(jìn)程PCB的
43、指針。當(dāng)某一事件發(fā)生時(shí),內(nèi)核會(huì)喚醒相應(yīng)的等待隊(duì)列中滿足等待條件的進(jìn)程,將喚醒的進(jìn)程從隊(duì)列中刪除,加入到可執(zhí)行隊(duì)列中。,,,4.2 進(jìn)程的運(yùn)行模式 進(jìn)程的運(yùn)行緊密依賴于操作系統(tǒng)的內(nèi)核。因此,理解進(jìn)程的運(yùn)行機(jī)制需要首先認(rèn)識(shí)內(nèi)核,了解內(nèi)核的運(yùn)行方式,進(jìn)而了解進(jìn)程在核心態(tài)與用戶態(tài)下的不同執(zhí)行模式。4.2.1 操作系統(tǒng)內(nèi)核 一個(gè)完整的操作系統(tǒng)由一個(gè)內(nèi)核和一些系統(tǒng)服務(wù)程序構(gòu)成。內(nèi)核(kernel)是操作系統(tǒng)的核心,它負(fù)責(zé)最基本的資源管
44、理和控制工作,為進(jìn)程提供良好的運(yùn)行環(huán)境?! D4-5是Linux系統(tǒng)的層次體系結(jié)構(gòu)。系統(tǒng)分為3層:最底層是系統(tǒng)硬件;硬件層之上是核心層,它是運(yùn)行程序和管理基本硬件的核心程序;用戶層由系統(tǒng)的核外程序和用戶程序組成,它們都是以用戶進(jìn)程的方式運(yùn)行在核心之上。,,,圖4-5 Linux系統(tǒng)的體系結(jié)構(gòu),內(nèi)核在系統(tǒng)引導(dǎo)時(shí)載入并常駐內(nèi)存,形成對(duì)硬件的第一層包裝。啟動(dòng)了內(nèi)核的系統(tǒng)具備了執(zhí)行進(jìn)程的所有條件,使進(jìn)程可以被正確地創(chuàng)建、運(yùn)行、控制和撤銷。為
45、此,內(nèi)核應(yīng)具備支撐進(jìn)程運(yùn)行的所有功能,包括對(duì)進(jìn)程本身的控制及對(duì)進(jìn)程要使用的資源的管理?! inux系統(tǒng)的內(nèi)核主要由以下成分構(gòu)成: (1) 進(jìn)程控制子系統(tǒng),負(fù)責(zé)支持、管理和控制進(jìn)程的運(yùn)行,包括以下模塊: ● 進(jìn)程調(diào)度模塊,負(fù)責(zé)調(diào)度進(jìn)程的運(yùn)行?! ?進(jìn)程通信模塊,實(shí)現(xiàn)進(jìn)程間的本地通信?! ?內(nèi)存管理模塊,管理進(jìn)程的地址空間。,,(2) 文件子系統(tǒng),為進(jìn)程提供I/O環(huán)境,包括以下模塊和成分: ● 文件系統(tǒng)模塊,管理文件
46、和設(shè)備。 ● 網(wǎng)絡(luò)接口模塊,實(shí)現(xiàn)進(jìn)程間的網(wǎng)絡(luò)通信?! ?設(shè)備驅(qū)動(dòng)程序,驅(qū)動(dòng)和控制設(shè)備的運(yùn)行?! ?1) 系統(tǒng)調(diào)用接口,提供進(jìn)程與內(nèi)核的接口,進(jìn)程通過此接口調(diào)用內(nèi)核的功能?! ?2) 硬件控制接口,是內(nèi)核與硬件的接口,負(fù)責(zé)控制硬件并響應(yīng)和處理中斷事件。,,4.2.2 中斷與系統(tǒng)調(diào)用 由圖可以看出,內(nèi)核與外界的接口是來自用戶層的系統(tǒng)調(diào)用和來自硬件層的中斷,而系統(tǒng)調(diào)用本身也是一種特殊的中斷。因此可以說內(nèi)核是中斷驅(qū)動(dòng)的,它的主
47、要作用就是提供系統(tǒng)調(diào)用和中斷的處理。因此,了解內(nèi)核的運(yùn)行機(jī)制需要先了解中斷和系統(tǒng)調(diào)用的概念。,,1. 中斷 在早期的計(jì)算機(jī)系統(tǒng)中,CPU與各種設(shè)備是串行工作的。當(dāng)需要設(shè)備傳輸數(shù)據(jù)時(shí),CPU向設(shè)備發(fā)出指令,啟動(dòng)設(shè)備執(zhí)行數(shù)據(jù)傳輸操作。然后CPU不斷地測試設(shè)備的狀態(tài),直到它完成操作。在設(shè)備工作期間,CPU是處于原地踏步的循環(huán)中,這對(duì)CPU資源是極大的浪費(fèi)?! ≈袛嗉夹g(shù)的出現(xiàn)完全改變了計(jì)算機(jī)系統(tǒng)的操作模式。在現(xiàn)代系統(tǒng)中,CPU與各種設(shè)備是
48、并發(fā)工作的。在中斷方式下,CPU啟動(dòng)設(shè)備操作后,它不是空閑等待,而是繼續(xù)執(zhí)行程序。當(dāng)設(shè)備完成I/O操作后,向CPU發(fā)出一種特定的中斷信號(hào),打斷CPU的運(yùn)行。CPU響應(yīng)中斷后暫停正在執(zhí)行的程序,轉(zhuǎn)去執(zhí)行專門的中斷處理程序,然后再返回原來的程序繼續(xù)執(zhí)行。這個(gè)過程就是中斷。,,中斷的概念是因?qū)崿F(xiàn)CPU與設(shè)備并行操作而引入的。然而,這個(gè)概念后來被大大地?cái)U(kuò)大了?,F(xiàn)在,系統(tǒng)中所有異步發(fā)生的事件都是通過中斷機(jī)制來處理的,包括I/O設(shè)備中斷、系統(tǒng)時(shí)鐘中
49、斷、硬件故障中斷、軟件異常中斷等。這些中斷分為硬件中斷和軟件中斷(也稱為異常)兩大類。每個(gè)中斷都對(duì)應(yīng)一個(gè)中斷處理程序。中斷發(fā)生后,CPU通過中斷處理入口轉(zhuǎn)入相應(yīng)的處理程序來處理中斷事件。 關(guān)于中斷技術(shù)的更多介紹見7.2.1小節(jié)。,,2. 系統(tǒng)調(diào)用 系統(tǒng)調(diào)用是系統(tǒng)內(nèi)核提供的一組特殊的函數(shù),用戶進(jìn)程通過系統(tǒng)調(diào)用來訪問系統(tǒng)資源。與普通函數(shù)的不同之處在于,普通函數(shù)是由用戶或函數(shù)庫提供的程序代碼,它們的運(yùn)行會(huì)受到系統(tǒng)的限制,不能訪問系統(tǒng)資
50、源。系統(tǒng)調(diào)用是內(nèi)核中的程序代碼,它們具有訪問系統(tǒng)資源的特權(quán)。當(dāng)用戶進(jìn)程需要執(zhí)行涉及系統(tǒng)資源的操作時(shí),需要通過系統(tǒng)調(diào)用,讓內(nèi)核來完成?! ∠到y(tǒng)調(diào)用是借助中斷機(jī)制實(shí)現(xiàn)的,它是軟中斷的一種,稱為“系統(tǒng)調(diào)用”中斷。當(dāng)進(jìn)程執(zhí)行到一個(gè)系統(tǒng)調(diào)用時(shí),就會(huì)產(chǎn)生一個(gè)系統(tǒng)調(diào)用中斷。CPU將響應(yīng)此中斷,轉(zhuǎn)入系統(tǒng)調(diào)用入口程序,然后調(diào)用內(nèi)核中相應(yīng)的系統(tǒng)調(diào)用處理函數(shù),執(zhí)行該系統(tǒng)調(diào)用對(duì)應(yīng)的功能?! £P(guān)于系統(tǒng)調(diào)用的更多介紹見8.4節(jié)。,,4.2.3 進(jìn)程的運(yùn)行模式
51、 1. ?CPU的執(zhí)行模式 CPU的基本功能就是執(zhí)行指令。通常,CPU指令集中的指令可以劃分為兩類:特權(quán)指令和非特權(quán)指令。特權(quán)指令是指具有特殊權(quán)限的指令,可以訪問系統(tǒng)中所有寄存器和內(nèi)存單元,修改系統(tǒng)的關(guān)鍵設(shè)置。比如清理內(nèi)存、設(shè)置時(shí)鐘、執(zhí)行I/O操作等都是由特權(quán)指令完成的。而非特權(quán)指令是那些用于一般性的運(yùn)算和處理的指令。這些指令只能訪問用戶程序自己的內(nèi)存地址空間。,,特權(quán)指令的權(quán)限高,如果使用不當(dāng)則可能會(huì)破壞系統(tǒng)或其他用戶的數(shù)據(jù),
52、甚至導(dǎo)致系統(tǒng)崩潰。為了安全起見,這類指令只允許操作系統(tǒng)的內(nèi)核程序使用,而普通的應(yīng)用程序只能使用那些沒有危險(xiǎn)的非特權(quán)指令。實(shí)現(xiàn)這種限制的方法是在CPU中設(shè)置一個(gè)代表運(yùn)行模式的狀態(tài)字,修改這個(gè)狀態(tài)字就可以切換CPU的運(yùn)行模式?! ?86以上的CPU支持4種不同特權(quán)級(jí)別的運(yùn)行模式,Linux系統(tǒng)只用到了其中兩個(gè),即稱為核心態(tài)的最高特權(quán)級(jí)模式(ring0)和稱為用戶態(tài)的最低特權(quán)級(jí)模式(ring3)。在核心態(tài)下,CPU能不受限制地執(zhí)行所有指令,
53、從而表現(xiàn)出最高的特權(quán)。而在用戶態(tài)下,CPU只能執(zhí)行一般指令,不能執(zhí)行特權(quán)指令,因而也就沒有特權(quán)。內(nèi)核的程序運(yùn)行在核心態(tài)下,而用戶程序則只能運(yùn)行在用戶態(tài)下。從用戶態(tài)轉(zhuǎn)換為核心態(tài)的唯一途徑是中斷(包括系統(tǒng)調(diào)用)。一旦CPU響應(yīng)了中斷,則將CPU的狀態(tài)切換到核心態(tài),待中斷處理結(jié)束返回時(shí),再將CPU狀態(tài)切回到用戶態(tài)。,,2. 進(jìn)程的運(yùn)行模式 進(jìn)程在其運(yùn)行期間常常被中斷或系統(tǒng)調(diào)用打斷,因此CPU也經(jīng)常地在用戶態(tài)與核心態(tài)之間切換。在進(jìn)行通常的計(jì)
54、算和處理時(shí),進(jìn)程運(yùn)行在用戶態(tài);執(zhí)行系統(tǒng)調(diào)用或中斷處理程序時(shí)進(jìn)入核心態(tài),執(zhí)行內(nèi)核代碼。調(diào)用返回后,回到用戶態(tài)繼續(xù)運(yùn)行。圖4-6描述了用戶進(jìn)程的運(yùn)行模式切換。,,,圖4-6 用戶進(jìn)程的運(yùn)行模式切換,在A期間,進(jìn)程運(yùn)行在用戶態(tài),執(zhí)行的是用戶程序代碼。運(yùn)行到某一時(shí)刻時(shí)發(fā)生了中斷,進(jìn)程隨即“陷入”核心態(tài)運(yùn)行。在B期間,CPU運(yùn)行在核心態(tài),執(zhí)行的是內(nèi)核程序代碼。此時(shí)有兩種情況:如果進(jìn)程是被中斷打斷的,則B期間執(zhí)行的是中斷處理程序,它是隨機(jī)插入的,
55、與進(jìn)程本身無關(guān);如果進(jìn)程是因調(diào)用了系統(tǒng)調(diào)用而陷入內(nèi)核空間的,則B執(zhí)行的是內(nèi)核的系統(tǒng)調(diào)用程序代碼,它是作為進(jìn)程的一個(gè)執(zhí)行環(huán)節(jié),由內(nèi)核代理用戶進(jìn)程繼續(xù)執(zhí)行的。在中斷或系統(tǒng)調(diào)用返回后的C期間中,進(jìn)程在用戶態(tài)繼續(xù)運(yùn)行。,,,4.3 進(jìn) 程 控 制 進(jìn)程控制是指對(duì)進(jìn)程的生命周期進(jìn)行有效的管理,實(shí)現(xiàn)進(jìn)程的創(chuàng)建、撤銷以及進(jìn)程各狀態(tài)之間的轉(zhuǎn)換等控制功能。進(jìn)程控制的目標(biāo)是使多個(gè)進(jìn)程能夠平穩(wěn)高效地并發(fā)執(zhí)行,充分共享系統(tǒng)資源。,,4.3.1 進(jìn)程控制
56、的功能 進(jìn)程控制的功能是控制進(jìn)程在整個(gè)生命周期中各種狀態(tài)之間的轉(zhuǎn)換(不包括就緒態(tài)與運(yùn)行態(tài)之間的轉(zhuǎn)換,它們是由進(jìn)程調(diào)度來實(shí)現(xiàn)的)。為此,內(nèi)核提供了幾個(gè)原子性的操作函數(shù),稱為原語(primitive)。原語與普通函數(shù)的區(qū)別是它的各個(gè)指令的執(zhí)行是不可分割的,要么全部完成,要么一個(gè)也不做,因而可以看做是一條廣義的指令。用于進(jìn)程控制的原語主要有創(chuàng)建、終止、阻塞和喚醒等。,,1) 創(chuàng)建進(jìn)程 創(chuàng)建原語的主要任務(wù)是根據(jù)創(chuàng)建者提供的有關(guān)參數(shù)(包括
57、進(jìn)程名、進(jìn)程優(yōu)先級(jí)、進(jìn)程代碼起始地址、資源清單等信息),建立進(jìn)程的PCB。具體的操作過程是:先申請(qǐng)一個(gè)空閑的PCB結(jié)構(gòu),調(diào)用資源分配程序?yàn)樗峙渌璧馁Y源,將有關(guān)信息填入PCB,狀態(tài)置為就緒態(tài),然后把它插入就緒(可執(zhí)行)隊(duì)列中?! ?) 撤銷進(jìn)程 撤銷原語用于在一個(gè)進(jìn)程運(yùn)行終止時(shí),撤銷這個(gè)進(jìn)程并釋放進(jìn)程占用的資源。撤銷的操作過程是:找到要被撤銷的進(jìn)程的PCB,將它從所在隊(duì)列中摘出,釋放進(jìn)程所占用的資源,最后銷去進(jìn)程的PCB。,,3
58、) 阻塞進(jìn)程 阻塞原語用于完成從運(yùn)行態(tài)到等待態(tài)的轉(zhuǎn)換工作。當(dāng)正在運(yùn)行的進(jìn)程需要等待某一事件而無法執(zhí)行下去時(shí),它就調(diào)用阻塞原語把自己轉(zhuǎn)入等待狀態(tài)。阻塞原語具體的操作過程是:首先中斷CPU的執(zhí)行,把CPU的當(dāng)前狀態(tài)保存在PCB的現(xiàn)場信息中;然后把被阻塞的進(jìn)程置為等待狀態(tài),插入到相應(yīng)的等待隊(duì)列中;最后調(diào)用進(jìn)程調(diào)度程序,從就緒(可執(zhí)行)隊(duì)列中選擇一個(gè)進(jìn)程投入運(yùn)行。,,4) 喚醒進(jìn)程 喚醒原語用于完成等待態(tài)到就緒態(tài)的轉(zhuǎn)換工作。當(dāng)處于等待狀
59、態(tài)的進(jìn)程所等待的事件出現(xiàn)時(shí),內(nèi)核會(huì)調(diào)用喚醒原語喚醒被阻塞的進(jìn)程。操作過程是:在等待隊(duì)列中找到該進(jìn)程,置進(jìn)程的當(dāng)前狀態(tài)為就緒態(tài),然后將它從等待隊(duì)列中撤出并插入到就緒(可執(zhí)行)隊(duì)列中。,,4.3.2 Linux系統(tǒng)的進(jìn)程控制 在Linux系統(tǒng)中,進(jìn)程控制的功能是由內(nèi)核的進(jìn)程控制子系統(tǒng)實(shí)現(xiàn)的,并以系統(tǒng)調(diào)用的形式提供給用戶進(jìn)程或其他系統(tǒng)進(jìn)程使用。,,1. 進(jìn)程的創(chuàng)建與映像更換 系統(tǒng)啟動(dòng)時(shí)執(zhí)行初始化程序,啟動(dòng)進(jìn)程號(hào)為1的init進(jìn)程運(yùn)行
60、。系統(tǒng)中所有的其他進(jìn)程都是由init進(jìn)程衍生而來的。除init進(jìn)程外,每個(gè)進(jìn)程都是由另一個(gè)進(jìn)程創(chuàng)建的。新創(chuàng)建的進(jìn)程稱為子進(jìn)程,創(chuàng)建子進(jìn)程的進(jìn)程稱為父進(jìn)程?! nix/Linux系統(tǒng)建立新進(jìn)程的方式與眾不同。它不是一步構(gòu)造出新的進(jìn)程,而是采用先復(fù)制再變身的兩個(gè)步驟,即先按照父進(jìn)程創(chuàng)建一個(gè)子進(jìn)程,然后再更換進(jìn)程映像開始執(zhí)行。,,1) 創(chuàng)建進(jìn)程 創(chuàng)建一個(gè)進(jìn)程的系統(tǒng)調(diào)用是fork()。創(chuàng)建進(jìn)程采用的方法是克隆,即用父進(jìn)程復(fù)制一個(gè)子進(jìn)程。
61、做法是:先獲得一個(gè)空閑的PCB,為子進(jìn)程分配一個(gè)PID,然后將父進(jìn)程的PCB中的代碼及資源復(fù)制給子進(jìn)程的PCB,狀態(tài)置為可執(zhí)行態(tài)。建好PCB后將其鏈接入進(jìn)程鏈表和可執(zhí)行隊(duì)列中。此后,子進(jìn)程與父進(jìn)程并發(fā)執(zhí)行。父子進(jìn)程執(zhí)行的是同一個(gè)代碼,使用的是同樣的資源。它與父進(jìn)程的區(qū)別僅僅在于PID(進(jìn)程號(hào))、PPID(父進(jìn)程號(hào))和與子進(jìn)程運(yùn)行相關(guān)的屬性(如狀態(tài)、累計(jì)運(yùn)行時(shí)間等),而這些是不能從父進(jìn)程那里繼承來的。,,fork()系統(tǒng)調(diào)用 【功能】
62、創(chuàng)建一個(gè)新的子進(jìn)程?! 菊{(diào)用格式】int fork(); 【返回值】 0向子進(jìn)程返回的返回值,總為0 > 0向父進(jìn)程返回的返回值,它是子進(jìn)程的PID?! ?1創(chuàng)建失敗。 【說明】若fork()調(diào)用成功,則它向父進(jìn)程返回子進(jìn)程的PID,并向新建的子進(jìn)程返回0?! D4-7描述了fork()系統(tǒng)調(diào)用的執(zhí)行結(jié)果。,,,圖4-7 fork系統(tǒng)調(diào)用的執(zhí)行結(jié)果,從圖4-7中可以看出,當(dāng)一個(gè)進(jìn)程成功執(zhí)行了fo
63、rk()后,從該調(diào)用點(diǎn)之后分裂成了兩個(gè)進(jìn)程:一個(gè)是父進(jìn)程,從fork()后的代碼處繼續(xù)運(yùn)行;另一個(gè)是新創(chuàng)建的子進(jìn)程,從fork()后的代碼處開始運(yùn)行。由fork()產(chǎn)生的進(jìn)程分裂在結(jié)構(gòu)上很像一把叉子,故得名fork()?! ∨c一般函數(shù)不同,fork()是“一次調(diào)用,兩次返回”,因?yàn)檎{(diào)用成功后,已經(jīng)是兩個(gè)進(jìn)程了。由于子進(jìn)程是從父進(jìn)程那里復(fù)制的代碼,因此父子進(jìn)程執(zhí)行的是同一個(gè)程序,它們?cè)趫?zhí)行時(shí)的區(qū)別只在于得到的返回值不同。父進(jìn)程得到的返回
64、值是一個(gè)大于0的數(shù),它是子進(jìn)程的PID;子進(jìn)程得到的返回值為0。,,若程序中不考慮fork()的返回值,則父子進(jìn)程的行為就完全一樣了。但創(chuàng)建一個(gè)子進(jìn)程的目的是想讓它做另一件事。所以,通常的做法是:在fork()調(diào)用后,通過判斷fork()的返回值,分別為父進(jìn)程和子進(jìn)程設(shè)計(jì)不同的執(zhí)行分支。這樣,父子進(jìn)程執(zhí)行的雖是同一個(gè)代碼,執(zhí)行路線卻分道揚(yáng)鑣。圖4-8描述了用fork()創(chuàng)建子進(jìn)程的常用流程。,,,圖4-8 用fork創(chuàng)建子進(jìn)程,例4.
65、2 一個(gè)簡單的fork_test程序: #include main() { int rid; rid = fork(); if (rid 0 ) // 父進(jìn)程分支 printf(“I am parent, my rid is %d, my PID is %d\n”, rid, getpid()); else // 子進(jìn)程分支
66、 printf(“I am child, my rid is %d, my PID is %d\n”, rid, getpid()); },,注:程序中的getpid()是一個(gè)系統(tǒng)調(diào)用,它返回本進(jìn)程的進(jìn)程標(biāo)識(shí)號(hào)PID?! ork_test程序運(yùn)行時(shí),父子進(jìn)程將會(huì)輸出不同的信息,如父進(jìn)程的輸出可能是“I am parent, my rid is 8229, my PID is 8228”;子進(jìn)程的輸出可能是“I am chil
67、d, my rid is 0, my PID is 8229”。由于兩進(jìn)程是并發(fā)的,它們輸出信息的先后次序不確定,有可能父先子后,也可能相反。,,2) 更換進(jìn)程映像 進(jìn)程映像是指進(jìn)程所執(zhí)行的程序代碼及數(shù)據(jù)。fork()是將父進(jìn)程的執(zhí)行映像拷貝給子進(jìn)程,因而子進(jìn)程實(shí)際上是父進(jìn)程的克隆體。但通常用戶需要的是創(chuàng)建一個(gè)新的進(jìn)程,它執(zhí)行的是一個(gè)不同的程序。Linux系統(tǒng)的做法是,先用fork()克隆一個(gè)子進(jìn)程,然后在子進(jìn)程中調(diào)用exec(),
68、使其脫胎換骨,變換為一個(gè)全新的進(jìn)程?! xec()系統(tǒng)調(diào)用的功能是根據(jù)參數(shù)指定的文件名找到程序文件,把它裝入內(nèi)存,覆蓋原來進(jìn)程的映像,從而形成一個(gè)不同于父進(jìn)程的全新的子進(jìn)程。除了進(jìn)程映像被更換外,新子進(jìn)程的PID及其他PCB屬性均保持不變,實(shí)際上是一個(gè)新的進(jìn)程“借殼”原來的子進(jìn)程開始運(yùn)行。,,exec()系統(tǒng)調(diào)用 【功能】改變進(jìn)程的映像,使其執(zhí)行另外的程序?! 菊{(diào)用格式】exec()是一系列系統(tǒng)調(diào)用,共有6種調(diào)用格式,其中e
69、xecve()是真正的系統(tǒng)調(diào)用,其余是對(duì)其包裝后的C庫函數(shù)。 int execve(char *path, char *argv[], char *envp[]); int execl(char *path, char *arg0, char *arg1, ... char *argn, 0); int execle(char *path, char *arg0, char *arg1, ... char *argn, 0,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 第4章 操作系統(tǒng)(答案)
- 數(shù)據(jù)庫系統(tǒng)原理及應(yīng)用教程 第4版 教學(xué)課件 ppt 作者 劉瑞新 第1章
- 第4章操作系統(tǒng)安全
- 《操作系統(tǒng)》第2章
- 第9章基于linux操作系統(tǒng)的arm編程
- 經(jīng)濟(jì)學(xué)原理 教學(xué)課件 ppt 作者 譚春枝 第6章 市場失靈
- 【linux操作系統(tǒng)】第9章 動(dòng)態(tài)主機(jī)配置協(xié)議dhcp
- 操作系統(tǒng)第章答案上
- 實(shí)用統(tǒng)計(jì) 教學(xué)課件 ppt 作者 樊培茗1第1章
- 同濟(jì)《linux操作系統(tǒng)》課后習(xí)題4章
- 計(jì)算機(jī)應(yīng)用基礎(chǔ)教學(xué)課件ppt作者 武馬群第1章
- 檢測技術(shù)及儀表 教學(xué)課件 ppt 作者 樊春玲 第2章壓力測量
- 數(shù)控機(jī)床編程與操作 教學(xué)課件 ppt 作者 廖懷平 第5章
- 電氣安全 教學(xué)課件 ppt 作者 楊岳 電氣安全第4章
- 專升本(計(jì)算機(jī)專業(yè)課件)操作系統(tǒng)課件第章操作系統(tǒng)的發(fā)展與分類
- 工程力學(xué) 第4版 教學(xué)課件 ppt 作者 張秉榮 第七章
- 操作系統(tǒng)第2章練習(xí)題
- 材料成形裝備及自動(dòng)化 教學(xué)課件 ppt 作者 樊自田 第6章(1)
- 第6章 文件操作
- 第2章 中文windows 2000操作系統(tǒng)
評(píng)論
0/150
提交評(píng)論