在給進(jìn)程下定義前,先考慮以下幾個(gè)概念:
有了上述概念,現(xiàn)在就可以討論操作系統(tǒng)怎樣以一個(gè)有序的方式管理應(yīng)用程序的執(zhí)行,以達(dá)到以下目的:
現(xiàn)代操作系統(tǒng)采用的方法都是依據(jù)對(duì)應(yīng)于一個(gè)或多個(gè)進(jìn)程存在的應(yīng)用程序執(zhí)行的一種模型。
關(guān)于進(jìn)程有很多定義:
一個(gè)被執(zhí)行的程序,操作系統(tǒng)會(huì)為該程序創(chuàng)建一個(gè)進(jìn)程或任務(wù),并且控制進(jìn)程的執(zhí)行。
簡(jiǎn)單來(lái)說(shuō),程序只有兩種狀態(tài):運(yùn)行態(tài)、未運(yùn)行態(tài)。
兩狀態(tài)進(jìn)程模型
同時(shí),未運(yùn)行的進(jìn)程需保持在某種類(lèi)型的隊(duì)列中,并等待它們的執(zhí)行時(shí)機(jī)。
上圖中的排隊(duì)圖可以描述分派器的行為:被中斷的進(jìn)程轉(zhuǎn)移到等待進(jìn)程隊(duì)列中,或者,如果進(jìn)程以及結(jié)束或取消,則被銷(xiāo)毀。在任何一種情況下,分派器均從隊(duì)列中選擇一個(gè)進(jìn)程來(lái)執(zhí)行。
通過(guò)這個(gè)模型,可以看出操作系統(tǒng)需要用某種方式來(lái)表示每個(gè)進(jìn)程,使得操作系統(tǒng)能夠跟蹤它,也就是說(shuō)需要有一些與進(jìn)程相關(guān)的信息,包括進(jìn)程在內(nèi)存中的狀態(tài)和位置,即進(jìn)程控制塊。
進(jìn)程在任意時(shí)間都可以唯一地被表征為以下元素:
簡(jiǎn)化的進(jìn)程控制塊
這些信息被存放在一個(gè)叫進(jìn)程控制塊的數(shù)據(jù)結(jié)構(gòu)中,它由操作系統(tǒng)創(chuàng)建和管理。進(jìn)程控制塊是進(jìn)程存在的唯一標(biāo)志,也就是說(shuō)任何一個(gè)進(jìn)程只要進(jìn)程創(chuàng)建了它就一定有一個(gè)跟它相對(duì)應(yīng)的進(jìn)程控制塊,進(jìn)程結(jié)束了進(jìn)程控制塊就會(huì)被操作系統(tǒng)回收,進(jìn)程在執(zhí)行的過(guò)程對(duì)進(jìn)程的所有操作都是通過(guò)進(jìn)程控制塊來(lái)實(shí)現(xiàn)的。
進(jìn)程創(chuàng)建和終止
進(jìn)程除運(yùn)行和未運(yùn)行外,在進(jìn)程的生命周期中,創(chuàng)建和終止都是不可避免的。
進(jìn)程創(chuàng)建
通常有4個(gè)事件會(huì)導(dǎo)致創(chuàng)建一個(gè)進(jìn)程:
當(dāng)一個(gè)進(jìn)程派生另一個(gè)進(jìn)程時(shí),前一個(gè)稱(chēng)為父進(jìn)程,被派生的被稱(chēng)為子進(jìn)程。
一旦操作系統(tǒng)決定創(chuàng)建一個(gè)新進(jìn)程,它就會(huì)按以下步驟進(jìn)行:
進(jìn)程終止
有很多事件可以導(dǎo)致進(jìn)程終止,比如:
五狀態(tài)模型
系統(tǒng)中還存在著一些處于非運(yùn)行狀態(tài)但已經(jīng)就緒等待執(zhí)行的進(jìn)程,而且還存在另一些處于阻塞狀態(tài)等待 I/O 操作結(jié)束的進(jìn)程。
這時(shí),就緒態(tài)(ready)和阻塞態(tài)(blocked)出現(xiàn)了,兩狀態(tài)模型升級(jí)為了5狀態(tài)模型,5個(gè)狀態(tài)如下:
五狀態(tài)進(jìn)程模型
新建-就緒: 操作系統(tǒng)準(zhǔn)備好再接納一個(gè)進(jìn)程時(shí),把一個(gè)進(jìn)程從新建態(tài)轉(zhuǎn)換到就緒態(tài)。大多數(shù)系統(tǒng)基于心有的進(jìn)程數(shù)或分配給現(xiàn)有進(jìn)程的虛擬內(nèi)存數(shù)量設(shè)置一些限制,以確保不會(huì)因?yàn)榛钴S進(jìn)程數(shù)量過(guò)多而導(dǎo)致系統(tǒng)的性能下降。
就緒-退出: 在某些系統(tǒng)中,父進(jìn)程可以在任何時(shí)候終止一個(gè)子進(jìn)程。如果一個(gè)父進(jìn)程終止,與該父進(jìn)程相關(guān)的所有子進(jìn)程都將被終止。
掛起
就緒態(tài)、運(yùn)行態(tài)和阻塞態(tài)提供了一種為進(jìn)程行為建立模型的系統(tǒng)方法,但有個(gè)問(wèn)題需要考慮:每個(gè)被執(zhí)行的進(jìn)程必須完全載入內(nèi)存,當(dāng)一個(gè)進(jìn)程在等待 I/O 操作時(shí),處理器可以轉(zhuǎn)移到另一個(gè)進(jìn)程,但 I/O 活動(dòng)比CPU 計(jì)算速度慢很多,因此大多數(shù)情況下處理器在多數(shù)時(shí)候都是空閑的。但是如果內(nèi)存中都是阻塞態(tài)的進(jìn)程怎么辦呢?
有掛起態(tài)的進(jìn)程狀態(tài)轉(zhuǎn)換圖
這里有兩個(gè)獨(dú)立的概念:進(jìn)程是否在等待一個(gè)事件(阻塞與否)以及進(jìn)程是否已經(jīng)被換出內(nèi)存(掛起與否)。這里需要4個(gè)狀態(tài):
現(xiàn)在狀態(tài)轉(zhuǎn)換如下:
阻塞-阻塞/掛起:如果沒(méi)有就緒進(jìn)程,則至少一個(gè)阻塞進(jìn)程被換出,為另一個(gè)沒(méi)有阻塞的進(jìn)程讓出空間
阻塞/掛起-就緒/掛起:如果等待事件發(fā)生了,比如 I/O 不再阻塞,則處于阻塞/掛起 狀態(tài)的進(jìn)程可以轉(zhuǎn)換到 就緒/掛起狀態(tài)。
阻塞/掛起-阻塞:比如一個(gè)進(jìn)程終止了,釋放了一些內(nèi)存空間,阻塞/掛起隊(duì)列中有一個(gè)進(jìn)程比 就緒/掛起隊(duì)列中的任何任何進(jìn)程的優(yōu)先級(jí)都要高,并且操作系統(tǒng)有理由相信阻塞進(jìn)程的時(shí)間很快就會(huì)發(fā)生,這時(shí),把阻塞進(jìn)程而不是就緒進(jìn)程調(diào)入內(nèi)存是合理的。
大多數(shù)處理器至少支持兩種執(zhí)行模式,某些指令只能在特權(quán)態(tài)下運(yùn)行,包括讀取或改變諸如程序狀態(tài)之類(lèi)控制寄存器的指令,原始 I/O 指令和與內(nèi)存管理相關(guān)的指令。另外有部分內(nèi)存區(qū)域僅在特權(quán)態(tài)下可以被訪(fǎng)問(wèn)到。
特權(quán)態(tài):特權(quán)態(tài)可稱(chēng)做系統(tǒng)態(tài)、控制態(tài)或內(nèi)核態(tài),內(nèi)核態(tài)指的是操作系統(tǒng)的內(nèi)核。
用戶(hù)態(tài):用戶(hù)程序常在該模式下運(yùn)行
兩種模式可以保護(hù)操作系統(tǒng)和重要的操作系統(tǒng)表不受用戶(hù)程序的干涉。
操作系統(tǒng)內(nèi)核的典型功能:
操作系統(tǒng)內(nèi)核的典型功能
進(jìn)程切換
從表面看,進(jìn)程切換非常簡(jiǎn)單。在某一時(shí)刻,操作系統(tǒng)中斷正在運(yùn)行的進(jìn)程,然后指定另一個(gè)進(jìn)程為運(yùn)行態(tài),并把控制權(quán)交給這個(gè)進(jìn)程。但是現(xiàn)在會(huì)有幾個(gè)問(wèn)題:
何時(shí)切換進(jìn)程?
進(jìn)程切換可以在操作系統(tǒng)從當(dāng)前正在運(yùn)行的進(jìn)程中獲得控制權(quán)的任何時(shí)刻發(fā)生。以下是可能把控制權(quán)交給操作系統(tǒng)的事件:
進(jìn)程執(zhí)行的中斷機(jī)制
系統(tǒng)中斷通常分為兩種,一種是中斷,另一種是陷阱。
中斷與當(dāng)前正在運(yùn)行的進(jìn)程無(wú)關(guān)的某種類(lèi)型的外部事件相關(guān),比如 I/O 操作;陷阱與當(dāng)前正在運(yùn)行的進(jìn)程鎖產(chǎn)生的錯(cuò)誤或異常條件相關(guān),比如非法的文件訪(fǎng)問(wèn)。
以下是一些常見(jiàn)的中斷事件:
對(duì)于陷阱,操作系統(tǒng)首先確認(rèn)錯(cuò)誤或者異常是否是致命的。如果是,當(dāng)前進(jìn)程被轉(zhuǎn)換到退出態(tài);如果不是,操作系統(tǒng)的動(dòng)作取決于錯(cuò)誤的種類(lèi)和操作系統(tǒng)的設(shè)計(jì)(有可能是視圖恢復(fù)或通知用戶(hù))。
操作系統(tǒng)也可能被來(lái)自正在執(zhí)行的程序的系統(tǒng)調(diào)用激活,比如打開(kāi)文件,通常,使用系統(tǒng)調(diào)用會(huì)導(dǎo)致把當(dāng)前進(jìn)程置為阻塞態(tài)
系統(tǒng)調(diào)用
Unix 系統(tǒng)是由用戶(hù)空間(userland)和內(nèi)核組成。Unix 內(nèi)核位于計(jì)算機(jī)硬件之上,是與搖籃嗎交互的中介。這些交互包括通過(guò)問(wèn)卷系統(tǒng)進(jìn)程讀/寫(xiě)、在網(wǎng)絡(luò)上發(fā)送數(shù)據(jù)、分配內(nèi)存,以及通過(guò)揚(yáng)聲器播放音頻。這些都是用戶(hù)應(yīng)用程序所不能涉及的,只能通過(guò)系統(tǒng)調(diào)用來(lái)完成。
系統(tǒng)調(diào)用為內(nèi)核和用戶(hù)空間搭建了橋梁。規(guī)定了程序和計(jì)算機(jī)硬件直接所允許發(fā)生的一切交互。
模式切換和進(jìn)程切換是不同的。發(fā)生模式切換可以不改變正處于運(yùn)行態(tài)的進(jìn)程的狀態(tài),而進(jìn)程被轉(zhuǎn)換到另一個(gè)狀態(tài)操作系統(tǒng)必須使其環(huán)境產(chǎn)生實(shí)質(zhì)性的變化。
進(jìn)程切換步驟如下:
下一篇將介紹 Unix 進(jìn)程
參考
聯(lián)系客服