linux操作系統(tǒng)原理與應用 教學課件 ppt 作者 張玲 第1-6章 第4章_第1頁
已閱讀1頁,還剩171頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

1、第4章 進 程 管 理,,4.1 進程 4.2 進程的運行模式 4.3 進程控制 4.4 進程調(diào)度 4.5 進程的互斥與同步 4.6 進程通信 4.7 線程 習題,4.1 進 程  進程是現(xiàn)代操作系統(tǒng)的核心概念,它用來描述程序的執(zhí)行過程,是實現(xiàn)多任務操作系統(tǒng)的基礎。操作系統(tǒng)的其他所有內(nèi)容都是圍饒著進程展開的。因此,正確地理解和認識進程是理解操作系統(tǒng)原理的基礎和關鍵。,,4.1.1 程序的順序執(zhí)

2、行與并發(fā)執(zhí)行  1. 程序的順序執(zhí)行  如果程序的各操作步驟之間是依序執(zhí)行的,程序與程序之間是串行執(zhí)行的,這種執(zhí)行程序的方式就稱為順序執(zhí)行。順序執(zhí)行是單道程序系統(tǒng)中的程序的運行方式?! 〕绦虻捻樞驁?zhí)行具有如下特點:  (1) 順序性:CPU嚴格按照程序規(guī)定的順序執(zhí)行,僅當一個操作結(jié)束后,下一個操作才能開始執(zhí)行。多個程序要運行時,僅當一個程序全部執(zhí)行結(jié)束后另一個程序才能開始。,,(2) 封閉性:程序在封閉的環(huán)境中運行,即程序運行時

3、獨占全部系統(tǒng)資源,只有程序本身才能改變程序的運行環(huán)境。因而程序的執(zhí)行過程不受外界因素的影響,結(jié)果只取決于程序自身?! ?3) 可再現(xiàn)性:程序執(zhí)行的結(jié)果與運行的時間和速度無關,結(jié)果總是可再現(xiàn)的,即無論何時重復執(zhí)行該程序都會得到同樣的結(jié)果?! 】偟恼f來,這種執(zhí)行程序的方式簡單,且便于調(diào)試。但由于順序程序在運行時獨占全部系統(tǒng)資源,因而系統(tǒng)資源利用率很低。DOS程序就是采用順序方式執(zhí)行的。,,2. 程序的并發(fā)執(zhí)行  單道程序、封閉式運行是

4、早期操作系統(tǒng)的標志,而多道程序并發(fā)運行是現(xiàn)代操作系統(tǒng)的基本特征。由于同時有多個程序在系統(tǒng)中運行,使系統(tǒng)資源得到充分的利用,系統(tǒng)效率大大提高。  程序的并發(fā)執(zhí)行是指若干個程序或程序段同時運行。它們的執(zhí)行在時間上是重疊的,即同一程序或不同程序的程序段可以交叉執(zhí)行。,,程序的并發(fā)執(zhí)行有以下特點:  (1) 間斷性:并發(fā)程序之間因競爭資源而相互制約,導致程序運行過程的間斷。例如,在只有一個CPU的系統(tǒng)中,多個程序需要輪流占用CPU運行,未獲

5、得CPU使用權(quán)的程序就必須等待?! ?2) 沒有封閉性:當多個程序共享系統(tǒng)資源時,一個程序的運行受其他程序的影響,其運行過程和結(jié)果不完全由自身決定。例如,一個程序計劃在某一時刻執(zhí)行一個操作,但很可能在那個時刻到來時它沒有獲得CPU的使用權(quán),因而也就無法完成該操作。,,(3) 不可再現(xiàn)性:由于沒有了封閉性,并發(fā)程序的執(zhí)行結(jié)果與執(zhí)行的時機以及執(zhí)行的速度有關,結(jié)果往往不可再現(xiàn)?! 】梢钥闯觯l(fā)執(zhí)行程序雖然可以提高系統(tǒng)的資源利用率和吞吐量

6、,但程序的行為變得復雜和不確定。這使程序難以調(diào)試,若處理不當還會帶來許多潛在問題。,,3. 并發(fā)執(zhí)行的潛在問題  程序在并發(fā)執(zhí)行時會導致執(zhí)行結(jié)果的不可再現(xiàn)性,這是多道程序系統(tǒng)必須解決的問題。我們用下面的例子來說明并發(fā)執(zhí)行過程對運行結(jié)果的影響,從而了解產(chǎn)生問題的原因?! ≡O某停車場使用程序控制電子公告牌來顯示空閑車位數(shù)。空閑車位數(shù)用一個計數(shù)器C記錄。車輛入庫時執(zhí)行程序A,車輛出庫時執(zhí)行程序B,它們都要更新同一個計數(shù)器C。程序A和程序B

7、的片段如圖4-1所示。,,,圖4?1 兩程序并發(fā)運行,訪問計數(shù)器C,更新計數(shù)器C的操作對應的機器語言有3個步驟:讀取內(nèi)存C單元的數(shù)據(jù)到一個寄存器中,修改寄存器的數(shù)值,然后再將其寫回C單元中。  由于車輛出入庫的時間是隨機的,程序A與程序B的運行時間也就是不確定的。當出入庫同時發(fā)生時,將使兩程序在系統(tǒng)中并發(fā)運行。它們各運行一次后C計數(shù)器的值應保持不變。但結(jié)果可能不是如此。,,如果兩個程序的運行時序按圖4-2(a)所示的順序進行,即一個

8、程序?qū)進行更新的操作是在另一個程序的更新操作全部完成之后才開始,則C被正確地更新了。如果兩個程序的運行時序如圖4-2(b)所示穿插地進行,即當一個程序正在更新C,更新操作還未完成時,CPU發(fā)生了切換,另一個程序被調(diào)度運行,并且也對C進行更新。在這種情況下會導致錯誤的結(jié)果。  可以看出,導致C更新錯誤的原因是兩個程序交叉地執(zhí)行了更新C的操作。概括地說,當多個程序在訪問共享資源時的操作是交叉執(zhí)行時,則會發(fā)生對資源使用上的錯誤。,,圖4?

