操作系統原理第三章:進程

1 進程概念

操作系統的基本特性是併發與共享,即在系統中同時存在幾個相互獨立的程序,他們交叉地運行,並共享資源,在這樣的過程中就會出現諸多問題,比如多個程序就要進行資源的競爭,程序之間的合作和協同,程序之間的通信,要解決這些問題 , 用程序的概念已經不能描述程序在內存中運行的狀態 ,必須引入新的概念進程

1.1 順序執行環境

順序環境計算機系統只有一個程序在運行,該程序獨佔系統中所有資源,其執行不受外界影響,下圖是順序執行的兩個作業的執行過程圖:
在這裏插入圖片描述
順序執行的特徵:

  • 順序性:按照程序結構所指定的次序(可能有分支或循環);
  • 封閉性:獨佔系統的資源;
  • 可再現性:初始條件相同則結果相同。如:可通過空指令控制時間關係。

1.2 併發執行環境

併發環境一定時間內,物理機器上有兩個或兩個以上的程序同處於開始運行但尚未結束的狀態,並且次序不是事先確定的,如下圖所示:
在這裏插入圖片描述
併發執行的特徵:

  • 間斷(異步)性:“走走停停”,一個程序可能走到中途停下來,失去原有的時序關係;
  • 失去封閉性:共享資源,受其他程序的控制邏輯的影響。如:一個程序寫到存儲器中的數據可能被另一個程序修改,失去原有的不變特徵;
  • 失去可再現性:失去封閉性導致失去可再現性;外界環境在程序的兩次執行期間發生變化,失去原有的可重複特徵。

例如:觀察者/報告者,有兩個循環程序A和B,它們共享一個變量N。程序A每執行一次時都要做N=N+1操作;程序B每執行一次時,都要做print(N)操作,然後再將N置成“0”,程序A和B以不同的速度運行。可能出現多報或漏報。(假定某時刻變量N的值爲5)

  • 程序執行爲A->BN=N+1print(N)N=0之前,N=6,N=6,N=0
  • 程序執行爲B->AN=N+1print(N)N=0之後,N=5,N=0,N=1
  • 程序執行爲B->A->BN=N+1print(N)N=0之間,N=5,N=6,N=0

因此多道程序設計對操作系統提出了新的要求:

  • 如何描述併發程序的執行:引入進程及其狀態;
  • 如何實現併發程序運行:進程控制與調度;
  • 如何處理資源的競爭與程序間的合作:併發控制與通信;
  • 如何解決死鎖:死鎖策略。

1.3 進程的定義

爲了描述程序在併發執行時對系統資源的共享,我們需要一個描述程序執行時動態特徵的概念,這就是進程,一個具有一定獨立功能的程序在一個數據集合上的一次動態執行過程,相比程序,程序是一個靜態的實體,而進程是一個動態的實體,引入多進程,提高了對硬件資源的利用率,但又帶來額外的空間和時間開銷,增加了操作系統的複雜性


一個進程包括如下內容:

  • 程序代碼(Program code);
  • 當前活動(Current activity);
  • 相關數據(Related data):棧、堆、數據段,棧通常是一些臨時數據,如函數參數,返回地址,局部變量等,堆通常是程序運行時申請的動態內存,數據段通常是全局變量。

進程和程序的區別:

  • 進程是動態的,程序是靜態的:程序是有序代碼的集合;進程是程序的執行。通常進程不可在計算機之間遷移;而程序通常對應着文件、靜態和可以複製;
  • 進程是暫時的,程序是永久的:進程是一個狀態變化的過程,程序可長久保存;
  • 進程與程序的組成不同:進程的組成包括程序、數據和進程控制塊(即進程狀態信息);
  • 進程與程序的對應關係:通過多次執行,一個程序可對應多個進程;通過調用關係,一個進程可包括多個程序。

進程的特徵:

  • 結構特徵:進程實體=程序段+相關的數據段+PCB;
  • 動態性:進程的實質是進程實體的一次執行過程,因此動態性是進程的最基本的特徵;
  • 併發性:多個進程實體同存在於內存中,且能在一段時間內同時運行。是最重要的特徵;
  • 獨立性:指進程實體是一個能獨立運行、獨立分配資源和獨立接受調度的基本單位;
  • 異步性:進程按各自獨立的、不可預知的速度向前推進。

進程描述信息:

  • 處於某種狀態(運行、就緒、等待);
  • 進程控制塊PCB(數據結構);
  • 進程的執行程序(一個可執行文件);
  • 進程位於某個隊列(就緒、等待某事件隊列);
  • 佔用某些系統資(內存,打開某些文件、處理機、外設)。

2 進程狀態

