一,進(jìn)程狀態(tài)變遷
進(jìn)程的三種基本狀態(tài)
就緒(Ready)狀態(tài)
當(dāng)進(jìn)程已分配到除CPU以外的所有必要的資源,只要獲得處理機(jī)便可立即執(zhí)行,這時(shí)的進(jìn)程狀態(tài)稱為就緒狀態(tài)。
執(zhí)行(Running)狀態(tài)
當(dāng)進(jìn)程已獲得處理機(jī),其程序正在處理機(jī)上執(zhí)行,此時(shí)的進(jìn)程狀態(tài)稱為執(zhí)行狀態(tài)。
阻塞(Blocked)狀態(tài)
正在執(zhí)行的進(jìn)程,由于等待某個(gè)事件發(fā)生而無(wú)法執(zhí)行時(shí),便放棄處理機(jī)而處于阻塞狀態(tài)。引起進(jìn)程阻塞的事件可有多種,例如,等待I/O完成、申請(qǐng)緩沖區(qū)不能滿足、等待信件(信號(hào))等。
狀態(tài)轉(zhuǎn)換圖:
一個(gè)進(jìn)程在運(yùn)行期間,不斷地從一種狀態(tài)轉(zhuǎn)換到另一種狀態(tài),它可以多次處于就緒狀態(tài)和執(zhí)行狀態(tài),也可以多次處于阻塞狀態(tài)。
(1) 就緒→執(zhí)行
處于就緒狀態(tài)的進(jìn)程,當(dāng)進(jìn)程調(diào)度程序?yàn)橹峙淞颂幚頇C(jī)后,該進(jìn)程便由就緒狀態(tài)轉(zhuǎn)變成執(zhí)行狀態(tài)。
(2) 執(zhí)行→就緒
處于執(zhí)行狀態(tài)的進(jìn)程在其執(zhí)行過(guò)程中,因分配給它的一個(gè)時(shí)間片已用完或更高優(yōu)先級(jí)的進(jìn)程搶占而不得不讓出處理機(jī),于是進(jìn)程從執(zhí)行狀態(tài)轉(zhuǎn)變成就緒狀態(tài)。
(3) 執(zhí)行→阻塞
正在執(zhí)行的進(jìn)程因等待某種事件發(fā)生而無(wú)法繼續(xù)執(zhí)行時(shí),便從執(zhí)行狀態(tài)變成阻塞狀態(tài)。
(4) 阻塞→就緒
處于阻塞狀態(tài)的進(jìn)程,若其等待的事件已經(jīng)發(fā)生,于是進(jìn)程由阻塞狀態(tài)轉(zhuǎn)變?yōu)榫途w狀態(tài)。
(5) 運(yùn)行→終止
程序執(zhí)行完畢,撤銷而終止
以上是最經(jīng)典也是最基本的三種進(jìn)程狀態(tài),但現(xiàn)在的操作系統(tǒng)都根據(jù)需要重新設(shè)計(jì)了一些新的狀態(tài)。
如linux:
其和淺度睡眠基本類似,但有一點(diǎn)就是不可被其他進(jìn)程信號(hào)或時(shí)鐘中斷喚醒。Linux 使用TASK_UNINTERRUPTIBLE 宏表示此狀態(tài)。
- 運(yùn)行狀態(tài)(TASK_RUNNING):是運(yùn)行態(tài)和就緒態(tài)的合并,表示進(jìn)程正在運(yùn)行或準(zhǔn)備運(yùn)行,Linux 中使用TASK_RUNNING 宏表示此狀態(tài)
- 可中斷睡眠狀態(tài)(淺度睡眠)(TASK_INTERRUPTIBLE):進(jìn)程正在睡眠(被阻塞),等待資源到來(lái)是喚醒,也可以通過(guò)其他進(jìn)程信號(hào)或時(shí)鐘中斷喚醒,進(jìn)入運(yùn)行隊(duì)列。Linux 使用TASK_INTERRUPTIBLE 宏表示此狀態(tài)。
- 不可中斷睡眠狀態(tài)(深度睡眠狀態(tài))(TASK_UNINTERRUPTIBLE):
- 暫停狀態(tài)(TASK_STOPPED):進(jìn)程暫停執(zhí)行接受某種處理。如正在接受調(diào)試的進(jìn)程處于這種狀態(tài),Linux 使用TASK_STOPPED 宏表示此狀態(tài)。
- 僵死狀態(tài)(TASK_ZOMBIE):進(jìn)程已經(jīng)結(jié)束但未釋放PCB,Linux 使用TASK_ZOMBIE 宏表示此狀態(tài)
狀態(tài)轉(zhuǎn)換圖如下:
就緒態(tài)在支持虛擬內(nèi)存的操作系統(tǒng)中可能分為:在內(nèi)存中就緒和在交換空間就緒,因?yàn)橹С痔摂M內(nèi)存的操作系統(tǒng)會(huì)將當(dāng)前不太活躍的一些進(jìn)程交換到交換空間,交換空間就緒進(jìn)程要運(yùn)行要先換人內(nèi)存出入內(nèi)存就緒態(tài),在由cpu調(diào)度執(zhí)行。
二,進(jìn)程控制塊(PCB)
進(jìn)程控制塊包括:
進(jìn)程描述信息:
- 進(jìn)程標(biāo)識(shí)符用于唯一的標(biāo)識(shí)一個(gè)進(jìn)程(pid,ppid)。
進(jìn)程控制信息:
- 進(jìn)程當(dāng)前狀態(tài)
- 進(jìn)程優(yōu)先級(jí)
- 程序開(kāi)始地址
- 各種計(jì)時(shí)信息
- 通信信息
資源信息:
- 占用內(nèi)存大小及管理用數(shù)據(jù)結(jié)構(gòu)指針
- 交換區(qū)相關(guān)信息
- I/O設(shè)備號(hào)、緩沖、設(shè)備相關(guān)的數(shù)結(jié)構(gòu)
- 文件系統(tǒng)相關(guān)指針
現(xiàn)場(chǎng)保護(hù)信息(cpu進(jìn)行進(jìn)程切換時(shí)):
- 寄存器
- PC
- 程序狀態(tài)字PSW
- 棧指針
進(jìn)程標(biāo)識(shí):PID
- 每個(gè)進(jìn)程都會(huì)分配到一個(gè)獨(dú)一無(wú)二的數(shù)字編號(hào),我們稱之為“進(jìn)程標(biāo)識(shí)”(process identifier),或者就直接叫它PID.
- 是一個(gè)正整數(shù),取值范圍從2到32768
可以通過(guò):cat /proc/sys/kernel/pid_max 查看系統(tǒng)支持多少進(jìn)程
- 當(dāng)一個(gè)進(jìn)程被啟動(dòng)時(shí),它會(huì)順序挑選下一個(gè)未使用的編號(hào)數(shù)字做為自己的PID
- 數(shù)字1一般為特殊進(jìn)程init保留的
init進(jìn)程實(shí)際上是用戶進(jìn)程,它是一個(gè)程序,在/sbin/init,linux啟動(dòng)的第一個(gè)進(jìn)程
實(shí)際上linux中還存在0號(hào)進(jìn)程(內(nèi)核進(jìn)程),它是一個(gè)空閑進(jìn)程,它進(jìn)行空閑資源的統(tǒng)計(jì)及交換空間的換入換出,1(init)進(jìn)程是由0號(hào)進(jìn)程創(chuàng)建的。
三,進(jìn)程創(chuàng)建
- 不同的操作系統(tǒng)所提供的進(jìn)程創(chuàng)建原語(yǔ)的名稱和格式不盡相同,但執(zhí)行創(chuàng)建進(jìn)程原語(yǔ)后,操作系統(tǒng)所做的工作卻大致相同,都包括以下幾點(diǎn):
- 給新創(chuàng)建的進(jìn)程分配一個(gè)內(nèi)部標(biāo)識(shí)(pcb),在內(nèi)核中建立進(jìn)程結(jié)構(gòu)。
- 復(fù)制父進(jìn)程的環(huán)境
- 為進(jìn)程分配資源, 包括進(jìn)程映像所需要的所有元素(程序、數(shù)據(jù)、用戶棧等),
- 復(fù)制父進(jìn)程地址空間的內(nèi)容到該進(jìn)程地址空間中。
- 置該進(jìn)程的狀態(tài)為就緒,插入就緒隊(duì)列。
四,進(jìn)程撤銷
進(jìn)程終止時(shí)操作系統(tǒng)做以下工作:
- 關(guān)閉軟中斷:因?yàn)檫M(jìn)程即將終止而不再處理任何軟中斷信號(hào);
- 回收資源:釋放進(jìn)程分配的所有資源,如關(guān)閉所有已打開(kāi)文件,釋放進(jìn)程相應(yīng)的數(shù)據(jù)結(jié)構(gòu)等;
- 寫記帳信息:將進(jìn)程在運(yùn)行過(guò)程中所產(chǎn)生的記帳數(shù)據(jù)(其中包括進(jìn)程運(yùn)行時(shí)的各種統(tǒng)計(jì)信息)記錄到一個(gè)全局記帳文件中;
- 置該進(jìn)程為僵死狀態(tài):向父進(jìn)程發(fā)送子進(jìn)程死的軟中斷信號(hào),將終止信息status送到指定的存儲(chǔ)單元中;
- 轉(zhuǎn)進(jìn)程調(diào)度:因?yàn)榇藭r(shí)CPU已經(jīng)被釋放,需要由進(jìn)程調(diào)度進(jìn)行CPU再分配。
五,終止進(jìn)程的五種方法
- 從main函數(shù)返回:從return返回,執(zhí)行完畢退出
- 調(diào)用exit:C函數(shù)庫(kù),實(shí)際上也是調(diào)用系統(tǒng)調(diào)用_exit完成的,在任何一個(gè)函數(shù)調(diào)用exit函數(shù)都可使得進(jìn)程撤銷
- 調(diào)用_exit:系統(tǒng)調(diào)用
- 調(diào)用abort:調(diào)用abort()函數(shù)使得進(jìn)程終止,實(shí)際上該函數(shù)是產(chǎn)生一個(gè)SIGABRT信號(hào),
-
由信號(hào)終止:發(fā)送一些信號(hào)如SINGINT等信號(hào)
編輯:hfy
-
寄存器
+關(guān)注
關(guān)注
31文章
5357瀏覽量
120586 -
Linux
+關(guān)注
關(guān)注
87文章
11314瀏覽量
209784 -
處理機(jī)
+關(guān)注
關(guān)注
0文章
12瀏覽量
7892 -
進(jìn)程
+關(guān)注
關(guān)注
0文章
203瀏覽量
13964
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論