9、2 并發(fā)程序的執(zhí)行時序影響執(zhí)行結(jié)果,4.1.2 進程的概念  進程的概念最早出現(xiàn)在20世紀60年代中期,此時操作系統(tǒng)進入多道程序設計時代。多道程序并發(fā)顯著地提高了系統(tǒng)的效率,但同時也使程序的執(zhí)行過程變得復雜而不確定。為了更好地研究、描述和控制并發(fā)程序的執(zhí)行過程,操作系統(tǒng)引入了進程的概念。進程概念對于理解操作系統(tǒng)的并發(fā)性有著極為重要的意義。,,1. 進程  進程(process)是一個可并發(fā)執(zhí)行的程序在某數(shù)據(jù)集上的一次運行。簡單地

10、說,進程就是程序的一次運行過程?! ∵M程與程序的概念既相互關聯(lián)又相互區(qū)別。程序是進程的一個組成部分,是進程的執(zhí)行文本,而進程是程序的執(zhí)行過程。兩者的關系可以比喻為電影與膠片的關系:膠片是靜態(tài)的,是電影的放映素材。而電影是動態(tài)的,一場電影就是膠片在放映機上的一次“運行”。對進程而言,程序是靜態(tài)的指令集合,可以永久存在;而進程是個動態(tài)的過程實體,動態(tài)地產(chǎn)生、發(fā)展和消失。,,此外,進程與程序之間也不是一一對應的關系,表現(xiàn)在:  (1) 一

11、個進程可以順序執(zhí)行多個程序,如同一場電影可以連續(xù)播放多部膠片一樣?! ?2) 一個程序可以對應多個進程,就像一本膠片可以放映多場電影一樣。程序的每次運行就對應了一個不同的進程。更重要的是,一個程序還可以同時對應多個進程。比如系統(tǒng)中只有一個vi程序,但它可以被多個用戶同時執(zhí)行,編輯各自的文件。每個用戶的編輯過程都是一個不同的進程。,,2. 進程的特性  進程與程序的不同主要體現(xiàn)在進程有一些程序所沒有的特性。要真正理解進程,首先應了解它

12、的基本性質(zhì)。進程具有以下幾個基本特性:  (1) 動態(tài)性:進程由“創(chuàng)建”而產(chǎn)生,由“撤銷”而消亡,因“調(diào)度”而運行,因“等待”而停頓。進程從創(chuàng)建到消失的全過程稱為進程的生命周期?! ?2) 并發(fā)性:在同一時間段內(nèi)有多個進程在系統(tǒng)中活動。它們宏觀上是在并發(fā)運行,而微觀上是在交替運行。,,(3) 獨立性:進程是可以獨立運行的基本單位,是操作系統(tǒng)分配資源和調(diào)度管理的基本對象。因此,每個進程都獨立地擁有各種必要的資源,獨立地占有CPU并獨立

13、地運行?! ?4) 異步性:每個進程都獨立地執(zhí)行,各自按照不可預知的速度向前推進。進程之間的協(xié)調(diào)運行由操作系統(tǒng)負責。,,3. 進程的基本狀態(tài)  在多道系統(tǒng)中,進程的個數(shù)總是多于CPU的個數(shù),因此它們需要輪流地占用CPU。從宏觀上看,所有進程同時都在向前推進,而在微觀上,這些進程是在走走停停之間完成整個運行過程的。為了刻畫一個進程在各個時期的動態(tài)行為特征,通常采用狀態(tài)圖模型。  進程有3個基本的狀態(tài),即:  (1) 就緒態(tài):進程已

14、經(jīng)分配到了除CPU之外的所有資源,這時的進程狀態(tài)稱為就緒狀態(tài)。處于就緒態(tài)的進程,一旦獲得CPU便可立即執(zhí)行。系統(tǒng)中通常會有多個進程處于就緒態(tài),它們排成一個就緒隊列。,,(2) 運行態(tài):進程已經(jīng)獲得CPU,正在運行,這時的進程狀態(tài)稱為運行態(tài)。在單CPU系統(tǒng)中,任何時刻只能有一個進程處于運行態(tài)?! ?3) 等待態(tài):進程因某種資源不能滿足,或希望的某事件尚未發(fā)生而暫停執(zhí)行時,則稱它處于等待態(tài)。系統(tǒng)中常常會有多個進程處于等待態(tài),它們按等待的事

15、件分類,排成多個等待隊列。,,4. 進程狀態(tài)的轉(zhuǎn)換  進程誕生之初是處于就緒狀態(tài),在其隨后的生存期間內(nèi)不斷地從一個狀態(tài)轉(zhuǎn)換到另一個狀態(tài),最后在運行狀態(tài)結(jié)束。圖4-3所示是一個進程的狀態(tài)轉(zhuǎn)換圖?! ∫馉顟B(tài)轉(zhuǎn)換的原因如下:  運行態(tài)→等待態(tài):正在執(zhí)行的進程因為等待某事件而無法執(zhí)行下去,比如,進程申請某種資源,而該資源恰好被其他進程占用,則該進程將交出CPU,進入等待狀態(tài)。,,,圖4?3 進程的狀態(tài)轉(zhuǎn)換圖,等待態(tài)→就緒態(tài):處于等待狀