進程在執行時,會不斷地改變其狀態,進程有以下的狀態:

  • 新建(new):創建進程,構造了進程標識符,創建了 管理進程所需的表格;
  • 就緒(ready):進程等待分配處理器,存在於處理機調度隊列中的那些進程,它們已經準備就緒,一旦得到CPU,就立即可以運行(有多個進程處於此狀態),如進程所分配的時間片用完後,會用運行狀態轉換爲就緒狀態,等待下一次分配時間片;
  • 運行(running):指令在執行,當進程由調度/分派程序分派後,得到CPU控制權,它的程序正在運行(在系統中,總只有一個進程處於此狀態);
  • 等待(waiting):進程等待某些事件發生,進程正在等待某個事件的發生(如等待I/O的完成),而暫停執行即使給它CPU時間,它也無法執行;
  • 終止(terminated):進程執行完畢,終止後進程移入該狀態,它不再有執行資格,表格和其它信息暫時由輔助程序保留,如爲處理用戶帳單而累計資源使用情況的帳務程序,當數據不再需要後,進程(和它的表格)被刪除。

各個狀態之間的轉換關係如下圖所示:
在這裏插入圖片描述

3 進程控制塊PCB

上面說到進程有多種狀態,但操作系統該如何知曉當前進程的狀態呢,所以我們要把進程的狀態保存下來,這裏就引入了一種描述進程信息的數據結構-進程控制塊PCB(Process Control Block):

  • PCB (Process Control Block)一個專門的數據結構,系統用它來記錄進程的外部特徵,描述進程的運動變化過程;
  • PCB是進程管理和控制的最重要的數據結構,在創建進程時,建立PCB,並伴隨進程運行的全過程,直到進程撤消而撤消,跟隨進程的生命週期
  • PCB是系統感知進程存在的唯一標誌,進程與PCB是一一對應的,有一個進程就會有一個PCB,有一個PCB就會有一個進程;
  • PCB經常被系統訪問,如,調度程序、資源分配程序、中斷處理程序等,所以PCB應常駐內存

3.1 進程控制塊PCB中的內容

進程控制塊PCB保存了同進程有關的信息,一般有下面這些必要內容:

  • 進程狀態(Process state):說明進程當前所處的狀態;
  • 程序計數器(Program counter):指向執行程序的下個指令的地址;
  • CPU寄存器(CPU registers):當進程因某種原因不能繼續佔用CPU時(如:等待打印機),釋放CPU,這時就要將CPU的各種狀態信息保護起來,爲將來再次得到處理機恢復CPU的各種狀態,繼續運行;
  • CPU調度信息(CPU scheduling information):包括CPU優先級,調度隊列指針等;
  • 內存管理信息(Memory-management information):包括基址寄存器,界限寄存器以及頁表或段表等;
  • 計賬信息(Accounting information):包括CPU時間,實際使用時間,作業或進程數量等;
  • I/O狀態信息(I/O status information):包括分配給進程的I/O設備列表,打開文件列表等。
    在這裏插入圖片描述

3.2 PCB的組織方式

系統把 PCB 組織在一起,並放在內存的固定區域,就構成了 PCB 表,PCB 表的個數決定了系統中最多可同時存在的進程個數,稱爲系統的併發度,PCB表的組織方式有兩種:

  • 鏈接方式:一般通過鏈表的方式;
  • 索引方式:建立索引表。

4 操作系統調度

在操作系統中多個程序併發的執行,但在單CPU機器中只有一個CPU,那麼到底由哪一個程序來使用CPU呢,這就是一個調度問題,進程一般會在下面這些隊列被調度:

  • 作業隊列:在系統中的所有進程的集合;
  • 就緒隊列:在主內存中的,就緒並等待執行的所有進程的集合;
  • 設備隊列:等待某一I/O設備的進程隊列。

其實上面所講的進程狀態的變化,實際上是在這些隊列上不停的遷移,如下圖所示:
在這裏插入圖片描述
下圖是進程調度的描述圖:
在這裏插入圖片描述
在操作系統的調度分爲不同級別的調度:

  • 長程調度(或作業調度):選擇可以進入就緒隊列的進程,也可以說是從外存中選擇進入內存的調度過程;
  • 短程調度(或 CPU 調度):選擇可被下一個執行並分配 CPU;
  • 中程調度:爲了緩和內存緊張的情況,將內存中處於阻塞狀態的進程換至外存上( 掛起 ),降低多道程序的度。當這些進程重新具備運行條件時,再從外存上調入內存,如下圖所示:
    在這裏插入圖片描述

在操作系統中進程可以分爲兩類:

  • I/O型進程:花費I/O 時間多於計算,許多短CPU處理;
  • CPU 型進程:花費更多時間於計算,許多長CPU處理。

可以試想若是調度選擇的大多數都是I/O型進程,少數CPU 型進程,那麼各個進程會在CPU上執行短暫的時間後轉到 I/O 設備上,此時 I/O 設備就非常的忙碌,而CPU就相對空閒,反之CPU型的進程過多,也會造成CPU的忙碌,而I/O設備的空閒,這顯然不是高效的調度方式

