進程的基本概念


 

計算機中,CPU是最寶貴的資源,為了提高CPU的利用率,引入了多道程序設計的概念。當內存中多個程序存在時,如果不對人們熟悉的“程序”的概念加以擴充,就無法刻畫多個程序共同運行時系統呈現出的特征。

 

一、進程的引入

多道程序系統中,程序具有:並行、制約以及動態的特征。程序概念難以便是和反映系統中的情況:

1. 程序是一個靜態的概念

程序是完成某個功能的指令集和。系統實際上是出於不斷變化的狀態中,程序不能反映這種動態性。

2. 程序概念不能反映系統中的並行特性

例如:兩個C語言源程序由一個編譯程序完成編譯,若用程序概念理解,內存中只有一個編譯程序運行(兩個源程序看作編譯程序的輸入數據),但是這樣無法說明白內存中運行着兩個任務。程序的概念不能表示這種並行情況,反映不了他們活動的規律和狀態變化。就像不能用菜譜(程序)代替炒菜(程序執行的過程)一樣(這句話我稍微修改了一下,感覺應該是這樣表訴才對)。

二、進程的定義

進程:一個具有一定獨立功能的程序關於某個數據集合的一次運行活動,是系統進行資源分配和調度運行的基本單位。

三、進程與程序的差別

1. 進程是一個動態的概念

進程是程序的一次執行過程,是動態概念。

程序是一組有序的指令集和,是靜態概念。

2. 不同的進程可以執行同一個程序

區分進程的條件:所執行的程序和數據集合。

兩個進程即使執行在相同的程序上,只要他們運行在不同的數據集合上,他們也是兩個進程。例如:多個用戶同時調用同一個編譯程序編譯他們編寫的C語言源程序,由於編譯程序運行在不同的數據集合(不同的C語言源程序)上,於是產生了一個個不同的進程。

3. 每個進程都有自己的生命周期

當操作系統要完成某個任務時,它會創建一個進程。當進程完成任務之后,系統就會撤銷這個進程,收回它所占用的資源。從創建到撤銷的時間段就是進程的生命期。

4. 進程之間存在並發性

在一個系統中,同時會存在多個進程。他們輪流占用CPU和各種資源。

5. 進程間會相互制約

進程是系統中資源分配和運行調度的單位,在對資源的共享和競爭中,必然相互制約,影響各自向前推進的速度。

6. 進程可以創建子進程,程序不能創建子程序

7. 從結構上講,每個進程都由程序、數據和一個進程控制塊(Process Control Block, PCB)組成

四、進程的重要特征

1. 動態特征:進程對應於程序的運行,動態產生、消亡,在其生命周期中進程也是動態的。

2. 並發特征:任何進程都可以同其他進程一起向前推進。

3. 獨立特征:進程是相對完整的調度單位,可以獲得CPU,參與並發執行。

4. 交往特征:一個進程在執行過程中可與其他進程產生直接或間接關系。

5. 異步特征:每個進程都以相對獨立、不可預知的速度向前推進。

6. 結構特征:每個進程都有一個PCB作為他的數據結構。

進程最基本的特征是並發和共享特征。

五、進程的狀態與轉換

1. 進程的三種基本狀態

a. 運行狀態:獲得CPU的進程處於此狀態,對應的程序在CPU上運行着。

b. 阻塞狀態:為了等待某個外部事件的發生(如等待I/O操作的完成,等待另一個進程發來消息),暫時無法運行。也成為等待狀態。

c. 就緒狀態:具備了一切運行需要的條件,由於其他進程占用CPU而暫時無法運行。

2. 進程狀態轉換

a. 運行狀態 ===> 阻塞狀態:例如正在運行的進程提出I/O請求,由運行狀態轉化為阻塞狀態。

b. 阻塞狀態 ===> 就緒狀態:例如I/O操作完成之后,由阻塞狀態轉化為就緒狀態。

c. 就緒狀態 ===> 運行狀態:例如就緒狀態的進程被進程調度程序選中,分配到CPU中運行,由就緒狀態轉化為運行狀態。

d. 運行狀態 ===> 就緒狀態:處於運行狀態的進程的時間片用完,不得不讓出uCPU,由運行狀態轉化為就緒狀態。

3. 進程的類型

a. 系統進程:操作系統用來管理資源的進程,當系統進程處於運行態時,CPU處於管態,系統之間的關系由操作系統負責。

b. 用戶進程:操作系統可以獨立執行的的用戶程序段,當用戶進程處於運行態時,CPU處於目態,用戶進程之間的關系由用戶負責。

六、進程控制塊

1. 進程的三個組成部分

a. 程序

b. 數據

c. 進程控制塊(PCB):為了管理和控制進程,系統在創建每個進程時,都為其開辟一個專用的存儲區,用以記錄它在系統中的動態特性。系統根據存儲區的信息對進程實施控制管理。進程任務完成后,系統收回該存儲區,進程隨之消亡,這一存儲區就是進程控制塊。

PCB隨着進程的創建而建立,撤銷而消亡。系統根據PCB感知一個進程的存在,PCB是進程存在的唯一物理標識(這一點可以類比作業控制塊JCB)。

2. 進程控制塊的內容

PCB在不同的語言中,可能用不同的數據結構表示。為了系統管理和控制進程方便,系統常常將所有進程的PCB存放在內存中系統表格區(這是什么區?不懂,待我仔細查查),並按照進程內部標號由小到大順序存放。

整個系統中各進程的的PCB集合可用數組表示。這時進程內部標號可以與數組元素下標聯系。

