進(jìn)程(Process) 的定義
從不同的角度焕窝,進(jìn)程可以有不同的定義尔破,傳統(tǒng)典型的定義:
進(jìn)程是程序的一次執(zhí)行過程媳叨。 或者:一個(gè)正在執(zhí)行的程序的實(shí)例
進(jìn)程是一個(gè)程序及其數(shù)據(jù)在處理機(jī)上順序執(zhí)行所發(fā)生的活動(dòng)
進(jìn)程是具有獨(dú)立功能的程序在數(shù)據(jù)集合上運(yùn)行的過程万牺,它是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單位
通過htop命令顯示的進(jìn)程列表
進(jìn)程和程序的關(guān)系
進(jìn)程是一個(gè)動(dòng)態(tài)概念,程序是一個(gè)靜態(tài)概念邢享。
進(jìn)程具有并發(fā)特征鹏往,程序沒有(程序全部是順序的)。
進(jìn)程是競(jìng)爭(zhēng)資源的基本單位骇塘。
一個(gè)程序?qū)?yīng)多個(gè)進(jìn)程伊履,一個(gè)進(jìn)程為多個(gè)程序服務(wù)。
進(jìn)程的狀態(tài)(State)
創(chuàng)建(New): 進(jìn)程正在被建立的階段绪爸。
就緒(Ready?):當(dāng)進(jìn)程已分配到除CPU以外的所有必要資源后湾碎,只要再獲得CPU宙攻,便可立即執(zhí)行奠货,進(jìn)程這時(shí)的狀態(tài)稱為就緒狀態(tài)。在一個(gè)系統(tǒng)中處于就緒狀態(tài)的進(jìn)程可能有多個(gè)座掘,通常將它們排成一個(gè)隊(duì)列递惋,稱為就緒隊(duì)列
運(yùn)行(Running?):進(jìn)程占有CPU,并在CPU上運(yùn)行指令溢陪。
等待/阻塞(Waiting?/blocked):正在執(zhí)行的進(jìn)程由于發(fā)生某事件而暫時(shí)無法繼續(xù)執(zhí)行時(shí)萍虽,便放棄處理機(jī)而處于暫停狀態(tài),亦即進(jìn)程的執(zhí)行受到阻塞形真,把這種暫停狀態(tài)稱為阻塞狀態(tài)杉编,也稱為等待狀態(tài)或封鎖狀態(tài)。致使進(jìn)程阻塞的典型事件有:請(qǐng)求I/O咆霜,申請(qǐng)緩沖空間等邓馒。通常將這種處于阻塞狀態(tài)的進(jìn)程也排成一個(gè)隊(duì)列。有的系統(tǒng)則根據(jù)阻塞原因的不同而把處于阻塞狀態(tài)的進(jìn)程排成多個(gè)隊(duì)列蛾坯。
終止(Terminated?):進(jìn)程已經(jīng)完成了執(zhí)行光酣。
進(jìn)程的五種基本狀態(tài)及轉(zhuǎn)換
進(jìn)程控制塊(PCB)
進(jìn)程控制塊(Process Control Block?PCB) 是操作系統(tǒng)核心中一種數(shù)據(jù)結(jié)構(gòu),用來表示進(jìn)程狀態(tài)脉课,記錄進(jìn)程的外部特征救军,描述進(jìn)程的運(yùn)動(dòng)變化過程财异。同時(shí),操作系統(tǒng)可以利用PCB來控制和管理進(jìn)程唱遭。
一般情況下戳寸,PCB中包含以下內(nèi)容:
標(biāo)識(shí)信息:
用于存放唯一標(biāo)識(shí)該進(jìn)程的信息。系統(tǒng)分配的標(biāo)識(shí)號(hào)拷泽、系統(tǒng)分配的進(jìn)程組標(biāo)識(shí)號(hào)庆揩、用戶定義的進(jìn)程名、用戶定義的進(jìn)程組名跌穗。
現(xiàn)場(chǎng)信息:
用于存放該進(jìn)程運(yùn)行時(shí)的處理器現(xiàn)場(chǎng)信息订晌。用戶可見寄存器內(nèi)容:數(shù)據(jù)寄存器、地址寄存器蚌吸、控制與狀態(tài)寄存器內(nèi)容:PC(程序計(jì)數(shù)器)锈拨、IR(指令寄存器)、PSW(程序狀態(tài)字)羹唠。棧指針內(nèi)容:核心棧與用戶棧指針
控制信息:
用于存放與管理奕枢、調(diào)度進(jìn)程相關(guān)的信息。調(diào)度相關(guān)信息:狀態(tài)佩微、等待事件/原因缝彬、優(yōu)先級(jí)。進(jìn)程組成信息:代碼/數(shù)據(jù)地址哺眯、外存映像地址谷浅。進(jìn)程隊(duì)列指引元:進(jìn)程隊(duì)列指針、父子兄弟進(jìn)程指針奶卓。
進(jìn)程通信相關(guān)信息:消息隊(duì)列一疯、信號(hào)量、鎖夺姑。進(jìn)程處理器使用信息:占用的處理器墩邀、時(shí)間片、處理器使用時(shí)間/已執(zhí)行總時(shí)間盏浙、記賬信息眉睹。進(jìn)程特權(quán)信息:如內(nèi)存訪問權(quán)限、處理器特權(quán)废膘。進(jìn)程資源清單信息:如正占有的資源竹海、已使用的資源。
進(jìn)程控制塊PCB
PCB的作用
PCB?可以被操作系統(tǒng)中的多個(gè)模塊讀或修改殖卑,如被調(diào)度程序站削、資源分配程序、中斷處理程序以及監(jiān)督和分析程序等讀或修改孵稽。 操作系統(tǒng)是根據(jù)?PCB來對(duì)并發(fā)執(zhí)行的進(jìn)程進(jìn)行控制和管理的许起,它是操作系統(tǒng)中最重要的記錄型數(shù)據(jù)結(jié)構(gòu)十偶。
Linux?系統(tǒng)中PCB結(jié)構(gòu)用?task_struct?數(shù)據(jù)結(jié)構(gòu),?Windows系統(tǒng)的PCB:EPROCESS园细,
PCB使一個(gè)在多道程序環(huán)境下不能獨(dú)立運(yùn)行的程序(含數(shù)據(jù))惦积,成為一個(gè)能獨(dú)立運(yùn)行的基本單位, 一個(gè)能與其它進(jìn)程并發(fā)執(zhí)行的進(jìn)程猛频。
進(jìn)程的組成
PCB狮崩、程序段、數(shù)據(jù)段組成了進(jìn)程實(shí)體鹿寻,也叫進(jìn)程映像睦柴。一般情況下,我們把進(jìn)程實(shí)體就簡(jiǎn)稱為進(jìn)程毡熏,所謂創(chuàng)建進(jìn)程坦敌,實(shí)質(zhì)上創(chuàng)建進(jìn)程實(shí)體中的PCB;而撤銷進(jìn)程痢法,實(shí)質(zhì)上就是撤銷進(jìn)程實(shí)體中的PCB狱窘。
進(jìn)程上下文(context)
除了進(jìn)程實(shí)體(進(jìn)程映像),進(jìn)程的執(zhí)行還需要環(huán)境支持财搁,包括CPU現(xiàn)場(chǎng)和Cache中的執(zhí)行信息蘸炸, 操作系統(tǒng)中的進(jìn)程物理實(shí)體(代碼和數(shù)據(jù)等)和支持進(jìn)程運(yùn)行的環(huán)境合成進(jìn)程上下文,用于刻畫進(jìn)程的執(zhí)行情況尖奔,進(jìn)程在當(dāng)前上下文中運(yùn)行搭儒。
在前面的操作系統(tǒng)基礎(chǔ)4我們已經(jīng)說過關(guān)于CPU的內(nèi)核模式與用戶模式。在操心系統(tǒng)基礎(chǔ)6也已經(jīng)說過關(guān)于中斷越锈。 正是有了不同運(yùn)行狀態(tài)的劃分仗嗦,才有了上下文的概念膘滨。
用戶空間的應(yīng)用程序甘凭,通過系統(tǒng)調(diào)用,進(jìn)入內(nèi)核空間火邓。這個(gè)時(shí)候用戶空間的進(jìn)程要傳遞很多變量丹弱、參數(shù)的值給內(nèi)核,內(nèi)核模式運(yùn)行的時(shí)候也要保存用戶進(jìn)程的一些寄存器值铲咨、變量等躲胳。所謂的“進(jìn)程上下文”,可以看作是用戶進(jìn)程傳遞給內(nèi)核的這些參數(shù)以及內(nèi)核要保存的那一整套的變量和寄存器值和當(dāng)時(shí)的環(huán)境等纤勒。
硬件通過觸發(fā)信號(hào)坯苹,導(dǎo)致內(nèi)核調(diào)用中斷處理程序,進(jìn)入內(nèi)核空間摇天。這個(gè)過程中粹湃,硬件的一些變量和參數(shù)也要傳遞給內(nèi)核恐仑,內(nèi)核通過這些參數(shù)進(jìn)行中斷處理。所謂的“中斷上下文”为鳄,其實(shí)也可以看作就是硬件傳遞過來的這些參數(shù)和內(nèi)核需要保存的一些其他環(huán)境(主要是當(dāng)前被打斷執(zhí)行的進(jìn)程環(huán)境)裳仆。
進(jìn)程上下文可以劃分為:
(1)用戶級(jí)上下文:用戶程序塊/用戶數(shù)據(jù)區(qū)/用戶堆棧/用戶共享內(nèi)存組成的用戶空間信息
(2)寄存器上下文:即進(jìn)程的現(xiàn)場(chǎng)信息,包括PSW/棧指針/通用寄存器孤钦。
(3)系統(tǒng)級(jí)上下文:由進(jìn)程控制塊(進(jìn)程的狀態(tài))歧斟、內(nèi)存管理信息(進(jìn)程頁表或段表)和系統(tǒng)核心棧(進(jìn)程內(nèi)核態(tài)運(yùn)行時(shí)的工作區(qū))等操作系統(tǒng)管理進(jìn)程需要的信息。
用戶級(jí)上下文地址空間和系統(tǒng)級(jí)上下文地址空間一起構(gòu)成了一個(gè)進(jìn)程的整個(gè)存儲(chǔ)器映像偏形。
進(jìn)程的組織方式
把處于同一狀態(tài)的所有進(jìn)程的PCB鏈接在一起的數(shù)據(jù)結(jié)構(gòu)稱為進(jìn)程隊(duì)列静袖,有兩種常用的隊(duì)列組織方式:
(1)鏈接方式:即把具有相同狀態(tài)的進(jìn)程的PCB分別通過鏈接指針連接成一個(gè)隊(duì)列,系統(tǒng)為每個(gè)隊(duì)列設(shè)置隊(duì)列標(biāo)志以便標(biāo)識(shí)和識(shí)別隊(duì)列俊扭。這樣勾徽,可以形成就緒隊(duì)列、若干個(gè)阻塞隊(duì)列和空白隊(duì)列等统扳。對(duì)其中的就緒隊(duì)列常按進(jìn)程優(yōu)先級(jí)的高低排列喘帚,把優(yōu)先級(jí)高的進(jìn)程的 PCB 排在隊(duì)列前面。此外咒钟,也可根據(jù)阻塞原因的不同而把處于阻塞狀態(tài)的進(jìn)程的?PCB?排成等待 I/O 操作完成的隊(duì)列和等待分配內(nèi)存的隊(duì)列等吹由。
(2)索引方式:系統(tǒng)根據(jù)所有進(jìn)程的狀態(tài)建立幾張索引表。例如朱嘴,就緒索引表倾鲫、阻塞索引表等,并把各索引表在內(nèi)存的首地址記錄在內(nèi)存的一些專用單元中萍嬉。在每個(gè)索引表的表目中乌昔,記錄具有相應(yīng)狀態(tài)的某個(gè) PCB 在 PCB 表中的地址。
進(jìn)程控制
進(jìn)程控制對(duì)應(yīng)的進(jìn)程隊(duì)列模型
進(jìn)程控制的主要功能是對(duì)系統(tǒng)中的所有進(jìn)程實(shí)施有效的管理壤追,它具有創(chuàng)建新進(jìn)程磕道、撤銷已有進(jìn)程、實(shí)現(xiàn)進(jìn)程狀態(tài)轉(zhuǎn)換等功能行冰。
簡(jiǎn)化理解:進(jìn)程控制就是要實(shí)現(xiàn)進(jìn)程狀態(tài)的轉(zhuǎn)換溺蕉。
進(jìn)程創(chuàng)建:進(jìn)程列表加一項(xiàng),申請(qǐng)PCB并初始化悼做,分配唯一進(jìn)程標(biāo)識(shí)符疯特,建立映像,分配資源肛走,移入就緒隊(duì)列
進(jìn)程撤銷:從隊(duì)列中移除漓雅,歸還資源,撤銷標(biāo)識(shí)符,回收PCB邻吞,移除進(jìn)程表項(xiàng)(先要撤銷子進(jìn)程)
進(jìn)程阻塞:保存現(xiàn)場(chǎng)信息庶灿,修改PCB,移入等待隊(duì)列吃衅,轉(zhuǎn)向進(jìn)程調(diào)度程序調(diào)度其它進(jìn)程執(zhí)行
進(jìn)程喚醒:等待隊(duì)列中移出往踢,修改PCB,移入就緒隊(duì)列(該進(jìn)程優(yōu)先級(jí)高于運(yùn)行進(jìn)程徘层,則重新設(shè)置調(diào)度標(biāo)志)
隊(duì)列管理模塊是操作系統(tǒng)實(shí)現(xiàn)進(jìn)程控制管理的核心模塊峻呕。進(jìn)程與資源調(diào)度圍繞進(jìn)程隊(duì)列展開。
操作系統(tǒng)建立多個(gè)進(jìn)程隊(duì)列趣效,如只有一個(gè)進(jìn)程的運(yùn)行隊(duì)列瘦癌、按照優(yōu)先級(jí)或FCFS排列的就緒隊(duì)列、等待I/O操作完成的隊(duì)列跷敬、等待信號(hào)量的隊(duì)列等讯私。按需組織為先進(jìn)先出隊(duì)列與優(yōu)先隊(duì)列
當(dāng)發(fā)生某個(gè)事件使進(jìn)程狀態(tài)發(fā)生轉(zhuǎn)換時(shí),此進(jìn)程退出所在隊(duì)列進(jìn)入另一個(gè)隊(duì)列西傀。
原語:用原語實(shí)現(xiàn)進(jìn)程控制斤寇。原語的特點(diǎn)是執(zhí)行期間不允許中斷,只能一氣呵成拥褂。這種不可中斷的操作即原子操作娘锁。原語采用“關(guān)中斷”指令和“開中斷指令”實(shí)現(xiàn)。關(guān)中斷指令執(zhí)行后饺鹃,外部中斷信號(hào)將被忽略莫秆,直到開中斷執(zhí)行。
進(jìn)程控制會(huì)導(dǎo)致進(jìn)程狀態(tài)的轉(zhuǎn)換悔详。原語要做的三類事情:
1. 更新PCB中的信息(如修改進(jìn)程狀態(tài)標(biāo)志镊屎、將運(yùn)行環(huán)境保存到PCB、從PCB恢復(fù)運(yùn)行環(huán)境)
? ? ?a. 所有的進(jìn)程原語一定都會(huì)修改進(jìn)程狀態(tài)標(biāo)志
? ? ?b. 剝奪當(dāng)前運(yùn)行進(jìn)程的CPU使用權(quán)必然需要保存其運(yùn)行環(huán)境
? ? ?c. 某進(jìn)程開始運(yùn)行前必然要恢復(fù)其運(yùn)行環(huán)境茄螃。
2. 將PCB插入合適的隊(duì)列
3. 分配/回收資源