當進程在運行中發生了中斷,如I/O操作,那麼會執行CPU的切換。如下圖所示,在切換時要保存當且PCB0PCB_0的信息,然後加入切換的PCB1PCB_1信息,然後運行完成後再恢復PCB0PCB_0的信息:
在這裏插入圖片描述
上述切換的過程,我們稱爲上下文切換,當CPU切換至另一個進程時,系統必須保存舊進程狀態併爲新進程調入所保留的狀態,而上下文切換的時間開銷較重;在切換時,系統沒有做有用的工作,時間取決於硬件的支持

5 進程操作

  • 進程是有生命週期的:產生、運行、暫停、終止。對進程的這些操作叫進程控制,對進程的操作如下圖所示;
  • 進程控制的職責是對系統中進程實施有效的管理,它是CPU管理的一部分(還有進程同步、通信和調度);
  • 當系統允許多進程併發執行時,爲了實現共享、協調併發進程的關係,處理機管理必須對進程實行有效的管理。
    在這裏插入圖片描述

6 創建進程

進程創建的時機有以下幾種:

  • 作業調度:批處理系統中,作業調度程序調度到某個作業以後,就把這個作業裝入內存,並分配必要的資源,創建進程,插入就緒隊列;
  • 用戶登錄:在分時系統中,用戶在終端鍵入登錄命令後,若是合法用戶,系統建立一個進程,並插入就緒隊列;
  • 提供服務:用戶向系統提出請求後,系統專門建立一個進程爲用戶服務。如打印請求;
  • 應用請求:應用進程的需要,由它自己創建一個新進程,使新進程以併發運行方式完成特定任務(輸入數據並將處理結果輸出到表格上)。

一個進程創建之後還可以創建進程,也就是父進程創建子進程,如此輪流創建進程下去,構成一個進程樹,典型UNIX系統中的進程樹如下圖所示:
在這裏插入圖片描述
關於資源共享問題,有如下三種情況:

  • 父進程子進程共享所有的資源
  • 子進程共享父進程資源的子集
  • 父進程和子進程無資源共享

關於進程執行問題,有如下兩種情況:

  • 父進程和子進程併發執行
  • 父進程等待,直到子進程終止

關於進程地址空間問題,有如下兩種情況:

  • 子女複製雙親
  • 子女有一個程序被調入

7 進程通信:共享存儲

由生產者-消費者問題討探進程之間是如何共享存儲,生產者-消費者問題是一類問題的抽象,它描述的是一類事物提供另一類事物所需的事物,比如某一個進程提供計算數據,另一個進程負責計算輸出結果,不提供數據就無法進行計算輸出,此時提供計算數據的進程就是生產者,負責計算輸出的進程就是消費者,如下圖所示,這個問題抽象出來的數據模型就是共享隊列
在這裏插入圖片描述

8 進程通信:消息傳遞

消息傳遞是操作系統中的一個機制,能夠使進程之間進行消息傳遞,若P與Q要通信,需要建立通信連接,通過send/receive交換消息,通信鏈路的實現分爲兩種,一種是物理上的通過電子線路的實現,另一種是邏輯上的實現,我們主要考慮的是邏輯上的實現連接的建立分爲兩種:

  • 直接通信:進程必須顯式的命名,如send (P, message)向進程P發消息,receive(Q, message)從進程Q收消息,這種情況下連接自動建立,連接精確的與一對在通信的進程相關,在每一對之間就存在一個連接,連接可以無向,但通常是雙向的,這種通信方式的缺點就是收模塊化限制,比如某個時候進程P名字被修改,那麼所有代碼都需要修改;

直接通信也有一個特殊的通信方式就是非對稱通信方式(asymmetric communication),也就是說發送消息的時候是顯示命名的,但接收消息的時候不指明接收方

  • 間接通信:進程雙方不是直接建立連接的,而是通過一個媒介,可以想象成一個信箱端口,每個信箱都有一個唯一的ID,不管是發送消息還是接收消息,都是通過這個信箱來完成的,如send(A, message)爲向信箱A發送消息,receive(A, message)爲從信箱A接收消息,此時僅當進程共有一個信箱時連接才能建立,連接可同多個進程相關,每一對進程可共享多個通信連接,連接可是無向或雙向的,但是爲了確定發送者和接受者的唯一性,間接通信允許一個連接最多同2個進程相關,並且只允許一個時刻有一個進程執行接受操作,通過允許系統任意選擇接收者,發送者被通知誰是接收者,這樣發送方和接收方就被唯一的確定。

相應的對信箱也有對應的操作,如創建新的信箱,通過信箱發送和接收消息,通信結束後銷燬信箱等

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章