16、態(tài)的進程,當其所申請的資源得到滿足,則系統(tǒng)將資源分配給它,并將其狀態(tài)變?yōu)榫途w態(tài)?! ∵\行態(tài)→就緒態(tài):正在執(zhí)行的進程的時間片用完了,或者有更高優(yōu)先級的進程到來,系統(tǒng)會暫停該進程的運行,使其進入就緒態(tài),然后調(diào)度其他進程運行。  就緒態(tài)→運行態(tài):處于就緒狀態(tài)的進程,當被進程調(diào)度程序選中后,即進入CPU運行。此時該進程的狀態(tài)變?yōu)檫\行態(tài)。,,4.1.3 進程控制塊  進程由程序、數(shù)據(jù)和進程控制塊3部分組成,其中程序是進程執(zhí)行的可執(zhí)行代碼,

17、數(shù)據(jù)是進程所處理的對象,進程控制塊記錄進程的所有信息。它們存在于內(nèi)存,其內(nèi)容會隨著執(zhí)行過程的進展而不斷變化。在某個時刻的進程的內(nèi)容被稱為進程映像(process image)。  系統(tǒng)中每個進程都是唯一的,用一個進程控制塊描述。即使兩個進程執(zhí)行的是同一程序,處理同一數(shù)據(jù),它們的進程控制塊也是不同的。因此可以說,進程控制塊是進程的標志。,,1. 進程控制塊  進程控制塊(Process Control Block,PCB)是系統(tǒng)為管

18、理進程設置的一個數(shù)據(jù)結(jié)構(gòu),用于記錄進程的相關信息。PCB是系統(tǒng)感知和控制進程的一個數(shù)據(jù)實體。當創(chuàng)建一個進程時,系統(tǒng)為它生成PCB;進程完成后,撤銷它的PCB。因此,PCB是進程的代表,PCB存在則進程就存在,PCB消失則進程也就結(jié)束了。在進程的生存期中,系統(tǒng)通過PCB來了解進程的活動情況,對進程實施控制和調(diào)度。因此,PCB是操作系統(tǒng)中的最重要數(shù)據(jù)結(jié)構(gòu)之一。,,2. 進程控制塊的內(nèi)容  PCB記錄了有關進程的系統(tǒng)所關心的所有信息,主要包

19、括以下4方面的內(nèi)容:  1) 進程描述信息  進程描述信息用于記錄一個進程的特征和基本情況,通過這些信息可以識別該進程,了解該進程的歸屬信息,以及確定這個進程與其他進程之間的關系。  系統(tǒng)為每個進程分配了一個唯一的整數(shù)作為進程標識號PID,通過這個PID來標識這個進程。操作系統(tǒng)、用戶以及其他進程都是通過PID來識別進程的。此外,還要描述進程的家族關系,即父進程(創(chuàng)建該進程的進程)和子進程(該進程創(chuàng)建的進程)的信息。,,2) 進程控

20、制和調(diào)度信息  進程是系統(tǒng)運行調(diào)度的基本單位。進程控制塊記錄了進程的當前狀態(tài)、調(diào)度信息、記時信息等。系統(tǒng)依據(jù)這些信息確定進程的狀態(tài),實施進程控制和調(diào)度?! ?) 資源信息  系統(tǒng)以進程為單位分配資源,并將資源信息記錄在進程的PCB中。資源包括該進程使用的存儲器空間、打開的文件以及設備等。通過這些信息,進程就可以得到運行需要的相關程序段與數(shù)據(jù)段、使用文件和設備等資源。,,4) 現(xiàn)場信息  現(xiàn)場信息一般包括CPU的內(nèi)部寄存器和系統(tǒng)堆

21、棧等,它們的值刻畫了進程的運行狀態(tài)。退出CPU的進程必須保存好這些現(xiàn)場狀態(tài),以便在下次被調(diào)度時繼續(xù)運行。當一個進程被重新調(diào)度運行時,要用PCB中的現(xiàn)場信息來恢復CPU的運行現(xiàn)場?,F(xiàn)場一旦切換,下一個指令周期CPU將精確地接著上次運行的斷點處繼續(xù)執(zhí)行下去。,,4.1.4 進程的組織  管理進程就是管理進程的PCB。一個系統(tǒng)中通??赡軗碛袛?shù)百乃至上千個進程,為了有效地管理如此多的PCB,系統(tǒng)需要采用適當?shù)姆绞綄⑺鼈兘M織在一起。所有的PC

22、B都存放在內(nèi)存中,通常采用的組織結(jié)構(gòu)有數(shù)組、索引和鏈表3種方式。  數(shù)組方式是將所有的PCB順序存放在一個一維數(shù)組中。這種方式比較簡單,但操作起來效率低,比如,要查找某個PCB時需要掃描全表?! ∷饕绞绞峭ㄟ^在PCB數(shù)組上設置索引表或散列表,以加快訪問速度。,,鏈表方式是將PCB鏈接起來,構(gòu)成鏈式隊列或鏈表。例如,所有就緒的PCB鏈成一個就緒隊列;所有等待的PCB按等待的事件鏈成多個等待隊列。這樣,在進程調(diào)度時只要掃描就緒隊列即可

23、,等待的事件發(fā)生時只要掃描相應的等待隊列即可。當進程狀態(tài)發(fā)生轉(zhuǎn)換時,鏈式結(jié)構(gòu)允許方便地向隊列插入和刪除一個PCB。  實際的系統(tǒng)中通常會結(jié)合采用這些方法,以求達到最好的效率。,,4.1.5 Linux系統(tǒng)中的進程  在Linux系統(tǒng)中,進程也稱為任務(task),兩者的概念是一致的?! ?. ?Linux進程的狀態(tài)  Linux的進程共有5種基本狀態(tài),包括運行、就緒、睡眠(分為可中斷的與不可中斷的)、暫停和僵死。狀態(tài)轉(zhuǎn)換圖如圖

