操作系统原理第三章:进程
目錄
- 1 進程概念
- 1.1 順序執(zhí)行環(huán)境
- 1.2 并發(fā)執(zhí)行環(huán)境
- 1.3 進程的定義
- 2 進程狀態(tài)
- 3 進程控制塊PCB
- 3.1 進程控制塊PCB中的內(nèi)容
- 3.2 PCB的組織方式
- 4 操作系統(tǒng)調(diào)度
- 5 進程操作
- 6 創(chuàng)建進程
- 7 進程通信:共享存儲
- 8 進程通信:消息傳遞
1 進程概念
操作系統(tǒng)的基本特性是并發(fā)與共享,即在系統(tǒng)中同時存在幾個相互獨立的程序,他們交叉地運行,并共享資源,在這樣的過程中就會出現(xiàn)諸多問題,比如多個程序就要進行資源的競爭,程序之間的合作和協(xié)同,程序之間的通信,要解決這些問題 , 用程序的概念已經(jīng)不能描述程序在內(nèi)存中運行的狀態(tài) ,必須引入新的概念進程。
1.1 順序執(zhí)行環(huán)境
順序環(huán)境計算機系統(tǒng)只有一個程序在運行,該程序獨占系統(tǒng)中所有資源,其執(zhí)行不受外界影響,下圖是順序執(zhí)行的兩個作業(yè)的執(zhí)行過程圖:
順序執(zhí)行的特征:
- 順序性:按照程序結(jié)構(gòu)所指定的次序(可能有分支或循環(huán));
- 封閉性:獨占系統(tǒng)的資源;
- 可再現(xiàn)性:初始條件相同則結(jié)果相同。如:可通過空指令控制時間關(guān)系。
1.2 并發(fā)執(zhí)行環(huán)境
并發(fā)環(huán)境一定時間內(nèi),物理機器上有兩個或兩個以上的程序同處于開始運行但尚未結(jié)束的狀態(tài),并且次序不是事先確定的,如下圖所示:
并發(fā)執(zhí)行的特征:
- 間斷(異步)性:“走走停停”,一個程序可能走到中途停下來,失去原有的時序關(guān)系;
- 失去封閉性:共享資源,受其他程序的控制邏輯的影響。如:一個程序?qū)懙酱鎯ζ髦械臄?shù)據(jù)可能被另一個程序修改,失去原有的不變特征;
- 失去可再現(xiàn)性:失去封閉性導(dǎo)致失去可再現(xiàn)性;外界環(huán)境在程序的兩次執(zhí)行期間發(fā)生變化,失去原有的可重復(fù)特征。
例如:觀察者/報告者,有兩個循環(huán)程序A和B,它們共享一個變量N。程序A每執(zhí)行一次時都要做N=N+1操作;程序B每執(zhí)行一次時,都要做print(N)操作,然后再將N置成“0”,程序A和B以不同的速度運行。可能出現(xiàn)多報或漏報。(假定某時刻變量N的值為5)
- 程序執(zhí)行為A->B:N=N+1在print(N)和N=0之前,N=6,N=6,N=0;
- 程序執(zhí)行為B->A:N=N+1在print(N)和N=0之后,N=5,N=0,N=1;
- 程序執(zhí)行為B->A->B:N=N+1在print(N)和N=0之間,N=5,N=6,N=0。
因此多道程序設(shè)計對操作系統(tǒng)提出了新的要求:
- 如何描述并發(fā)程序的執(zhí)行:引入進程及其狀態(tài);
- 如何實現(xiàn)并發(fā)程序運行:進程控制與調(diào)度;
- 如何處理資源的競爭與程序間的合作:并發(fā)控制與通信;
- 如何解決死鎖:死鎖策略。
1.3 進程的定義
為了描述程序在并發(fā)執(zhí)行時對系統(tǒng)資源的共享,我們需要一個描述程序執(zhí)行時動態(tài)特征的概念,這就是進程,一個具有一定獨立功能的程序在一個數(shù)據(jù)集合上的一次動態(tài)執(zhí)行過程,相比程序,程序是一個靜態(tài)的實體,而進程是一個動態(tài)的實體,引入多進程,提高了對硬件資源的利用率,但又帶來額外的空間和時間開銷,增加了操作系統(tǒng)的復(fù)雜性
一個進程包括如下內(nèi)容:
- 程序代碼(Program code);
- 當前活動(Current activity);
- 相關(guān)數(shù)據(jù)(Related data):棧、堆、數(shù)據(jù)段,棧通常是一些臨時數(shù)據(jù),如函數(shù)參數(shù),返回地址,局部變量等,堆通常是程序運行時申請的動態(tài)內(nèi)存,數(shù)據(jù)段通常是全局變量。
進程和程序的區(qū)別:
- 進程是動態(tài)的,程序是靜態(tài)的:程序是有序代碼的集合;進程是程序的執(zhí)行。通常進程不可在計算機之間遷移;而程序通常對應(yīng)著文件、靜態(tài)和可以復(fù)制;
- 進程是暫時的,程序是永久的:進程是一個狀態(tài)變化的過程,程序可長久保存;
- 進程與程序的組成不同:進程的組成包括程序、數(shù)據(jù)和進程控制塊(即進程狀態(tài)信息);
- 進程與程序的對應(yīng)關(guān)系:通過多次執(zhí)行,一個程序可對應(yīng)多個進程;通過調(diào)用關(guān)系,一個進程可包括多個程序。
進程的特征:
- 結(jié)構(gòu)特征:進程實體=程序段+相關(guān)的數(shù)據(jù)段+PCB;
- 動態(tài)性:進程的實質(zhì)是進程實體的一次執(zhí)行過程,因此動態(tài)性是進程的最基本的特征;
- 并發(fā)性:多個進程實體同存在于內(nèi)存中,且能在一段時間內(nèi)同時運行。是最重要的特征;
- 獨立性:指進程實體是一個能獨立運行、獨立分配資源和獨立接受調(diào)度的基本單位;
- 異步性:進程按各自獨立的、不可預(yù)知的速度向前推進。
進程描述信息:
- 處于某種狀態(tài)(運行、就緒、等待);
- 進程控制塊PCB(數(shù)據(jù)結(jié)構(gòu));
- 進程的執(zhí)行程序(一個可執(zhí)行文件);
- 進程位于某個隊列(就緒、等待某事件隊列);
- 占用某些系統(tǒng)資(內(nèi)存,打開某些文件、處理機、外設(shè))。
2 進程狀態(tài)
進程在執(zhí)行時,會不斷地改變其狀態(tài),進程有以下的狀態(tài):
- 新建(new):創(chuàng)建進程,構(gòu)造了進程標識符,創(chuàng)建了 管理進程所需的表格;
- 就緒(ready):進程等待分配處理器,存在于處理機調(diào)度隊列中的那些進程,它們已經(jīng)準備就緒,一旦得到CPU,就立即可以運行(有多個進程處于此狀態(tài)),如進程所分配的時間片用完后,會用運行狀態(tài)轉(zhuǎn)換為就緒狀態(tài),等待下一次分配時間片;
- 運行(running):指令在執(zhí)行,當進程由調(diào)度/分派程序分派后,得到CPU控制權(quán),它的程序正在運行(在系統(tǒng)中,總只有一個進程處于此狀態(tài));
- 等待(waiting):進程等待某些事件發(fā)生,進程正在等待某個事件的發(fā)生(如等待I/O的完成),而暫停執(zhí)行即使給它CPU時間,它也無法執(zhí)行;
- 終止(terminated):進程執(zhí)行完畢,終止后進程移入該狀態(tài),它不再有執(zhí)行資格,表格和其它信息暫時由輔助程序保留,如為處理用戶帳單而累計資源使用情況的帳務(wù)程序,當數(shù)據(jù)不再需要后,進程(和它的表格)被刪除。
各個狀態(tài)之間的轉(zhuǎn)換關(guān)系如下圖所示:
3 進程控制塊PCB
上面說到進程有多種狀態(tài),但操作系統(tǒng)該如何知曉當前進程的狀態(tài)呢,所以我們要把進程的狀態(tài)保存下來,這里就引入了一種描述進程信息的數(shù)據(jù)結(jié)構(gòu)-進程控制塊PCB(Process Control Block):
- PCB (Process Control Block)一個專門的數(shù)據(jù)結(jié)構(gòu),系統(tǒng)用它來記錄進程的外部特征,描述進程的運動變化過程;
- PCB是進程管理和控制的最重要的數(shù)據(jù)結(jié)構(gòu),在創(chuàng)建進程時,建立PCB,并伴隨進程運行的全過程,直到進程撤消而撤消,跟隨進程的生命周期;
- PCB是系統(tǒng)感知進程存在的唯一標志,進程與PCB是一一對應(yīng)的,有一個進程就會有一個PCB,有一個PCB就會有一個進程;
- PCB經(jīng)常被系統(tǒng)訪問,如,調(diào)度程序、資源分配程序、中斷處理程序等,所以PCB應(yīng)常駐內(nèi)存。
3.1 進程控制塊PCB中的內(nèi)容
進程控制塊PCB保存了同進程有關(guān)的信息,一般有下面這些必要內(nèi)容:
- 進程狀態(tài)(Process state):說明進程當前所處的狀態(tài);
- 程序計數(shù)器(Program counter):指向執(zhí)行程序的下個指令的地址;
- CPU寄存器(CPU registers):當進程因某種原因不能繼續(xù)占用CPU時(如:等待打印機),釋放CPU,這時就要將CPU的各種狀態(tài)信息保護起來,為將來再次得到處理機恢復(fù)CPU的各種狀態(tài),繼續(xù)運行;
- CPU調(diào)度信息(CPU scheduling information):包括CPU優(yōu)先級,調(diào)度隊列指針等;
- 內(nèi)存管理信息(Memory-management information):包括基址寄存器,界限寄存器以及頁表或段表等;
- 計賬信息(Accounting information):包括CPU時間,實際使用時間,作業(yè)或進程數(shù)量等;
- I/O狀態(tài)信息(I/O status information):包括分配給進程的I/O設(shè)備列表,打開文件列表等。
3.2 PCB的組織方式
系統(tǒng)把 PCB 組織在一起,并放在內(nèi)存的固定區(qū)域,就構(gòu)成了 PCB 表,PCB 表的個數(shù)決定了系統(tǒng)中最多可同時存在的進程個數(shù),稱為系統(tǒng)的并發(fā)度,PCB表的組織方式有兩種:
- 鏈接方式:一般通過鏈表的方式;
- 索引方式:建立索引表。
4 操作系統(tǒng)調(diào)度
在操作系統(tǒng)中多個程序并發(fā)的執(zhí)行,但在單CPU機器中只有一個CPU,那么到底由哪一個程序來使用CPU呢,這就是一個調(diào)度問題,進程一般會在下面這些隊列被調(diào)度:
- 作業(yè)隊列:在系統(tǒng)中的所有進程的集合;
- 就緒隊列:在主內(nèi)存中的,就緒并等待執(zhí)行的所有進程的集合;
- 設(shè)備隊列:等待某一I/O設(shè)備的進程隊列。
其實上面所講的進程狀態(tài)的變化,實際上是在這些隊列上不停的遷移,如下圖所示:
下圖是進程調(diào)度的描述圖:
在操作系統(tǒng)的調(diào)度分為不同級別的調(diào)度:
- 長程調(diào)度(或作業(yè)調(diào)度):選擇可以進入就緒隊列的進程,也可以說是從外存中選擇進入內(nèi)存的調(diào)度過程;
- 短程調(diào)度(或 CPU 調(diào)度):選擇可被下一個執(zhí)行并分配 CPU;
- 中程調(diào)度:為了緩和內(nèi)存緊張的情況,將內(nèi)存中處于阻塞狀態(tài)的進程換至外存上( 掛起 ),降低多道程序的度。當這些進程重新具備運行條件時,再從外存上調(diào)入內(nèi)存,如下圖所示:
在操作系統(tǒng)中進程可以分為兩類:
- I/O型進程:花費I/O 時間多于計算,許多短CPU處理;
- CPU 型進程:花費更多時間于計算,許多長CPU處理。
可以試想若是調(diào)度選擇的大多數(shù)都是I/O型進程,少數(shù)CPU 型進程,那么各個進程會在CPU上執(zhí)行短暫的時間后轉(zhuǎn)到 I/O 設(shè)備上,此時 I/O 設(shè)備就非常的忙碌,而CPU就相對空閑,反之CPU型的進程過多,也會造成CPU的忙碌,而I/O設(shè)備的空閑,這顯然不是高效的調(diào)度方式
當進程在運行中發(fā)生了中斷,如I/O操作,那么會執(zhí)行CPU的切換。如下圖所示,在切換時要保存當且PCB0PCB_0PCB0?的信息,然后加入切換的PCB1PCB_1PCB1?信息,然后運行完成后再恢復(fù)PCB0PCB_0PCB0?的信息:
上述切換的過程,我們稱為上下文切換,當CPU切換至另一個進程時,系統(tǒng)必須保存舊進程狀態(tài)并為新進程調(diào)入所保留的狀態(tài),而上下文切換的時間開銷較重;在切換時,系統(tǒng)沒有做有用的工作,時間取決于硬件的支持
5 進程操作
- 進程是有生命周期的:產(chǎn)生、運行、暫停、終止。對進程的這些操作叫進程控制,對進程的操作如下圖所示;
- 進程控制的職責(zé)是對系統(tǒng)中進程實施有效的管理,它是CPU管理的一部分(還有進程同步、通信和調(diào)度);
- 當系統(tǒng)允許多進程并發(fā)執(zhí)行時,為了實現(xiàn)共享、協(xié)調(diào)并發(fā)進程的關(guān)系,處理機管理必須對進程實行有效的管理。
6 創(chuàng)建進程
進程創(chuàng)建的時機有以下幾種:
- 作業(yè)調(diào)度:批處理系統(tǒng)中,作業(yè)調(diào)度程序調(diào)度到某個作業(yè)以后,就把這個作業(yè)裝入內(nèi)存,并分配必要的資源,創(chuàng)建進程,插入就緒隊列;
- 用戶登錄:在分時系統(tǒng)中,用戶在終端鍵入登錄命令后,若是合法用戶,系統(tǒng)建立一個進程,并插入就緒隊列;
- 提供服務(wù):用戶向系統(tǒng)提出請求后,系統(tǒng)專門建立一個進程為用戶服務(wù)。如打印請求;
- 應(yīng)用請求:應(yīng)用進程的需要,由它自己創(chuàng)建一個新進程,使新進程以并發(fā)運行方式完成特定任務(wù)(輸入數(shù)據(jù)并將處理結(jié)果輸出到表格上)。
一個進程創(chuàng)建之后還可以創(chuàng)建進程,也就是父進程創(chuàng)建子進程,如此輪流創(chuàng)建進程下去,構(gòu)成一個進程樹,典型UNIX系統(tǒng)中的進程樹如下圖所示:
關(guān)于資源共享問題,有如下三種情況:
- 父進程子進程共享所有的資源
- 子進程共享父進程資源的子集
- 父進程和子進程無資源共享
關(guān)于進程執(zhí)行問題,有如下兩種情況:
- 父進程和子進程并發(fā)執(zhí)行
- 父進程等待,直到子進程終止
關(guān)于進程地址空間問題,有如下兩種情況:
- 子女復(fù)制雙親
- 子女有一個程序被調(diào)入
7 進程通信:共享存儲
由生產(chǎn)者-消費者問題討探進程之間是如何共享存儲,生產(chǎn)者-消費者問題是一類問題的抽象,它描述的是一類事物提供另一類事物所需的事物,比如某一個進程提供計算數(shù)據(jù),另一個進程負責(zé)計算輸出結(jié)果,不提供數(shù)據(jù)就無法進行計算輸出,此時提供計算數(shù)據(jù)的進程就是生產(chǎn)者,負責(zé)計算輸出的進程就是消費者,如下圖所示,這個問題抽象出來的數(shù)據(jù)模型就是共享隊列:
8 進程通信:消息傳遞
消息傳遞是操作系統(tǒng)中的一個機制,能夠使進程之間進行消息傳遞,若P與Q要通信,需要建立通信連接,通過send/receive交換消息,通信鏈路的實現(xiàn)分為兩種,一種是物理上的通過電子線路的實現(xiàn),另一種是邏輯上的實現(xiàn),我們主要考慮的是邏輯上的實現(xiàn)連接的建立分為兩種:
- 直接通信:進程必須顯式的命名,如send (P, message)向進程P發(fā)消息,receive(Q, message)從進程Q收消息,這種情況下連接自動建立,連接精確的與一對在通信的進程相關(guān),在每一對之間就存在一個連接,連接可以無向,但通常是雙向的,這種通信方式的缺點就是收模塊化限制,比如某個時候進程P名字被修改,那么所有代碼都需要修改;
直接通信也有一個特殊的通信方式就是非對稱通信方式(asymmetric communication),也就是說發(fā)送消息的時候是顯示命名的,但接收消息的時候不指明接收方
- 間接通信:進程雙方不是直接建立連接的,而是通過一個媒介,可以想象成一個信箱或端口,每個信箱都有一個唯一的ID,不管是發(fā)送消息還是接收消息,都是通過這個信箱來完成的,如send(A, message)為向信箱A發(fā)送消息,receive(A, message)為從信箱A接收消息,此時僅當進程共有一個信箱時連接才能建立,連接可同多個進程相關(guān),每一對進程可共享多個通信連接,連接可是無向或雙向的,但是為了確定發(fā)送者和接受者的唯一性,間接通信允許一個連接最多同2個進程相關(guān),并且只允許一個時刻有一個進程執(zhí)行接受操作,通過允許系統(tǒng)任意選擇接收者,發(fā)送者被通知誰是接收者,這樣發(fā)送方和接收方就被唯一的確定。
相應(yīng)的對信箱也有對應(yīng)的操作,如創(chuàng)建新的信箱,通過信箱發(fā)送和接收消息,通信結(jié)束后銷毀信箱等
總結(jié)
以上是生活随笔為你收集整理的操作系统原理第三章:进程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 操作系统原理第二章:操作系统结构
- 下一篇: 操作系统原理第四章:线程