cpu的虛擬化(上)———— 進(jìn)程
前言
這是一篇我在學(xué)習(xí)OSTEP這本書的筆記與總結(jié),這篇筆記的正文部分圍繞進(jìn)程贊開,主要討論“是什么”與“為什么”兩個(gè)問題,筆記如有錯(cuò)漏,望不吝糾正。
進(jìn)程與操作系統(tǒng)的關(guān)系
進(jìn)程是操作系統(tǒng)里的核心之一,在OSTEP中對(duì)進(jìn)程在操作系統(tǒng)中扮演的角色給出了以下解釋:
進(jìn)程是操作系統(tǒng)中分配資源最小的單位。
在這段描述中有一些關(guān)鍵點(diǎn):資源與最小單位。在看到這段描述后,我就在想“資源”是什么?比進(jìn)程大的資源分配單位有哪些?接下來,我來一一進(jìn)行解釋。
-
為進(jìn)程分配的資源有什么?
- 內(nèi)存資源
- 每個(gè)進(jìn)程都有自己獨(dú)立的內(nèi)存空間,這里獨(dú)立性的主要表現(xiàn)有:每個(gè)進(jìn)程擁有的物理內(nèi)存是分隔開的,不重疊的。這樣設(shè)計(jì)的目的是為了避免A進(jìn)程的行為對(duì)B進(jìn)程產(chǎn)生影響。
- 內(nèi)存空間被分成主要三個(gè)部分:
- 指令段:用于存放進(jìn)程擁有的指令序列,該段的訪問權(quán)限是只讀的,這樣做是為了避免進(jìn)程對(duì)其進(jìn)行修改,導(dǎo)致程序出現(xiàn)開發(fā)者非預(yù)期的行為。
- 數(shù)據(jù)段:數(shù)據(jù)段分為兩個(gè)部分:全局?jǐn)?shù)據(jù)區(qū)、堆區(qū)。全局?jǐn)?shù)據(jù)區(qū)用于存放程序的全局?jǐn)?shù)據(jù)。比如:c語言中的全局變量的值就存儲(chǔ)在這里。堆區(qū)用于提供用戶使用如malloc時(shí)申請(qǐng)的空間。
- 棧區(qū):棧區(qū)用于存儲(chǔ)在函數(shù)調(diào)用過程中的局部變量,
- 內(nèi)核資源
- 操作系統(tǒng)為每個(gè)進(jìn)程分配了如PCB,信號(hào)量,消息隊(duì)列等用于管理進(jìn)程的必要資源。這里我主要介紹PCB。
- PCB的中文名稱是進(jìn)程控制塊,用于存儲(chǔ)描述進(jìn)程的重要信息。如:進(jìn)程ID,進(jìn)程狀態(tài),進(jìn)程的上下文等等。
- CPU時(shí)間片
- CPU時(shí)間片是操作系統(tǒng)用來管理進(jìn)程使用CPU時(shí)長的信息,結(jié)合進(jìn)程調(diào)度程序來完成對(duì)進(jìn)程的合理調(diào)度。
- 內(nèi)存資源
-
比進(jìn)程大的資源分配單位有哪些?
- 在操作系統(tǒng)中比進(jìn)程大的資源分配單位有:作業(yè)、會(huì)話等,對(duì)于這些概念在此就不詳細(xì)展開了,感興趣的可以向DeepSeek提問。
進(jìn)程初識(shí)
現(xiàn)在讓我們回到關(guān)于進(jìn)程的問題中,前文我們聊了進(jìn)程與操作系統(tǒng)的關(guān)系,那么,接下來來聊聊關(guān)于進(jìn)程本身的問題吧!
當(dāng)我們第一次聽到進(jìn)程這個(gè)詞時(shí),大概會(huì)產(chǎn)生這樣的疑惑,進(jìn)程是什么?為什么要提出進(jìn)程的概念?進(jìn)程與我們平時(shí)寫的程序有什么關(guān)系?現(xiàn)在我們來一一解釋這些疑問。
- 進(jìn)程是什么?
- 對(duì)于這個(gè)問題我的解釋是:進(jìn)程是程序加載到內(nèi)存后,在CPU中執(zhí)行的過程。這里的關(guān)鍵詞是過程,進(jìn)程不像程序是一直存儲(chǔ)在硬盤中與其他的硬件或程序是沒有任何交互的,它在每時(shí)每刻都在與其余硬件和進(jìn)程進(jìn)行互動(dòng),DeepSeek對(duì)該問題的回答中使用了靜態(tài)與動(dòng)態(tài)這兩個(gè)詞來描述進(jìn)程與程序的聯(lián)系。
- 在聊進(jìn)程的時(shí)候,程序不可避免的引入了進(jìn)來。因此,在此也談?wù)劤绦虻南嚓P(guān)問題。
- 程序是什么呢?
- 程序是存儲(chǔ)在磁盤里的一條條機(jī)器指令構(gòu)成的集合。
- 程序與的進(jìn)程的聯(lián)系是怎樣的?
- 程序就好像是一個(gè)菜譜,它記錄了做某一道菜的每個(gè)步驟。而進(jìn)程則是照著這個(gè)菜譜做菜的過程,這個(gè)過程中除了有菜譜上描述的步驟,還有與這些步驟交互的廚具,如:裝菜的籃子,炒菜的灶臺(tái)等等。
- 程序是什么呢?
- 進(jìn)程概念的產(chǎn)生在歷史上的原因
- 在1960年之前的計(jì)算機(jī),執(zhí)行程序的方式是串行執(zhí)行。串行執(zhí)行就是當(dāng)一個(gè)程序執(zhí)行完成后,再執(zhí)行另一個(gè)程序。使用這種執(zhí)行方式的原因主要是因?yàn)橛布Y源的不足,如:CPU的執(zhí)行速度過慢、內(nèi)存空間的太小等等。但隨著硬件的發(fā)展,CPU的運(yùn)行速度與內(nèi)存空間的大小大幅提升。此時(shí),計(jì)算機(jī)的設(shè)計(jì)者們就開始思考怎樣提高在單位時(shí)間上的硬件利用率[1]。其中有一個(gè)思路是讓多個(gè)程序交替在內(nèi)存中運(yùn)行,而為了實(shí)現(xiàn)這個(gè)目標(biāo),設(shè)計(jì)者們要面臨一系列的問題,而這些問題都與程序在CPU上的運(yùn)行過程有關(guān),其中有幾個(gè)要素是需要格外關(guān)注的,如:程序在內(nèi)存中的指令集、程序在CPU的寄存器中的狀態(tài)、程序與程序之間在物理空間上的關(guān)系等等。而為了方便描述與解決這些問題就需要一個(gè)東西,這個(gè)東西要將這些關(guān)鍵要素關(guān)聯(lián)為一個(gè)整體,這個(gè)東西的名稱便是進(jìn)程。
最后,談?wù)勥M(jìn)程的幾種基本狀態(tài)。進(jìn)程的狀態(tài)是很重要的,因?yàn)閷?duì)進(jìn)程進(jìn)行調(diào)度時(shí),需要依賴這些狀態(tài)信息。
-
進(jìn)程的基本狀態(tài)
- 運(yùn)行:運(yùn)行狀態(tài)是指當(dāng)進(jìn)程正在使用CPU時(shí)處于的狀態(tài)。
- 阻塞:阻塞狀態(tài)是指當(dāng)進(jìn)程在等待I/O請(qǐng)求或其他事件時(shí)處于的狀態(tài)。
- 就緒:就緒狀態(tài)指進(jìn)程除了CPU資源其他的所有所需的都就緒時(shí)處于的狀態(tài)。
-
狀態(tài)轉(zhuǎn)化的觸發(fā)條件
- 運(yùn)行->阻塞
- 當(dāng)使用系統(tǒng)調(diào)用獲取外部存儲(chǔ)設(shè)備的數(shù)據(jù)時(shí)發(fā)生。
- 示例:使用系統(tǒng)調(diào)用read(),在讀取磁盤數(shù)據(jù)時(shí)需要停止使用CPU。
- 阻塞->就緒
- 當(dāng)發(fā)出的請(qǐng)求有回應(yīng)或者讀取的數(shù)據(jù)到達(dá)時(shí)。
- 就緒->運(yùn)行
- 當(dāng)該進(jìn)程被調(diào)度程序選中,便會(huì)開始使用CPU。
- 運(yùn)行->阻塞
在串行執(zhí)行方式下,當(dāng)一個(gè)程序在等待I/O設(shè)備的回應(yīng)時(shí),CPU是處于空閑狀態(tài)的。因此,硬件的利用率還有提高的空間。 ??

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