24、4-4所示。,,,圖4-4 Linux系統(tǒng)的進程狀態(tài)轉(zhuǎn)換圖,Linux將這些基本狀態(tài)歸結(jié)為4種并加以命名和定義,它們是:  (1) 可執(zhí)行態(tài)(runnable):可執(zhí)行態(tài)實際包含了上述基本狀態(tài)中的運行和就緒兩種狀態(tài)。處于可執(zhí)行態(tài)的進程均已具備運行條件。它們或正在運行,或準備運行?! ?2) 睡眠態(tài)(sleeping):即等待態(tài)。進程在等待某個事件或某個資源。睡眠態(tài)又細分為可中斷的(interruptible)和不可中斷的(unin

25、terruptible)兩種。它們的區(qū)別在于,在睡眠過程中,不可中斷狀態(tài)的進程會忽略信號,而處于可中斷狀態(tài)的進程如果收到信號會被喚醒而進入可執(zhí)行狀態(tài),待處理完信號后再次進入睡眠狀態(tài)。,,(3) 暫停態(tài)(stopped):處于暫停態(tài)的進程一般都是由運行態(tài)轉(zhuǎn)換而來,等待某種特殊處理。比如調(diào)試跟蹤的程序,每執(zhí)行到一個斷點,就轉(zhuǎn)入暫停態(tài),等待新的輸入信號?! ?4) 僵死態(tài)(zombie):進程運行結(jié)束或因某些原因被終止時,它將釋放除PCB外

26、的所有資源。這種占有PCB但已經(jīng)無法運行的進程就處于僵死狀態(tài)。,,2. ?Linux進程的狀態(tài)轉(zhuǎn)換過程  Linux進程的狀態(tài)轉(zhuǎn)換過程是:新創(chuàng)建的進程處于可執(zhí)行的就緒態(tài),等待調(diào)度執(zhí)行?! √幱诳蓤?zhí)行態(tài)的進程在就緒態(tài)和運行態(tài)之間輪回。就緒態(tài)的進程一旦被調(diào)度程序選中,就進入運行狀態(tài)。等時間片耗盡之后,退出CPU,轉(zhuǎn)入就緒狀態(tài)等待下一次的調(diào)度。處于此輪回的進程在運行與就緒之間不斷地高速切換,可謂瞬息萬變。因此,對觀察者(系統(tǒng)與用戶)來說,

27、將此輪回概括為一個相對穩(wěn)定的可執(zhí)行態(tài)才有意義。,,運行態(tài)、睡眠態(tài)和就緒態(tài)形成一個回路。處于運行態(tài)的進程,有時需要等待某個事件或某種資源的發(fā)生,這時已無法占有CPU繼續(xù)工作,于是它就退出CPU,轉(zhuǎn)入睡眠狀態(tài)。當所等待的事件發(fā)生后,進程被喚醒,進入就緒狀態(tài)?! ∵\行態(tài)、暫停態(tài)和就緒態(tài)也構(gòu)成一個回路。當處于運行態(tài)的進程接收到暫停執(zhí)行信號時,它就放棄CPU,進入暫停態(tài)。當暫停的進程獲得恢復執(zhí)行信號時,就轉(zhuǎn)入就緒態(tài)?! √幱谶\行態(tài)的進程調(diào)用退

28、出函數(shù)exit之后,進入僵死態(tài)。當父進程對該進程進行相應的處理后,撤銷其PCB。此時,這個進程就完成了它的使命,從僵死走向徹底消失。,,3. ?Linux的進程控制塊  Linux系統(tǒng)的PCB用一個稱為task_struct的結(jié)構(gòu)體來描述。系統(tǒng)中每創(chuàng)建一個新的進程,就給它分配一個task_struct結(jié)構(gòu),并填入進程的控制信息。task_struct主要包括以下內(nèi)容:  (1) 進程標識號(PID):PID是標識該進程的一個整數(shù)。系

29、統(tǒng)通過這個標識號來唯一地標識一個進程。  (2) 用戶標識(UID)和組標識(GID):描述進程的歸屬關系,即進程的屬主和屬組的標識號。系統(tǒng)通過這兩個標識號判斷進程對文件和設備的訪問權(quán)限。,,(3) 鏈接信息:用指針的方式記錄進程的父進程、兄弟進程以及子進程的位置(即PCB的地址)。系統(tǒng)通過鏈接信息確定進程的家族關系以及其在整個進程鏈中的位置。  (4) 狀態(tài):進程當前的狀態(tài)。  (5) 調(diào)度信息:與系統(tǒng)調(diào)度相關的信息,包括優(yōu)先級

30、、時間片和調(diào)度策略?! ?6) 記時信息:包括時間和定時器。時間記錄進程建立的時間以及進程占用CPU的時間統(tǒng)計,是進程調(diào)度、統(tǒng)計和監(jiān)控的依據(jù)。定時器用于設定一個時間。時間到時,系統(tǒng)會發(fā)定時信號通知進程。,,(7) 通信信息:記錄有關進程間信號量通信及信號通信的信息。  (8) 退出碼:記錄進程運行結(jié)束后的退出狀態(tài),供父進程查詢用?! ?9) 文件系統(tǒng)信息:包括根目錄、當前目錄、打開的文件以及文件創(chuàng)建掩碼等信息?! ?10) 內(nèi)存

31、信息:記錄進程的代碼映像和堆棧的地址、長度等信息。  (11) 進程現(xiàn)場信息:保存進程放棄CPU時所有CPU寄存器及堆棧的當前值。,,4. 查看進程的信息  在Linux系統(tǒng)中,要查看進程的信息可使用ps(process status)命令。該命令可查看記錄在進程PCB中的幾乎所有信息?! s命令  【功能】查看進程的信息?!  靖袷健縫s [選項]  【選項】  -e顯示所有進程?! ?f以全格式顯示。,,-

32、r只顯示正在運行的進程?! ?o以用戶定義的格式顯示?! 顯示所有終端上的所有進程。  u以面向用戶的格式顯示?! 顯示所有不控制終端的進程?!  菊f明】  (1) 默認只顯示在本終端上運行的進程,除非指定了-e、a、x等選項?! ?2) 沒有指定顯示格式時,采用以下缺省格式,分4列顯示:  PID TTY TIME CMD,,各字段的含義是:  PID進程標識號。  TTY進程