各系統預留的PCB空間往往是固定的,如UNIX系統中規定進程數量不超過50個(這一點我有點懷疑)。

操作系統不同,PCB的格式、大小及內容也不盡相同。一般的,應該包含如下四個信息。

a. 標識信息:進程名。

b. 說明信息:進程狀態、程序存放位置。

c. 現場信息:通用寄存器內存、控制寄存器內存、斷點地址。

d. 管理信息:進程優先數、隊列指針。

七、進程控制塊的組織

系統中,有着許多不同狀態的進程,處於阻塞狀態的進程阻塞原因各不相同,為了便於調度和管理,常將進程控制塊PCB用適當的方法組織起來。

1. 線性結構

把所有不同狀態的進程的PCB組織在一個表格中。

最簡單,適用於進程數目不多的操作系統,如UNIX系統,缺點是調用時,往往需要查詢整個PCB表,時間復雜度略高。

2. 索引結構

分別把具有不同狀態的進程PCB組織在同一個表中,於是有就緒進程表、運行進程表(多機系統中,還有現在的多核系統應該也有吧)以及各種等待事件的阻塞進程表。

系統中的一些固定單元分別指出各表的起始地址。

3. 鏈式結構

采用隊列形式時,每個進程的PCB中要增加一個鏈指針表項,指向隊列的下一個PCB起始地址。

為了對這些隊列進行管理,操作系統要做三件事:

a. 把處於同一狀態的進程的PCB通過各自隊列的指針鏈接在一起,形成隊列。

b. 為每一個隊列設立一個對頭指針,總是指向隊首的PCB。

c. 排在隊尾的PCB的隊列指針項內容應該是“-1”或者一個特殊符號,表示這是隊尾PCB。

在單CPU系統中,任何時刻都只有一個處於運行態的進程

所有處於阻塞隊列中的PCB應該根據產生阻塞的原因今進行排隊,每一個都稱為阻塞隊列,比如等待磁盤I/O的阻塞隊列,等待打印機輸出的阻塞隊列。

八、進程控制

1. 原語

要對進程進行控制,系統中必須設置一個機構,它具有創建進程、撤銷進程、進程通信和資源管理等功能,這樣的結構稱為操作系統的內核(kernel)

內核本身不是一個進程,而是硬件的首次延伸,它是加在硬件上的第一層軟件。內核是通過執行各種原語操作來完成各種控制和管理功能的。

原語(primitive)是機器指令的延伸,用若干條機器指令構成,用以完成特定功能的一段程序。為保證操作的正確性,原語在執行期間是不可分割的(這點可以類比數據庫中的事務)。

用於進程控制的原語有:創建進程原語、撤銷進程原語、阻塞進程原語、喚醒進程原語、調度進程原語、改變優先級原語等。

2. 創建進程原語

一個進程如果需要時,可以創建一個新的進程。被建立的進程稱為子進程,建立者進程稱為父進程。

所有的進程都只能通過父進程建立,不能自生自滅。

創建進程原語拱進程調用,用以建立子進程

該原語的主要工作:為被建立的進程簡歷一個進程控制塊,填入相應的初始值。主要操作過程是先向系統的PCB空間申請分配一個空閑的PCB,然后根據父進程所提供的參數,將子進程的PCB表目初始化,最后返回一個子進程內部名。

3. 撤銷進程原語

由父進程撤銷子進程的PCB,注意,這里會撤銷一個以該子進程為根的進程子樹,並回收占用的全部資源。

4. 阻塞原語

在阻塞原語的作用下,進程由運行狀態轉化為阻塞狀態。

5. 喚醒原語

在喚醒原語的作用下,進程由阻塞狀態轉化為就緒狀態。

6. 改變進程優先級原語

進程的優先級是表示進程的重要性以及運行的優先性,拱進程調度程序調度進程運行時使用。

為了防止一些進程因優先級較低,而長期得不到運行,許多系統采用動態優先級,進程的優先級按照一些原則變化。

通常,進程優先級和以下因素有關系:

a. 作業開始時的靜態優先數:作業的優先數取決於作業的重要程度、用戶為作業運行時所付出的價格和費用大小、作業的類型等因素。

b. 進程的類型:一般系統進程的優先數大於用戶進程的優先數;I/O型進程的優先數大於CPU型進程的優先數。這些都是為了充分發揮系統I/O設備的效能。

c. 進程所使用的資源量:使用CPU的時間越多,優先級越低。對其他資源使用的情況也類似的考慮。

d. 進程在系統中的等待時間:等待時間越長,進程優先級越高。

各系統處於不同的考慮,有不同的優先數計算公式。這些公式主要來自於時間經驗。

 

九、前台進程、后台進程、守護進程

 

前台與后台本身是指舞台表演的前台與后台,前台是觀眾們可以看見的,觀眾無法看見后台的內容。

這里的前台進程與后台進程同樣是這個意思。

1.前台進程:是直接與用戶交互的,用戶是可以直接看到的。

2.后台進程:用戶無法直接看到,前台進程與后台進程是可以相互轉換的。這一概念在Android系統用的比較多,用戶常常需要設置程序在后台運行,不被系統殺掉。自啟動等,方便及時接受消息通知。

3.守護進程:是一種特殊的后台進程,它獨立於控制終端並且周期性地執行某種任務或等待處理某些發生的事件,它只能在后台運行。

常用的控制台命令:

ctrl+z 將任務放到后台去,並暫停(掛起)。

ctrl+c 終止進程(中斷)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM