引入多道程序在執(zhí)行時(shí),需要共享系統(tǒng)資源,從而導(dǎo)致各程序在執(zhí)行過程中出現(xiàn)相互制約的關(guān)系,程序的執(zhí)行表現(xiàn)出間斷性的特征。這些特征都是在程序的執(zhí)行過程中發(fā)生的,是動態(tài)的過程,而傳統(tǒng)的程序本身是一組指令的集合,是一個靜態(tài)的概念,無法描述程序在內(nèi)存中的執(zhí)行情況,即我們無法從程序的字面上看出它何時(shí)執(zhí)行,何時(shí)停頓,也無法看出它與其它執(zhí)行程序的關(guān)系,因此,程序這個靜態(tài)概念已不能如實(shí)反映程序并發(fā)執(zhí)行過程的特征。為了深刻描述程序動態(tài)執(zhí)行過程的性質(zhì),人們引入“進(jìn)程(Process)”概念。
概念
進(jìn)程是60年代初首先由麻省理工學(xué)院的MULTICS系統(tǒng)和IBM公司的CTSS/360系統(tǒng)引入的。
進(jìn)程是一個具有獨(dú)立功能的程序關(guān)于某個數(shù)據(jù)集合的一次運(yùn)行活動。它可以申請和擁有系統(tǒng)資源,是一個動態(tài)的概念,是一個活動的實(shí)體。它不只是程序的代碼,還包括當(dāng)前的活動,通過程序計(jì)數(shù)器的值和處理寄存器的內(nèi)容來表示。
windows的進(jìn)程管理器
定義
狹義定義:進(jìn)程就是程序的執(zhí)行過程。
進(jìn)程是一個具有一定獨(dú)立功能的程序關(guān)于某個數(shù)據(jù)集合的一次運(yùn)行活動。它是操作系統(tǒng)動態(tài)執(zhí)行的基本單元,在傳統(tǒng)的操作系統(tǒng)中,進(jìn)程既是基本的分配單元,也是基本的執(zhí)行單元。
主要兩點(diǎn)
進(jìn)程的概念主要有兩點(diǎn):第一,進(jìn)程是一個實(shí)體。每一個進(jìn)程都有它自己的地址空間,一般情況下,包括文本區(qū)域(text region)、數(shù)據(jù)區(qū)域(data region)和堆棧(stack region)。文本區(qū)域存儲處理器執(zhí)行的代碼;數(shù)據(jù)區(qū)域存儲變量和進(jìn)程執(zhí)行期間使用的動態(tài)分配的內(nèi)存;堆棧區(qū)域存儲著活動過程調(diào)用的指令和本地變量。第二,進(jìn)程是一個“執(zhí)行中的程序”。程序是一個沒有生命的實(shí)體,只有處理器賦予程序生命時(shí),它才能成為一個活動的實(shí)體,我們稱其為進(jìn)程。
進(jìn)程是操作系統(tǒng)中最基本、重要的概念。是多道程序系統(tǒng)出現(xiàn)后,為了刻畫系統(tǒng)內(nèi)部出現(xiàn)的動態(tài)情況,描述系統(tǒng)內(nèi)部各道程序的活動規(guī)律引進(jìn)的一個概念,所有多道程序設(shè)計(jì)操作系統(tǒng)都建立在進(jìn)程的基礎(chǔ)上。
原因
操作系統(tǒng)引入進(jìn)程的概念的原因:
從理論角度看,是對正在運(yùn)行的程序過程的抽象;
從實(shí)現(xiàn)角度看,是一種數(shù)據(jù)結(jié)構(gòu),目的在于清晰地刻畫動態(tài)系統(tǒng)的內(nèi)在規(guī)律,有效管理和調(diào)度進(jìn)入計(jì)算機(jī)系統(tǒng)主存儲器運(yùn)行的程序。
特征
動態(tài)性:進(jìn)程的實(shí)質(zhì)是程序在多道程序系統(tǒng)中的一次執(zhí)行過程,進(jìn)程是動態(tài)產(chǎn)生,動態(tài)消亡的。
并發(fā)性:任何進(jìn)程都可以同其他進(jìn)程一起并發(fā)執(zhí)行
獨(dú)立性:進(jìn)程是一個能獨(dú)立運(yùn)行的基本單位,同時(shí)也是系統(tǒng)分配資源和調(diào)度的獨(dú)立單位;
異步性:由于進(jìn)程間的相互制約,使進(jìn)程具有執(zhí)行的間斷性,即進(jìn)程按各自獨(dú)立的、不可預(yù)知的速度向前推進(jìn)
結(jié)構(gòu)特征:進(jìn)程由程序、數(shù)據(jù)和進(jìn)程控制塊三部分組成。
多個不同的進(jìn)程可以包含相同的程序:一個程序在不同的數(shù)據(jù)集里就構(gòu)成不同的進(jìn)程,能得到不同的結(jié)果;但是執(zhí)行過程中,程序不能發(fā)生改變。
內(nèi)容
一個計(jì)算機(jī)系統(tǒng)進(jìn)程包括(或者說“擁有”)下列數(shù)據(jù):
那個程序的可運(yùn)行機(jī)器碼的一個在存儲器的映像。 分配到的存儲器(通常包括虛擬內(nèi)存的一個區(qū)域)。存儲器的內(nèi)容包括可運(yùn)行代碼、特定于進(jìn)程的數(shù)據(jù)(輸入、輸出)、調(diào)用堆棧、堆棧(用于保存運(yùn)行時(shí)運(yùn)數(shù)中途產(chǎn)生的數(shù)據(jù))。 分配給該進(jìn)程的資源的操作系統(tǒng)描述符,諸如文件描述符(Unix 術(shù)語)或文件句柄(Windows)、數(shù)據(jù)源和數(shù)據(jù)終端。 安全特性,諸如進(jìn)程擁有者和進(jìn)程的權(quán)限集(可以容許的操作)。 處理器狀態(tài)(內(nèi)文),諸如寄存器內(nèi)容、物理存儲器尋址等。當(dāng)進(jìn)程正在運(yùn)行時(shí),狀態(tài)通常儲存在寄存器,其他情況在存儲器。
切換
Windows 和Windows Vista 體系結(jié)構(gòu)
進(jìn)行進(jìn)程切換就是從正在運(yùn)行的進(jìn)程中收回處理器,然后再使待運(yùn)行進(jìn)程來占用處理器。
這里所說的從某個進(jìn)程收回處理器,實(shí)質(zhì)上就是把進(jìn)程存放在處理器的寄存器中的中間數(shù)據(jù)找個地方存起來,從而把處理器的寄存器騰出來讓其他進(jìn)程使用。那么被中止運(yùn)行進(jìn)程的中間數(shù)據(jù)存在何處好呢?當(dāng)然這個地方應(yīng)該是進(jìn)程的私有堆棧。
讓進(jìn)程來占用處理器,實(shí)質(zhì)上是把某個進(jìn)程存放在私有堆棧中寄存器的數(shù)據(jù)(前一次本進(jìn)程被中止時(shí)的中間數(shù)據(jù))再恢復(fù)到處理器的寄存器中去,并把待運(yùn)行進(jìn)程的斷點(diǎn)送入處理器的程序指針PC,于是待運(yùn)行進(jìn)程就開始被處理器運(yùn)行了,也就是這個進(jìn)程已經(jīng)占有處理器的使用權(quán)了。
這就像多個同學(xué)要分時(shí)使用同一張課桌一樣,所謂要收回正在使用課桌同學(xué)的課桌使用權(quán),實(shí)質(zhì)上就是讓他把屬于他的東西拿走;而賦予某個同學(xué)課桌使用權(quán),只不過就是讓他把他的東西放到課桌上罷了。
在切換時(shí),一個進(jìn)程存儲在處理器各寄存器中的中間數(shù)據(jù)叫做進(jìn)程的上下文,所以進(jìn)程的 切換實(shí)質(zhì)上就是被中止運(yùn)行進(jìn)程與待運(yùn)行進(jìn)程上下文的切換。在進(jìn)程未占用處理器時(shí),進(jìn)程 的上下文是存儲在進(jìn)程的私有堆棧中的。
狀態(tài)
進(jìn)程的三個基本狀態(tài)
進(jìn)程執(zhí)行時(shí)的間斷性,決定了進(jìn)程可能具有多種狀態(tài)。事實(shí)上,運(yùn)行中的進(jìn)程可能具有以下三種基本狀態(tài)。
1)就緒狀態(tài)(Ready):
進(jìn)程已獲得除處理器外的所需資源,等待分配處理器資源;只要分配了處理器進(jìn)程就可執(zhí)行。就緒進(jìn)程可以按多個優(yōu)先級來劃分隊(duì)列。例如,當(dāng)一個進(jìn)程由于時(shí)間片用完而進(jìn)入就緒狀態(tài)時(shí),排入低優(yōu)先級隊(duì)列;當(dāng)進(jìn)程由I/O操作完成而進(jìn)入就緒狀態(tài)時(shí),排入高優(yōu)先級隊(duì)列。
2)運(yùn)行狀態(tài)(Running):
進(jìn)程占用處理器資源;處于此狀態(tài)的進(jìn)程的數(shù)目小于等于處理器的數(shù)目。在沒有其他進(jìn)程可以執(zhí)行時(shí)(如所有進(jìn)程都在阻塞狀態(tài)),通常會自動執(zhí)行系統(tǒng)的空閑進(jìn)程。
3)阻塞狀態(tài)(Blocked):
由于進(jìn)程等待某種條件(如I/O操作或進(jìn)程同步),在條件滿足之前無法繼續(xù)執(zhí)行。該事件發(fā)生前即使把處理機(jī)分配給該進(jìn)程,也無法運(yùn)行。
區(qū)別
程序
程序是指令和數(shù)據(jù)的有序集合,其本身沒有任何運(yùn)行的含義,是一個靜態(tài)的概念。而進(jìn)程是程序在處理機(jī)上的一次執(zhí)行過程,它是一個動態(tài)的概念。
程序可以作為一種軟件資料長期存在,而進(jìn)程是有一定生命期的。程序是永久的,進(jìn)程是暫時(shí)的。
進(jìn)程更能真實(shí)地描述并發(fā),而程序不能;
進(jìn)程是由進(jìn)程控制塊、程序段、數(shù)據(jù)段三部分組成;
進(jìn)程具有創(chuàng)建其他進(jìn)程的功能,而程序沒有。
同一程序同時(shí)運(yùn)行于若干個數(shù)據(jù)集合上,它將屬于若干個不同的進(jìn)程,也就是說同一程序可以對應(yīng)多個進(jìn)程。
在傳統(tǒng)的操作系統(tǒng)中,程序并不能獨(dú)立運(yùn)行,作為資源分配和獨(dú)立運(yùn)行的基本單元都是進(jìn)程。
線程
進(jìn)程和線程關(guān)系
通常在一個進(jìn)程中可以包含若干個線程,它們可以利用進(jìn)程所擁有的資源,在引入線程的操作系統(tǒng)中,通常都是把進(jìn)程作為分配資源的基本單位,而把線程作為獨(dú)立運(yùn)行和獨(dú)立調(diào)度的基本單位,由于線程比進(jìn)程更小,基本上不擁有系統(tǒng)資源,故對它的調(diào)度所付出的開銷就會小得多,能更高效的提高系統(tǒng)內(nèi)多個程序間并發(fā)執(zhí)行的程度。
上一年推出的通用操作系統(tǒng)都引入了線程,以便進(jìn)一步提高系統(tǒng)的并發(fā)性,并把它視為現(xiàn)代操作系統(tǒng)的一個重要指標(biāo)。
控制
進(jìn)程控制是進(jìn)程管理中最基本的功能。它用于創(chuàng)建一個新進(jìn)程,終止一個已完成的進(jìn)程,或者去終止一個因出現(xiàn)某事件而使其無法運(yùn)行下去的進(jìn)程,還可負(fù)責(zé)進(jìn)程運(yùn)行中的狀態(tài)轉(zhuǎn)換。
創(chuàng)建進(jìn)程
1.引起創(chuàng)建進(jìn)程的事件
在多道程序環(huán)境中,只有(作為)進(jìn)程(時(shí))才能在系統(tǒng)中運(yùn)行。因此,為使程序能運(yùn)行,就必須為它創(chuàng)建進(jìn)程。導(dǎo)致一個進(jìn)程去創(chuàng)建另一個進(jìn)程的典型事件,可以有以下四類:
1) 用戶登錄
在分時(shí)系統(tǒng)中,用戶在終端鍵入登錄命令后,如果是合法用戶,系統(tǒng)將為該終端建立一個進(jìn)程,并把它插入到就緒隊(duì)列中。
2)作業(yè)調(diào)度
在批處理系統(tǒng)中,當(dāng)作業(yè)調(diào)度程序按照一定的算法調(diào)度到某作業(yè)時(shí),便將該作業(yè)裝入到內(nèi)存,為它分配必要的資源,并立即為它創(chuàng)建進(jìn)程,再插入到就緒隊(duì)列中。
3) 提供服務(wù)
當(dāng)運(yùn)行中的用戶程序提出某種請求后,系統(tǒng)將專門創(chuàng)建一個進(jìn)程來提供用戶所需要的服務(wù),例如,用戶程序要求進(jìn)行文件打印,操作系統(tǒng)將為它創(chuàng)建一個打印進(jìn)程,這樣,不僅可以使打印進(jìn)程與該用戶進(jìn)程并發(fā)執(zhí)行,而且還便于計(jì)算出為完成打印任務(wù)所花費(fèi)的時(shí)間。
4) 應(yīng)用請求
在上述三種情況中,都是由系統(tǒng)內(nèi)核為它創(chuàng)建一個新進(jìn)程,而這一類事件則是基于應(yīng)用進(jìn)程的需求,由它創(chuàng)建一個新的進(jìn)程,以便使新進(jìn)程以并發(fā)的運(yùn)行方式完成特定任務(wù)。
2.進(jìn)程的創(chuàng)建過程
一旦操作系統(tǒng)發(fā)現(xiàn)了要求創(chuàng)建新進(jìn)程的事件后,便調(diào)用進(jìn)程創(chuàng)建原語Creat()按下述步驟創(chuàng)建一個新進(jìn)程。
1) 申請空白PCB。為新進(jìn)程申請獲得唯一的數(shù)字標(biāo)識符,并從PCB集合中索取一個空白PCB。
2) 為新進(jìn)程分配資源。為新進(jìn)程的程序和數(shù)據(jù)以及用戶棧分配必要的內(nèi)存空間。顯然,此時(shí)操作系統(tǒng)必須知道新進(jìn)程所需要的內(nèi)存大小。
3) 初始化進(jìn)程控制塊。PCB的初始化包括:
①初始化標(biāo)識信息,將系統(tǒng)分配的標(biāo)識符和父進(jìn)程標(biāo)識符,填入新的PCB中。
?、诔跏蓟幚頇C(jī)狀態(tài)信息,使程序計(jì)數(shù)器指向程序的入口地址,使棧指針指向棧頂。
?、鄢跏蓟幚頇C(jī)控制信息,將進(jìn)程的狀態(tài)設(shè)置為就緒狀態(tài)或靜止就緒狀態(tài),對于優(yōu)先級,通常是將它設(shè)置為最低優(yōu)先級,除非用戶以顯式的方式提出高優(yōu)先級要求。
4) 將新進(jìn)程插入就緒隊(duì)列,如果進(jìn)程就緒隊(duì)列能夠接納新進(jìn)程,便將新進(jìn)程插入到就緒隊(duì)列中。
進(jìn)程終止
1.引起進(jìn)程終止的事件
1)正常結(jié)束
在任何計(jì)算機(jī)系統(tǒng)中,都應(yīng)該有一個表示進(jìn)程已經(jīng)運(yùn)行完成的指示。例如,在批處理系統(tǒng)中,通常在程序的最后安排一條Hold指令或終止的系統(tǒng)調(diào)用。當(dāng)程序運(yùn)行到Hold指令時(shí),將產(chǎn)生一個中斷,去通知OS本進(jìn)程已經(jīng)完成。
2)異常結(jié)束
在進(jìn)程運(yùn)行期間,由于出現(xiàn)某些錯誤和故障而迫使進(jìn)程終止。這類異常事件很多,常見的有:越界錯誤,保護(hù)錯,非法指令,特權(quán)指令錯,運(yùn)行超時(shí),等待超時(shí),算術(shù)運(yùn)算錯,I/O故障。
3)外界干預(yù)
外界干預(yù)并非指在本進(jìn)程運(yùn)行中出現(xiàn)了異常事件,而是指進(jìn)程應(yīng)外界的請求而終止運(yùn)行。這些干預(yù)有:操作員或操作系統(tǒng)干預(yù),父進(jìn)程請求,父進(jìn)程終止。
2. 進(jìn)程的終止過程
如果系統(tǒng)發(fā)生了上述要求終止進(jìn)程的某事件后,OS便調(diào)用進(jìn)程終止原語,按下述過程去終止指定的進(jìn)程。
1)根據(jù)被終止進(jìn)程的標(biāo)識符,從PCB集合中檢索出該進(jìn)程的PCB,從中讀出該進(jìn)程狀態(tài)。
2)若被終止進(jìn)程正處于執(zhí)行狀態(tài),應(yīng)立即終止該進(jìn)程的執(zhí)行,并置調(diào)度標(biāo)志為真。用于指示該進(jìn)程被終止后應(yīng)重新進(jìn)行調(diào)度。
3)若該進(jìn)程還有子孫進(jìn)程,還應(yīng)將其所有子孫進(jìn)程予以終止,以防他們成為不可控的進(jìn)程。
4)將被終止的進(jìn)程所擁有的全部資源,或者歸還給其父進(jìn)程,或者歸還給系統(tǒng)。
5)將被終止進(jìn)程(它的PCB)從所在隊(duì)列(或鏈表)中移出,等待其它程序來搜集信息。
阻塞喚醒
1.引起進(jìn)程阻塞和喚醒的事件
1)請求系統(tǒng)服務(wù)
當(dāng)正在執(zhí)行的進(jìn)程請求操作系統(tǒng)提供服務(wù)時(shí),由于某種原因,操作系統(tǒng)并不立即滿足該進(jìn)程的要求時(shí),該進(jìn)程只能轉(zhuǎn)變?yōu)樽枞麪顟B(tài)來等待,一旦要求得到滿足后,進(jìn)程被喚醒。
2)啟動某種操作
當(dāng)進(jìn)程啟動某種操作后,如果該進(jìn)程必須在該操作完成之后才能繼續(xù)執(zhí)行,則必須先使該進(jìn)程阻塞,以等待該操作完成,該操作完成后,將該進(jìn)程喚醒。
3)新數(shù)據(jù)尚未到達(dá)
對于相互合作的進(jìn)程,如果其中一個進(jìn)程需要先獲得另一(合作)進(jìn)程提供的數(shù)據(jù)才能運(yùn)行以對數(shù)據(jù)進(jìn)行處理,則是要其所需數(shù)據(jù)尚未到達(dá),該進(jìn)程只有(等待)阻塞,等到數(shù)據(jù)到達(dá)后,該進(jìn)程被喚醒。
4)無新工作可做
系統(tǒng)往往設(shè)置一些具有某特定功能的系統(tǒng)進(jìn)程,每當(dāng)這種進(jìn)程完成任務(wù)后,便把自己阻塞起來以等待新任務(wù)到來,新任務(wù)到達(dá)后,該進(jìn)程被喚醒。
2.進(jìn)程阻塞過程
正在執(zhí)行的進(jìn)程,當(dāng)發(fā)現(xiàn)上述某事件后,由于無法繼續(xù)執(zhí)行,于是進(jìn)程便通過調(diào)用阻塞原語block把自己阻塞。可見,進(jìn)程的阻塞是進(jìn)程自身的一種主動行為。進(jìn)入block過程后,由于此時(shí)該進(jìn)程還處于執(zhí)行狀態(tài),所以應(yīng)先立即停止執(zhí)行,把進(jìn)程控制塊中的現(xiàn)行狀態(tài)由執(zhí)行改為阻塞,并將PCB插入阻塞隊(duì)列。如果系統(tǒng)中設(shè)置了因不同事件而阻塞的多個阻塞隊(duì)列,則應(yīng)將本進(jìn)程插入到具有相同事件的阻塞(等待)隊(duì)列。最后,轉(zhuǎn)調(diào)度程序進(jìn)行重新調(diào)度,將處理機(jī)分配給另一就緒進(jìn)程,并進(jìn)行切換,亦即,保留被阻塞進(jìn)程的處理機(jī)狀態(tài)(在PCB中),再按新進(jìn)程的PCB中的處理機(jī)狀態(tài)設(shè)置CPU環(huán)境。
3. 進(jìn)程喚醒過程
當(dāng)被阻塞的進(jìn)程所期待的事件出現(xiàn)時(shí),如I/O完成或者其所期待的數(shù)據(jù)已經(jīng)到達(dá),則由有關(guān)進(jìn)程(比如,用完并釋放了該I/O設(shè)備的進(jìn)程)調(diào)用喚醒原語wakeup(),將等待該事件的進(jìn)程喚醒。喚醒原語執(zhí)行的過程是:首先把被阻塞的進(jìn)程從等待該事件的阻塞隊(duì)列中移出,將其PCB中的現(xiàn)行狀態(tài)由阻塞改為就緒,然后再將該P(yáng)CB插入到就緒隊(duì)列中。
調(diào)度算法
進(jìn)程的調(diào)度算法包括:
FIFO(First Input First Output 先進(jìn)先出法)、
RR(時(shí)間片輪轉(zhuǎn)算法)、
?。℉PF)最高優(yōu)先級算法。
階段
進(jìn)程是由進(jìn)程控制塊、程序段、數(shù)據(jù)段三部分組成。一個進(jìn)程可以包含若干線程(Thread),線程可以幫助應(yīng)用程序同時(shí)做幾件事(比如一個線程向磁盤寫入文件,另一個則接收用戶的按鍵操作并及時(shí)做出反應(yīng),互相不干擾),在程序被運(yùn)行后,系統(tǒng)首先要做的就是為該程序進(jìn)程建立一個默認(rèn)線程,然后程序可以根據(jù)需要自行添加或刪除相關(guān)的線程。是可并發(fā)執(zhí)行的程序。在一個數(shù)據(jù)集合上的運(yùn)行過程,是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個獨(dú)立單位,也是稱活動、路徑或任務(wù),它有兩方面性質(zhì):活動性、并發(fā)性。進(jìn)程可以劃分為運(yùn)行、阻塞、就緒三種狀態(tài),并隨一定條件而相互轉(zhuǎn)化:就緒--運(yùn)行,運(yùn)行--阻塞,阻塞--就緒。
進(jìn)程為應(yīng)用程序的運(yùn)行實(shí)例,是應(yīng)用程序的一次動態(tài)執(zhí)行??此聘呱睿覀兛梢院唵蔚乩斫鉃椋核遣僮飨到y(tǒng)當(dāng)前運(yùn)行的執(zhí)行程序。在系統(tǒng)當(dāng)前運(yùn)行的執(zhí)行程序里包括:系統(tǒng)管理計(jì)算機(jī)個體和完成各種操作所必需的程序;用戶開啟、執(zhí)行的額外程序,當(dāng)然也包括用戶不知道,而自動運(yùn)行的非法程序(它們就有可能是病毒程序)。
內(nèi)容來自百科網(wǎng)