33、對應的終端,?表示該進程不占用終端?! IME進程累計使用的CPU時間?! MD進程執(zhí)行的命令名。  (1) 指定-f選項時,以全格式,分8列顯示:  UID PID PPID C STIME TTY TIME CMD  各字段的含義是:  UID進程屬主的用戶名?! PID父進程的標識號?! 進程最近使用的CPU時間?! TIME進程開始時間?! ∑溆嗤?。,,(2

34、) 指定u選項時,以用戶格式,分11列顯示:  USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND  各字段的含義是:  USER同UID。  %CPU進程占用CPU的時間與進程總運行時間之比?! ?MEM進程占用的內(nèi)存與總內(nèi)存之比?! SZ進程虛擬內(nèi)存的大小,以KB為單位?! SS占用實際內(nèi)存的大小,以KB為單位?! TAT進程當前

35、狀態(tài),用字母表示。含義:R執(zhí)行態(tài);S睡眠態(tài);D不可中斷睡眠態(tài);T暫停態(tài);Z僵尸態(tài)。,,START同STIME?! OMMAND同CMD。  其余同上。  例4.1 ps命令用法示例:  $ ps#以缺省格式顯示本終端上的進程的信息   PID TTY TIME CMD   9805 pts/0 00:00:00 bash

36、   9835 pts/0 00:00:00 ps  $ ps -ef #以全格式顯示當前系統(tǒng)中所有進程的信息   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#以用戶格式顯示當前系統(tǒng)中所有進程的信息  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進程的組織  Linux系統(tǒng)采用了多種方式來組織PCB,主要有以下幾種。  1) 進程鏈表  系統(tǒng)將所有的PCB鏈成一個雙向循環(huán)鏈表,進程通過PCB中的list_he

40、ad字段鏈入進程鏈表。遍歷該鏈表即可順序地找到每個進程?! ≡谠S多情況下,內(nèi)核需要根據(jù)進程的PID查找進程。順序掃描鏈表并逐個檢查PCB中的PID是相當?shù)托У摹榱思铀俨檎?,?nèi)核還設置了幾個進程散列表,將PID直接映射到PCB。,,2) 進程樹鏈表  Linux系統(tǒng)中,進程之間存在著父子關系。除了init進程外,每個進程都有一個父進程,即創(chuàng)建了此進程的進程。一個進程可以創(chuàng)建0至多個進程,稱為它的子進程。具有相同父進程的進程稱為兄弟進

41、程。這樣,系統(tǒng)中的所有進程形成了一棵進程樹,每個進程都是樹中的一個節(jié)點,樹的根是init進程,它是所有進程的祖先進程?! ≡赑CB中設置有父進程指針parent、子進程指針children和兄弟進程指針sibling,它們構(gòu)造出了進程樹的結(jié)構(gòu)。進程通過這些指針可以直接找到它的家族成員。,,3) 可執(zhí)行隊列  為了方便進程的調(diào)度,系統(tǒng)把所有處于可執(zhí)行狀態(tài)的PCB組織成一個可執(zhí)行隊列,處于可執(zhí)行狀態(tài)的進程通過PCB中的run_list字

42、段鏈入隊列??蓤?zhí)行隊列中設置了一個curr指針,它指向隊列中正在使用CPU的進程,用來區(qū)別就緒態(tài)和運行態(tài)的進程。在進程切換時,進程調(diào)度程序從可執(zhí)行隊列中選擇一個讓其運行,并將curr指針指向它。,,4) 等待隊列  進程因不同的原因而睡眠,例如,等待磁盤操作的數(shù)據(jù)、等待某系統(tǒng)資源可用或等待固定的時間間隔。系統(tǒng)將睡眠的進程分類管理,每類對應一個特定的事件,用一個等待隊列鏈接。等待隊列是一個雙向循環(huán)鏈表,鏈表的節(jié)點中包含了指向進程PCB的

43、指針。當某一事件發(fā)生時,內(nèi)核會喚醒相應的等待隊列中滿足等待條件的進程,將喚醒的進程從隊列中刪除,加入到可執(zhí)行隊列中。,,,4.2 進程的運行模式  進程的運行緊密依賴于操作系統(tǒng)的內(nèi)核。因此,理解進程的運行機制需要首先認識內(nèi)核,了解內(nèi)核的運行方式,進而了解進程在核心態(tài)與用戶態(tài)下的不同執(zhí)行模式。4.2.1 操作系統(tǒng)內(nèi)核  一個完整的操作系統(tǒng)由一個內(nèi)核和一些系統(tǒng)服務程序構(gòu)成。內(nèi)核(kernel)是操作系統(tǒng)的核心,它負責最基本的資源管

44、理和控制工作,為進程提供良好的運行環(huán)境?! D4-5是Linux系統(tǒng)的層次體系結(jié)構(gòu)。系統(tǒng)分為3層:最底層是系統(tǒng)硬件;硬件層之上是核心層,它是運行程序和管理基本硬件的核心程序;用戶層由系統(tǒng)的核外程序和用戶程序組成,它們都是以用戶進程的方式運行在核心之上。,,,圖4-5 Linux系統(tǒng)的體系結(jié)構(gòu),內(nèi)核在系統(tǒng)引導時載入并常駐內(nèi)存,形成對硬件的第一層包裝。啟動了內(nèi)核的系統(tǒng)具備了執(zhí)行進程的所有條件,使進程可以被正確地創(chuàng)建、運行、控制和撤銷。為

