操作系統(tǒng)核心原理-3.進(jìn)程原理(上):進(jìn)程概要
進(jìn)程管理、內(nèi)存管理和文件管理是操作系統(tǒng)的三大核心功能,那么什么是進(jìn)程呢?顧名思義,進(jìn)程就是進(jìn)展中的程序,或者說(shuō)進(jìn)程是執(zhí)行中的程序。當(dāng)一個(gè)程序被加載到內(nèi)存之后就變?yōu)榱诉M(jìn)程。因此,我們可以得到:進(jìn)程=程序+執(zhí)行。本篇將會(huì)對(duì)進(jìn)程、進(jìn)程模型、進(jìn)程狀態(tài)以及進(jìn)程的缺陷等進(jìn)行學(xué)習(xí),為后續(xù)學(xué)習(xí)進(jìn)程調(diào)度與進(jìn)程通信打下堅(jiān)實(shí)基礎(chǔ)。
一、進(jìn)程是什么鬼?
1.1 從工作到進(jìn)程
進(jìn)程在Multics操作系統(tǒng)出現(xiàn)之前被叫做工作(Job),工作是IBM用于多道批處理程序設(shè)計(jì)中的概念。由于歷史原因,Multics操作系統(tǒng)的研發(fā)人員不愿意承用IBM發(fā)明的術(shù)語(yǔ),于是將工作改為了進(jìn)程(Process)。
1.2 實(shí)現(xiàn)CPU的多道編程
在計(jì)算機(jī)發(fā)展的初期,單一操作員單一控制終端,CPU使用率很低。為了提高CPU利用率,人們想要將多個(gè)程序同時(shí)加載到計(jì)算里并發(fā)執(zhí)行。于是,這些同時(shí)存在于計(jì)算機(jī)內(nèi)存中的程序就被稱(chēng)為進(jìn)程。進(jìn)程的出現(xiàn),讓每個(gè)用戶(hù)感覺(jué)到自己在獨(dú)占CPU。因此,可以說(shuō)進(jìn)程就是為了在CPU上實(shí)現(xiàn)多道編程而出現(xiàn)的概念,如下圖所示。

人們發(fā)明進(jìn)程是為了支持多道編程,而進(jìn)行多道編程的目的則是為了提高計(jì)算機(jī)CPU的利用率(或者說(shuō)系統(tǒng)的吞吐量)。例如,如果一個(gè)進(jìn)程有20%的時(shí)間使用CPU進(jìn)行計(jì)算,另外80%的時(shí)間用來(lái)進(jìn)行I/O,則在單道編程下CPU的利用率只有20%。單如果同時(shí)運(yùn)行兩個(gè)這樣的進(jìn)程,即使用2道編程,則CPU只在兩個(gè)進(jìn)程同時(shí)進(jìn)行I/O時(shí)才會(huì)處于閑置狀態(tài),因此CPU利用率將會(huì)提高到:1-0.8*0.8=0.36=>36%。同理,如果同時(shí)運(yùn)行更多的進(jìn)程,CPU利用率會(huì)逐步提高,直到某個(gè)臨界點(diǎn)為止。(PS:這里的例子忽略了進(jìn)程切換所需要的系統(tǒng)消耗)

二、進(jìn)程模型
2.1 三個(gè)視角看進(jìn)程模型