45、此,內(nèi)核應具備支撐進程運行的所有功能,包括對進程本身的控制及對進程要使用的資源的管理?! inux系統(tǒng)的內(nèi)核主要由以下成分構(gòu)成:  (1) 進程控制子系統(tǒng),負責支持、管理和控制進程的運行,包括以下模塊:  ● 進程調(diào)度模塊,負責調(diào)度進程的運行?!  ?進程通信模塊,實現(xiàn)進程間的本地通信?!  ?內(nèi)存管理模塊,管理進程的地址空間。,,(2) 文件子系統(tǒng),為進程提供I/O環(huán)境,包括以下模塊和成分:  ● 文件系統(tǒng)模塊,管理文件

46、和設備?!  ?網(wǎng)絡接口模塊,實現(xiàn)進程間的網(wǎng)絡通信?!  ?設備驅(qū)動程序,驅(qū)動和控制設備的運行?! ?1) 系統(tǒng)調(diào)用接口,提供進程與內(nèi)核的接口,進程通過此接口調(diào)用內(nèi)核的功能?! ?2) 硬件控制接口,是內(nèi)核與硬件的接口,負責控制硬件并響應和處理中斷事件。,,4.2.2 中斷與系統(tǒng)調(diào)用  由圖可以看出,內(nèi)核與外界的接口是來自用戶層的系統(tǒng)調(diào)用和來自硬件層的中斷,而系統(tǒng)調(diào)用本身也是一種特殊的中斷。因此可以說內(nèi)核是中斷驅(qū)動的,它的主

47、要作用就是提供系統(tǒng)調(diào)用和中斷的處理。因此,了解內(nèi)核的運行機制需要先了解中斷和系統(tǒng)調(diào)用的概念。,,1. 中斷  在早期的計算機系統(tǒng)中,CPU與各種設備是串行工作的。當需要設備傳輸數(shù)據(jù)時,CPU向設備發(fā)出指令,啟動設備執(zhí)行數(shù)據(jù)傳輸操作。然后CPU不斷地測試設備的狀態(tài),直到它完成操作。在設備工作期間,CPU是處于原地踏步的循環(huán)中,這對CPU資源是極大的浪費?! ≈袛嗉夹g(shù)的出現(xiàn)完全改變了計算機系統(tǒng)的操作模式。在現(xiàn)代系統(tǒng)中,CPU與各種設備是

48、并發(fā)工作的。在中斷方式下,CPU啟動設備操作后,它不是空閑等待,而是繼續(xù)執(zhí)行程序。當設備完成I/O操作后,向CPU發(fā)出一種特定的中斷信號,打斷CPU的運行。CPU響應中斷后暫停正在執(zhí)行的程序,轉(zhuǎn)去執(zhí)行專門的中斷處理程序,然后再返回原來的程序繼續(xù)執(zhí)行。這個過程就是中斷。,,中斷的概念是因?qū)崿F(xiàn)CPU與設備并行操作而引入的。然而,這個概念后來被大大地擴大了?,F(xiàn)在,系統(tǒng)中所有異步發(fā)生的事件都是通過中斷機制來處理的,包括I/O設備中斷、系統(tǒng)時鐘中

49、斷、硬件故障中斷、軟件異常中斷等。這些中斷分為硬件中斷和軟件中斷(也稱為異常)兩大類。每個中斷都對應一個中斷處理程序。中斷發(fā)生后,CPU通過中斷處理入口轉(zhuǎn)入相應的處理程序來處理中斷事件?! £P于中斷技術(shù)的更多介紹見7.2.1小節(jié)。,,2. 系統(tǒng)調(diào)用  系統(tǒng)調(diào)用是系統(tǒng)內(nèi)核提供的一組特殊的函數(shù),用戶進程通過系統(tǒng)調(diào)用來訪問系統(tǒng)資源。與普通函數(shù)的不同之處在于,普通函數(shù)是由用戶或函數(shù)庫提供的程序代碼,它們的運行會受到系統(tǒng)的限制,不能訪問系統(tǒng)資

50、源。系統(tǒng)調(diào)用是內(nèi)核中的程序代碼,它們具有訪問系統(tǒng)資源的特權(quán)。當用戶進程需要執(zhí)行涉及系統(tǒng)資源的操作時,需要通過系統(tǒng)調(diào)用,讓內(nèi)核來完成?! ∠到y(tǒng)調(diào)用是借助中斷機制實現(xiàn)的,它是軟中斷的一種,稱為“系統(tǒng)調(diào)用”中斷。當進程執(zhí)行到一個系統(tǒng)調(diào)用時,就會產(chǎn)生一個系統(tǒng)調(diào)用中斷。CPU將響應此中斷,轉(zhuǎn)入系統(tǒng)調(diào)用入口程序,然后調(diào)用內(nèi)核中相應的系統(tǒng)調(diào)用處理函數(shù),執(zhí)行該系統(tǒng)調(diào)用對應的功能?! £P于系統(tǒng)調(diào)用的更多介紹見8.4節(jié)。,,4.2.3 進程的運行模式

51、  1. ?CPU的執(zhí)行模式  CPU的基本功能就是執(zhí)行指令。通常,CPU指令集中的指令可以劃分為兩類:特權(quán)指令和非特權(quán)指令。特權(quán)指令是指具有特殊權(quán)限的指令,可以訪問系統(tǒng)中所有寄存器和內(nèi)存單元,修改系統(tǒng)的關鍵設置。比如清理內(nèi)存、設置時鐘、執(zhí)行I/O操作等都是由特權(quán)指令完成的。而非特權(quán)指令是那些用于一般性的運算和處理的指令。這些指令只能訪問用戶程序自己的內(nèi)存地址空間。,,特權(quán)指令的權(quán)限高,如果使用不當則可能會破壞系統(tǒng)或其他用戶的數(shù)據(jù),

52、甚至導致系統(tǒng)崩潰。為了安全起見,這類指令只允許操作系統(tǒng)的內(nèi)核程序使用,而普通的應用程序只能使用那些沒有危險的非特權(quán)指令。實現(xiàn)這種限制的方法是在CPU中設置一個代表運行模式的狀態(tài)字,修改這個狀態(tài)字就可以切換CPU的運行模式。  386以上的CPU支持4種不同特權(quán)級別的運行模式,Linux系統(tǒng)只用到了其中兩個,即稱為核心態(tài)的最高特權(quán)級模式(ring0)和稱為用戶態(tài)的最低特權(quán)級模式(ring3)。在核心態(tài)下,CPU能不受限制地執(zhí)行所有指令,

53、從而表現(xiàn)出最高的特權(quán)。而在用戶態(tài)下,CPU只能執(zhí)行一般指令,不能執(zhí)行特權(quán)指令,因而也就沒有特權(quán)。內(nèi)核的程序運行在核心態(tài)下,而用戶程序則只能運行在用戶態(tài)下。從用戶態(tài)轉(zhuǎn)換為核心態(tài)的唯一途徑是中斷(包括系統(tǒng)調(diào)用)。一旦CPU響應了中斷,則將CPU的狀態(tài)切換到核心態(tài),待中斷處理結(jié)束返回時,再將CPU狀態(tài)切回到用戶態(tài)。,,2. 進程的運行模式  進程在其運行期間常常被中斷或系統(tǒng)調(diào)用打斷,因此CPU也經(jīng)常地在用戶態(tài)與核心態(tài)之間切換。在進行通常的計

54、算和處理時,進程運行在用戶態(tài);執(zhí)行系統(tǒng)調(diào)用或中斷處理程序時進入核心態(tài),執(zhí)行內(nèi)核代碼。調(diào)用返回后,回到用戶態(tài)繼續(xù)運行。圖4-6描述了用戶進程的運行模式切換。,,,圖4-6 用戶進程的運行模式切換,在A期間,進程運行在用戶態(tài),執(zhí)行的是用戶程序代碼。運行到某一時刻時發(fā)生了中斷,進程隨即“陷入”核心態(tài)運行。在B期間,CPU運行在核心態(tài),執(zhí)行的是內(nèi)核程序代碼。此時有兩種情況:如果進程是被中斷打斷的,則B期間執(zhí)行的是中斷處理程序,它是隨機插入的,

55、與進程本身無關;如果進程是因調(diào)用了系統(tǒng)調(diào)用而陷入內(nèi)核空間的,則B執(zhí)行的是內(nèi)核的系統(tǒng)調(diào)用程序代碼,它是作為進程的一個執(zhí)行環(huán)節(jié),由內(nèi)核代理用戶進程繼續(xù)執(zhí)行的。在中斷或系統(tǒng)調(diào)用返回后的C期間中,進程在用戶態(tài)繼續(xù)運行。,,,4.3 進 程 控 制  進程控制是指對進程的生命周期進行有效的管理,實現(xiàn)進程的創(chuàng)建、撤銷以及進程各狀態(tài)之間的轉(zhuǎn)換等控制功能。進程控制的目標是使多個進程能夠平穩(wěn)高效地并發(fā)執(zhí)行,充分共享系統(tǒng)資源。,,4.3.1 進程控制

56、的功能  進程控制的功能是控制進程在整個生命周期中各種狀態(tài)之間的轉(zhuǎn)換(不包括就緒態(tài)與運行態(tài)之間的轉(zhuǎn)換,它們是由進程調(diào)度來實現(xiàn)的)。為此,內(nèi)核提供了幾個原子性的操作函數(shù),稱為原語(primitive)。原語與普通函數(shù)的區(qū)別是它的各個指令的執(zhí)行是不可分割的,要么全部完成,要么一個也不做,因而可以看做是一條廣義的指令。用于進程控制的原語主要有創(chuàng)建、終止、阻塞和喚醒等。,,1) 創(chuàng)建進程  創(chuàng)建原語的主要任務是根據(jù)創(chuàng)建者提供的有關參數(shù)(包括

57、進程名、進程優(yōu)先級、進程代碼起始地址、資源清單等信息),建立進程的PCB。具體的操作過程是:先申請一個空閑的PCB結(jié)構(gòu),調(diào)用資源分配程序為它分配所需的資源,將有關信息填入PCB,狀態(tài)置為就緒態(tài),然后把它插入就緒(可執(zhí)行)隊列中?! ?) 撤銷進程  撤銷原語用于在一個進程運行終止時,撤銷這個進程并釋放進程占用的資源。撤銷的操作過程是:找到要被撤銷的進程的PCB,將它從所在隊列中摘出,釋放進程所占用的資源,最后銷去進程的PCB。,,3

58、) 阻塞進程  阻塞原語用于完成從運行態(tài)到等待態(tài)的轉(zhuǎn)換工作。當正在運行的進程需要等待某一事件而無法執(zhí)行下去時,它就調(diào)用阻塞原語把自己轉(zhuǎn)入等待狀態(tài)。阻塞原語具體的操作過程是:首先中斷CPU的執(zhí)行,把CPU的當前狀態(tài)保存在PCB的現(xiàn)場信息中;然后把被阻塞的進程置為等待狀態(tài),插入到相應的等待隊列中;最后調(diào)用進程調(diào)度程序,從就緒(可執(zhí)行)隊列中選擇一個進程投入運行。,,4) 喚醒進程  喚醒原語用于完成等待態(tài)到就緒態(tài)的轉(zhuǎn)換工作。當處于等待狀