(1)物理視角:從物理內(nèi)存的分配來(lái)看,每個(gè)進(jìn)程占用一片內(nèi)存空間,從這點(diǎn)上看,進(jìn)程其實(shí)就是內(nèi)存的某片空間。由于在任意時(shí)刻,一個(gè)CPU只能執(zhí)行一條指令,因此任意時(shí)刻在CPU上執(zhí)行的進(jìn)程只有一個(gè),而到底執(zhí)行哪條指令是由物理程序計(jì)數(shù)器指定。因此,在物理層面,所有進(jìn)程共用一個(gè)程序計(jì)數(shù)器,只是CPU在不停地做進(jìn)程切換。
(2)邏輯視角:從邏輯層面來(lái)看,每個(gè)進(jìn)程都可以執(zhí)行,也可以暫時(shí)掛起讓別的進(jìn)程執(zhí)行,之后又可以接著執(zhí)行。所以,進(jìn)程需要想辦法保持狀態(tài)才能在下次接著執(zhí)行時(shí)從正確的地點(diǎn)開(kāi)始。因此,每個(gè)進(jìn)程都有自己的計(jì)數(shù)器,記錄其下一條指令所在的位置。(從邏輯上來(lái)說(shuō),程序計(jì)數(shù)器可以有多個(gè))
(3)時(shí)序視角:從時(shí)間來(lái)看,每個(gè)進(jìn)程都必須往前推進(jìn)。在運(yùn)行一定時(shí)間后,進(jìn)程都應(yīng)該完成了一定的工作量。換句話說(shuō),每次進(jìn)程返回,它都處在上次返回點(diǎn)之后。哲學(xué)家有云:“一個(gè)人不能兩次踏入同一條河流”。
2.2 進(jìn)程模型如何實(shí)現(xiàn)
(1)物理基礎(chǔ):進(jìn)程的物理基礎(chǔ)是程序,程序又運(yùn)行在計(jì)算機(jī)上,因此計(jì)算機(jī)上要運(yùn)行程序首先要解決進(jìn)程的存儲(chǔ):給進(jìn)程分配內(nèi)存,使其安身立命。由于多個(gè)進(jìn)程可能同時(shí)并存,因此需要考慮如何讓多個(gè)進(jìn)程共享同一個(gè)物理內(nèi)存而不發(fā)生沖突。OS通過(guò)內(nèi)存管理來(lái)解決這個(gè)問(wèn)題。
(2)進(jìn)程切換:進(jìn)程運(yùn)行實(shí)際上是指進(jìn)程在CPU上執(zhí)行,那么如何將CPU在多個(gè)進(jìn)程之間進(jìn)行切換也是一個(gè)問(wèn)題。OS通過(guò)進(jìn)程調(diào)度來(lái)解決這個(gè)問(wèn)題。所謂進(jìn)程調(diào)度,就是決定在什么時(shí)候讓什么進(jìn)程來(lái)使用CPU。
三、進(jìn)程的層次與狀態(tài)
3.1 進(jìn)程的層次結(jié)構(gòu)
一個(gè)進(jìn)程在執(zhí)行過(guò)程中可以通過(guò)系統(tǒng)調(diào)用創(chuàng)建新的進(jìn)程,這個(gè)新的進(jìn)程就稱(chēng)為子進(jìn)程,而創(chuàng)建子進(jìn)程的進(jìn)程則被稱(chēng)為父進(jìn)程。
子進(jìn)程又可以再創(chuàng)建子進(jìn)程,于是這樣子子孫孫地創(chuàng)建下去就形成了所謂的進(jìn)程樹(shù)。
3.2 進(jìn)程的狀態(tài)轉(zhuǎn)換
基本的進(jìn)程狀態(tài)主要有3種:執(zhí)行、阻塞和就緒,如下圖所示:

那么,進(jìn)程被掛起阻塞有哪些原因呢?首先是一個(gè)進(jìn)程在運(yùn)行過(guò)程中執(zhí)行了某種阻塞操作,例如讀寫(xiě)磁盤(pán)。(由于阻塞操作需要等待結(jié)果后才能繼續(xù)執(zhí)行,因此OS將把這個(gè)進(jìn)程掛起,讓其他進(jìn)程運(yùn)轉(zhuǎn))其次是一個(gè)進(jìn)程執(zhí)行的時(shí)間太長(zhǎng)了,為了公平,OS將其掛起從而讓其他進(jìn)程也有機(jī)會(huì)執(zhí)行。
PS:當(dāng)然,上述闡述的3種典型狀態(tài)并不是唯一的分類(lèi)方式,事實(shí)上,許多商業(yè)OS的進(jìn)程都不止3個(gè),比如Windows的進(jìn)程就有7種狀態(tài)。
四、進(jìn)程管理概要
4.1 需要的手段
首先看看一個(gè)人的出生對(duì)一個(gè)社會(huì)來(lái)說(shuō)意味著什么?在一個(gè)人出生后,醫(yī)院需要為其建立記錄,該記錄包括諸如姓名、性別、體重、父母信息、何時(shí)何地出生等信息,然后會(huì)通過(guò)該記錄來(lái)登記戶(hù)口,辦理身份證等等。辦完手續(xù)之后,這個(gè)人就正式存在,稱(chēng)為一個(gè)公民。當(dāng)然,我們得goverment就可以對(duì)這個(gè)人進(jìn)行各種管理了,比如你不能亂說(shuō)話,不能亂游行等等。
與一個(gè)社會(huì)管理人的過(guò)程類(lèi)似,OS要管理進(jìn)程就需要維護(hù)進(jìn)程的一些信息,OS用于維護(hù)進(jìn)程記錄的結(jié)構(gòu)就是進(jìn)程表或進(jìn)程控制塊(Process Control Block,PCB)。那么進(jìn)程表里有什么記錄呢?一般來(lái)說(shuō),維護(hù)的記錄應(yīng)該包含:寄存器、程序計(jì)數(shù)器、狀態(tài)字、棧指針、優(yōu)先級(jí)、進(jìn)程ID、創(chuàng)建時(shí)間、所耗CPU時(shí)間、當(dāng)前持有的各種句柄等等。
4.2 創(chuàng)建的過(guò)程
一般來(lái)說(shuō),OS創(chuàng)建進(jìn)程的步驟如下圖所示:

在不同的OS中,創(chuàng)建進(jìn)程的方法也不同,例如Windows中是通過(guò)系統(tǒng)調(diào)用完成進(jìn)程創(chuàng)建的,這個(gè)系統(tǒng)調(diào)用就是CreateProcess。
4.3 處理的問(wèn)題
人類(lèi)社會(huì)最大的問(wèn)題就是資源分配,進(jìn)程管理的最大問(wèn)題也是如此。雖然進(jìn)程沒(méi)有自我意識(shí),但我們的本性還是追求公平的。除了公平,還需要考慮:效率。于是,公平與效率就成了進(jìn)程管理中永恒的主題。
4.4 進(jìn)程的缺陷
假定有兩部都很好地島國(guó)愛(ài)情動(dòng)作片,都只放映一次,以后就再也不放映了。而且,這兩部片子還是同時(shí)放映(狗血?jiǎng)∏榘。。€在兩個(gè)不同的小房間放映。而你在同一時(shí)間只能做一件事情,所以你不得不放棄另外一部。進(jìn)程亦是如此,這也是進(jìn)程的缺點(diǎn),如果想要同時(shí)做兩件或多件事情,進(jìn)程就不夠用了。并且,如果進(jìn)程在執(zhí)行的過(guò)程中發(fā)生阻塞,例如等待輸入,整個(gè)進(jìn)程就將被掛起(暫停),而無(wú)法繼續(xù)執(zhí)行。這樣,即使進(jìn)程里面有部分工作不依賴(lài)于輸入數(shù)據(jù),也無(wú)法推進(jìn)。
因此,為了解決上述兩個(gè)問(wèn)題,人們發(fā)明了線程。

欲知后事如何,還聽(tīng)下回分解。
參考資料

鄒恒明,《操作系統(tǒng)之哲學(xué)原理》,機(jī)械工業(yè)出版社
作者:周旭龍
出處:http://edisonchou.cnblogs.com
本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁(yè)面明顯位置給出原文鏈接。

進(jìn)程管理、內(nèi)存管理和文件管理是操作系統(tǒng)的三大核心功能,那么什么是進(jìn)程呢?顧名思義,進(jìn)程就是進(jìn)展中的程序,或者說(shuō)進(jìn)程是執(zhí)行中的程序。當(dāng)一個(gè)程序被加載到內(nèi)存之后就變?yōu)榱诉M(jìn)程。因此,我們可以得到:進(jìn)程=程序+執(zhí)行。本篇將會(huì)對(duì)進(jìn)程、進(jìn)程模型、進(jìn)程狀態(tài)以及進(jìn)程的缺陷等進(jìn)行學(xué)習(xí),為后續(xù)學(xué)習(xí)進(jìn)程調(diào)度與進(jìn)程通信打下堅(jiān)實(shí)基礎(chǔ)。

浙公網(wǎng)安備 33010602011771號(hào)