59、態(tài)的進程所等待的事件出現(xiàn)時,內(nèi)核會調(diào)用喚醒原語喚醒被阻塞的進程。操作過程是:在等待隊列中找到該進程,置進程的當前狀態(tài)為就緒態(tài),然后將它從等待隊列中撤出并插入到就緒(可執(zhí)行)隊列中。,,4.3.2 Linux系統(tǒng)的進程控制  在Linux系統(tǒng)中,進程控制的功能是由內(nèi)核的進程控制子系統(tǒng)實現(xiàn)的,并以系統(tǒng)調(diào)用的形式提供給用戶進程或其他系統(tǒng)進程使用。,,1. 進程的創(chuàng)建與映像更換  系統(tǒng)啟動時執(zhí)行初始化程序,啟動進程號為1的init進程運行

60、。系統(tǒng)中所有的其他進程都是由init進程衍生而來的。除init進程外,每個進程都是由另一個進程創(chuàng)建的。新創(chuàng)建的進程稱為子進程,創(chuàng)建子進程的進程稱為父進程。  Unix/Linux系統(tǒng)建立新進程的方式與眾不同。它不是一步構(gòu)造出新的進程,而是采用先復制再變身的兩個步驟,即先按照父進程創(chuàng)建一個子進程,然后再更換進程映像開始執(zhí)行。,,1) 創(chuàng)建進程  創(chuàng)建一個進程的系統(tǒng)調(diào)用是fork()。創(chuàng)建進程采用的方法是克隆,即用父進程復制一個子進程。

61、做法是:先獲得一個空閑的PCB,為子進程分配一個PID,然后將父進程的PCB中的代碼及資源復制給子進程的PCB,狀態(tài)置為可執(zhí)行態(tài)。建好PCB后將其鏈接入進程鏈表和可執(zhí)行隊列中。此后,子進程與父進程并發(fā)執(zhí)行。父子進程執(zhí)行的是同一個代碼,使用的是同樣的資源。它與父進程的區(qū)別僅僅在于PID(進程號)、PPID(父進程號)和與子進程運行相關的屬性(如狀態(tài)、累計運行時間等),而這些是不能從父進程那里繼承來的。,,fork()系統(tǒng)調(diào)用  【功能】

62、創(chuàng)建一個新的子進程?!  菊{(diào)用格式】int fork();  【返回值】  0向子進程返回的返回值,總為0  > 0向父進程返回的返回值,它是子進程的PID。  -1創(chuàng)建失敗。  【說明】若fork()調(diào)用成功,則它向父進程返回子進程的PID,并向新建的子進程返回0?! D4-7描述了fork()系統(tǒng)調(diào)用的執(zhí)行結(jié)果。,,,圖4-7 fork系統(tǒng)調(diào)用的執(zhí)行結(jié)果,從圖4-7中可以看出,當一個進程成功執(zhí)行了fo

63、rk()后,從該調(diào)用點之后分裂成了兩個進程:一個是父進程,從fork()后的代碼處繼續(xù)運行;另一個是新創(chuàng)建的子進程,從fork()后的代碼處開始運行。由fork()產(chǎn)生的進程分裂在結(jié)構(gòu)上很像一把叉子,故得名fork()?! ∨c一般函數(shù)不同,fork()是“一次調(diào)用,兩次返回”,因為調(diào)用成功后,已經(jīng)是兩個進程了。由于子進程是從父進程那里復制的代碼,因此父子進程執(zhí)行的是同一個程序,它們在執(zhí)行時的區(qū)別只在于得到的返回值不同。父進程得到的返回

64、值是一個大于0的數(shù),它是子進程的PID;子進程得到的返回值為0。,,若程序中不考慮fork()的返回值,則父子進程的行為就完全一樣了。但創(chuàng)建一個子進程的目的是想讓它做另一件事。所以,通常的做法是:在fork()調(diào)用后,通過判斷fork()的返回值,分別為父進程和子進程設計不同的執(zhí)行分支。這樣,父子進程執(zhí)行的雖是同一個代碼,執(zhí)行路線卻分道揚鑣。圖4-8描述了用fork()創(chuàng)建子進程的常用流程。,,,圖4-8 用fork創(chuàng)建子進程,例4.

65、2 一個簡單的fork_test程序:  #include   main()  { int rid;   rid = fork();   if (rid 0 ) // 父進程分支    printf(“I am parent, my rid is %d, my PID is %d\n”, rid, getpid());   else // 子進程分支   

66、 printf(“I am child, my rid is %d, my PID is %d\n”, rid, getpid());  },,注:程序中的getpid()是一個系統(tǒng)調(diào)用,它返回本進程的進程標識號PID。  fork_test程序運行時,父子進程將會輸出不同的信息,如父進程的輸出可能是“I am parent, my rid is 8229, my PID is 8228”;子進程的輸出可能是“I am chil

67、d, my rid is 0, my PID is 8229”。由于兩進程是并發(fā)的,它們輸出信息的先后次序不確定,有可能父先子后,也可能相反。,,2) 更換進程映像  進程映像是指進程所執(zhí)行的程序代碼及數(shù)據(jù)。fork()是將父進程的執(zhí)行映像拷貝給子進程,因而子進程實際上是父進程的克隆體。但通常用戶需要的是創(chuàng)建一個新的進程,它執(zhí)行的是一個不同的程序。Linux系統(tǒng)的做法是,先用fork()克隆一個子進程,然后在子進程中調(diào)用exec(),

68、使其脫胎換骨,變換為一個全新的進程?! xec()系統(tǒng)調(diào)用的功能是根據(jù)參數(shù)指定的文件名找到程序文件,把它裝入內(nèi)存,覆蓋原來進程的映像,從而形成一個不同于父進程的全新的子進程。除了進程映像被更換外,新子進程的PID及其他PCB屬性均保持不變,實際上是一個新的進程“借殼”原來的子進程開始運行。,,exec()系統(tǒng)調(diào)用  【功能】改變進程的映像,使其執(zhí)行另外的程序?!  菊{(diào)用格式】exec()是一系列系統(tǒng)調(diào)用,共有6種調(diào)用格式,其中e

69、xecve()是真正的系統(tǒng)調(diào)用,其余是對其包裝后的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等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論