操作系統(tǒng)系列----進(jìn)程與程序
程序
1.程序的概念
程序是一組有序的指令集合
2.程序的執(zhí)行方式
在早期的單道批處理系統(tǒng)中端幼,程序的執(zhí)行方式是順序執(zhí)行矮慕,即在內(nèi)存僅僅轉(zhuǎn)入一道程序基矮,讓他獨占系統(tǒng)中的所有資源诸蚕。一個程序執(zhí)行完畢后另一個程序才能執(zhí)行某残,這種執(zhí)行效率極其低鄙信,而且十分浪費資源
而在多道程序處理系統(tǒng)中译荞,內(nèi)存中可以同時裝入多個程序瓤的,這多個程序可以共享資源,并發(fā)執(zhí)行吞歼,但是程序的并發(fā)執(zhí)行會導(dǎo)致一系列問題圈膏,所以才引入了進(jìn)程的概念
2.1什么是順序執(zhí)行
所謂順序執(zhí)行就是比如我們?nèi)ナ程门抨牬蝻垼懦梢涣辛嘘犖楦萋猓覀兛梢岳斫鉃橐粋€個程序稽坤,而打飯的阿姨可以理解為cpu桥帆,我們按照隊列一個個去打飯,而阿姨則按照順序一個個給我們打飯慎皱,一次只能給一個人打飯老虫,這就是順序執(zhí)行
2.1.1順序執(zhí)行時的特征
1.順序性:這個我們在上面已經(jīng)說過了,就是程序一個個執(zhí)行茫多,而且一次只可以執(zhí)行一個
2.封閉性:程序在執(zhí)行的時候占用整個計算機的資源祈匙,只有本程序能改變自己,這也可理解為一個封閉的環(huán)境天揖,因為整個計算機只有他一個程序在運行
3.可再現(xiàn)性:只要程序的執(zhí)行環(huán)境與初始條件相同夺欲,當(dāng)程序重復(fù)執(zhí)行的時候,獲得的都是相同的結(jié)果今膊,比如我們使用計算器算1+1等于2些阅,只要這個計算器沒壞,只要我們輸入的是1+1斑唬,那么結(jié)果就一定為2
2.2 程序的并發(fā)執(zhí)行
順序執(zhí)行的方式雖然十分方便市埋,但是效率實在是太低了,看看我們今天一邊聽歌一邊打游戲恕刘,這顯然不是順序執(zhí)行所能實現(xiàn)的缤谎。
多道程序技術(shù),即多個程序并發(fā)執(zhí)行褐着,多個程序并發(fā)執(zhí)行指的相互之間不存在前驅(qū)關(guān)系的程序才可以并發(fā)執(zhí)行坷澡,如果一個程序 依賴另
一個程序的執(zhí)行結(jié)果而執(zhí)行,那么這兩個程序顯然是不可以并發(fā)執(zhí)行的
程序并發(fā)執(zhí)行時的特征
我們可以思考含蓉,在并發(fā)執(zhí)行中频敛,系統(tǒng)的吞吐量和執(zhí)行效率雖然不斷提高了,但是他們在共享系統(tǒng)資源的時候馅扣,以及他們在為了實現(xiàn)同一個目的而合作的時候斟赚,他們之間必然會形成相互制約的關(guān)系。這時候程序就具備了許多新特性
間斷性
程序并發(fā)執(zhí)行時岂嗓,由于它們共享系統(tǒng)資源汁展,以及為完成同一項任務(wù)而相互合作,致使在這些并發(fā)執(zhí)行的程序之間形成了互相制約的關(guān)系:并發(fā)程序具有“執(zhí)行--暫停--執(zhí)行”的間斷性的活動規(guī)律厌殉。
失去封閉性
這個就很好理解了食绿,在順序執(zhí)行中整個計算機的資源都被一個程序所占用,但是在并發(fā)執(zhí)行中公罕,系統(tǒng)的資源被各個程序所共享器紧,這也就導(dǎo)致程序的狀態(tài)不再由自身決定,會受到其他程序的影響
失去可再現(xiàn)性
程序在并發(fā)執(zhí)行的過程中失去了封閉性楼眷,铲汪,也導(dǎo)致程序失去可再現(xiàn)性
兩個循環(huán)程序A和B熊尉,它們共享一個變量N。
程序A每執(zhí)行一次時掌腰,都要做N=N+1操作狰住;
程序B每執(zhí)行一次時,都要做執(zhí)行Print(N)操作齿梁,之后執(zhí)行N=0操作催植;
A、B以不同的速度運行勺择,則可能出現(xiàn)下述3種情況(假設(shè)某時刻變量N的值為n)
n+1,n+1,0
n,n+1,0
n,0,n+1
進(jìn)程
為什么引入進(jìn)程创南?進(jìn)程的作用是什么?
在多道程序環(huán)境下省核,程序的執(zhí)行屬于并發(fā)執(zhí)行稿辙,此時它們將失去其封閉性,并具有間斷性及不可再現(xiàn)性的特征气忠。這決定了通常的程序是不能參與并發(fā)執(zhí)行的邻储,因為程序執(zhí)行的結(jié)果是不可再現(xiàn)的,程序的運行也就失去了意義笔刹。
所以為了使并發(fā)執(zhí)行的每個程序能夠獨立的運行芥备,所以操作系統(tǒng)就為之配備了一個專屬的數(shù)據(jù)結(jié)構(gòu)冬耿,稱為進(jìn)程控制模塊(PCB Process C ontrol Bolck),這樣子程序段舌菜,相關(guān)的數(shù)據(jù)段進(jìn)程和PCB三部分就構(gòu)成了進(jìn)程實體。一般情況下我們把進(jìn)程實體稱為進(jìn)程亦镶,而創(chuàng)建進(jìn)程的實質(zhì)就是創(chuàng)建進(jìn)程實體中的PCM日月,而撤銷進(jìn)程就是撤銷進(jìn)程中的PCB
這是因為并發(fā)執(zhí)行的程序(即進(jìn)程)是“停停走走”地執(zhí)行,只有在為它創(chuàng)建進(jìn)程后缤骨,在它停下時爱咬,方能將其現(xiàn)場信息保存在它的PCB中,待下次被調(diào)度執(zhí)行時绊起,再從PCB中恢復(fù)CPU現(xiàn)場并繼續(xù)執(zhí)行精拟,而傳統(tǒng)的程序卻無法滿足上述要求。
建立進(jìn)程所帶來的好處是使多個程序能并發(fā)執(zhí)行虱歪,這極大地提高了資源利用率和系統(tǒng)吞吐量蜂绎。但管理進(jìn)程也需付出一定的代價,包括進(jìn)程控制塊及協(xié)調(diào)各運行機構(gòu)所占用的內(nèi)存空間開銷笋鄙,以及為進(jìn)行進(jìn)程間的切換师枣、同步及通信等所付出的時間開銷。
進(jìn)程的相關(guān)定義:
1.進(jìn)程是程序的一次執(zhí)行
2.進(jìn)程是一個程序及其數(shù)據(jù)在處理及順序執(zhí)行時所發(fā)生的活動
3.進(jìn)程是一個獨立功能的程序在數(shù)據(jù)集合上運行的過程萧落,進(jìn)程是系統(tǒng)資源分配和調(diào)度的基本單位
PCB概念及其功能
為了便于系統(tǒng)描述和管理進(jìn)程的運行践美,在OS中專門為每個進(jìn)程專門定義了一個數(shù)據(jù)結(jié)構(gòu)---進(jìn)程控制塊PCB(Process Control Block)
PCB記錄了當(dāng)前情況以及管理進(jìn)程運行運行的全部信息洗贰,是操作系統(tǒng)中最重要的記錄型數(shù)據(jù)結(jié)構(gòu)
作用
使在多道程序環(huán)境下不能獨立運行的程序(含數(shù)據(jù))成為一個能運行的基本單位,一個能與其他進(jìn)程并發(fā)執(zhí)行的進(jìn)程
1.作為獨立運行的基本標(biāo)志陨倡,敛滋,當(dāng)系統(tǒng)創(chuàng)建進(jìn)程時就為他創(chuàng)建一個PCB,當(dāng)結(jié)束時收回其PCB,進(jìn)程也隨之消亡,PCB已經(jīng)成為進(jìn)程存在系統(tǒng)中的唯一標(biāo)識
2.能實現(xiàn)間斷性運行方式兴革。在多道程序環(huán)境下矛缨,程序采用的是走走停停的方式運行的,當(dāng)進(jìn)程由于阻塞而停止運行的時候帖旨,系統(tǒng)將CPU現(xiàn)場保留在被中斷進(jìn)程的CPU中箕昭,當(dāng)該進(jìn)程再次被調(diào)度的時候,就可以恢復(fù)CPU現(xiàn)場解阅,而傳統(tǒng)意義的靜態(tài)程序不具備保留現(xiàn)場的能力落竹,無法保留結(jié)果的可再現(xiàn)性,從而失去運行的意義
3.提供進(jìn)程管理所需的信息货抄。操作系統(tǒng)總是根據(jù)PCB實施對進(jìn)程的控制和管理述召,調(diào)度程序調(diào)度到程序運行的時候,只能根據(jù)PCB中記錄的程序和數(shù)據(jù)在內(nèi)存或外存中的始址指針蟹地,找到對應(yīng)的程序和數(shù)據(jù)积暖,還可根據(jù)資源清單中的數(shù)據(jù)了解到該進(jìn)程所需的全部資源
4.提供進(jìn)程調(diào)度所需的信息。只有處于就緒狀態(tài)的程序才可以被調(diào)度執(zhí)行怪与,而在PCB中就提供了進(jìn)程處理哪種狀態(tài)的信息夺刑。還有進(jìn)程的優(yōu)先級,甚至是進(jìn)程的等待時間和已執(zhí)行時間分别。
5.實現(xiàn)與其他進(jìn)程的同步與通信遍愿。進(jìn)程同步機制是用于實現(xiàn),諸進(jìn)程的協(xié)調(diào)運行耘斩,在采用信號量機制的時候沼填,他要求每個進(jìn)程中都設(shè)置相應(yīng)的用于同步的信號量
進(jìn)程的特征
動態(tài)性
由創(chuàng)建而生,由調(diào)度而執(zhí)行括授,由撤銷而消亡坞笙,進(jìn)程是有生命周期的,而程序是一組有序的指令集合荚虚,存放于某種介質(zhì)上(硬盤)薛夜,是靜態(tài)的,沒有活動意義
并發(fā)性
引入進(jìn)程的目的就是為了解決程序并發(fā)執(zhí)行所導(dǎo)致的問題曲管,却邓,程序是沒有PCB的,不能參與獨立并發(fā)執(zhí)行
獨立性
進(jìn)程是系統(tǒng)分配資源與調(diào)度的基本單位院水,他自然也是一個可獨立運行的基本單位腊徙,凡是沒有建立PCB的程序都不可以作為一個獨立的單位運行
異步性:
實質(zhì)程序按照異步的方式運行简十,即按各自獨立的不可預(yù)知的速度向前,也正是由于這點撬腾,才導(dǎo)致了傳統(tǒng)意義上的程序如果參與并發(fā)執(zhí)行會導(dǎo)致結(jié)果的不可再現(xiàn)性螟蝙,為了使程序在運行的時候有異步性當(dāng)是同時也保證程序并發(fā)執(zhí)行的結(jié)果是可再現(xiàn)的,這才引入了進(jìn)程并配備了進(jìn)程同步機制
進(jìn)程的狀態(tài)
就緒
進(jìn)程已經(jīng)處于準(zhǔn)備好運行的狀態(tài)民傻,即進(jìn)程已經(jīng)分配到了除了cpu以外的所有資源胰默,只要再獲取cpu即可立即執(zhí)行,系統(tǒng)中有許多處于就緒的進(jìn)程漓踢,系統(tǒng)會按照優(yōu)先級排成一個優(yōu)先級隊列
執(zhí)行
即進(jìn)程已經(jīng)獲取了CPU,程序正在執(zhí)行狀態(tài)牵署,,在單處理機中只要一個程序處于執(zhí)行狀態(tài)喧半,而在多處理機中有多個程序處于執(zhí)行狀態(tài)
阻塞
當(dāng)正在執(zhí)行的程序發(fā)生了某個事件(IO請求奴迅,申請緩存區(qū)失敗等等),這時候系統(tǒng)就會把處理機分配給另一個就緒進(jìn)程挺据,而該進(jìn)程就進(jìn)入阻塞狀態(tài)取具,主色狀態(tài)的進(jìn)程也會構(gòu)成一個阻塞隊列,根據(jù)阻塞原因的不同還會構(gòu)成多個阻塞隊列扁耐。
創(chuàng)建狀態(tài)與等待狀態(tài)
創(chuàng)建狀態(tài)
進(jìn)程由創(chuàng)建而生暇检,創(chuàng)建進(jìn)程是一個很復(fù)雜的過程
創(chuàng)建步驟
進(jìn)程申請一個空白的PCB,并向PCB中加入控制和管理進(jìn)程的信息,讓后為該進(jìn)程分配所需資源婉称,然后把進(jìn)程插入就緒隊列中
如果為該進(jìn)程分配的資源尚未得到滿足块仆,比如系統(tǒng)的內(nèi)存不夠把進(jìn)程插入其中,則此時經(jīng)常就不能被調(diào)度運行酿矢,仍然處于創(chuàng)建狀態(tài)
這是為了確保對進(jìn)程控制的完整性榨乎,同時創(chuàng)建進(jìn)程的引入也增加了管理的靈活性。OS可以根據(jù)系統(tǒng)性能或主存容量的限制推遲新進(jìn)程的提交
終止?fàn)顟B(tài)
步驟
1.等待操作系統(tǒng)的進(jìn)行善后處理瘫筐,最后將其PCB清零,并將PCB返還給系統(tǒng)铐姚。
終止的原因:
1.到達(dá)自然的結(jié)束點策肝,即程序執(zhí)行完畢
2.被操作系統(tǒng)終結(jié)
3.被有其他終止權(quán)的程序終結(jié)
進(jìn)入終止?fàn)顟B(tài)的程序不再執(zhí)行,但是操作系統(tǒng)中仍然保留一個記錄隐绵,保存狀態(tài)碼和一些計時統(tǒng)計數(shù)據(jù)之众,給其他進(jìn)程收集,提取完成后依许,操作系統(tǒng)刪除該進(jìn)程棺禾,并將PCB清零,將空白PCB返還給系統(tǒng)
掛起狀態(tài)與進(jìn)程狀態(tài)的切換
掛起:即讓程序暫時停止運行峭跳,處于靜止?fàn)顟B(tài)膘婶,如果程序正在執(zhí)行他將暫停執(zhí)行缺前,如果程序原本就處于就緒狀態(tài),則該進(jìn)程暫時不接受調(diào)度悬襟。掛起操作會把進(jìn)程從內(nèi)存轉(zhuǎn)入外存衅码。
為什么引入掛起操作
1.負(fù)荷調(diào)節(jié)的需要,當(dāng)實時系統(tǒng)中的工作負(fù)荷較重的時候脊岳,已可能影響到對實時任務(wù)的控制時逝段,為了讓系統(tǒng)正常運行就會掛起某些不重要的進(jìn)程
2.操作系統(tǒng)的需要,操作系統(tǒng)有時候希望掛起某些進(jìn)程割捅,以便檢查運行中的資源使用情況
3.父進(jìn)程的請求奶躯,有時候父進(jìn)程希望掛起自己的某個子進(jìn)程,以便考察和修改該子進(jìn)程或則協(xié)調(diào)個各進(jìn)程之間的活動
4.終端用戶的需要亿驾,當(dāng)終端用戶發(fā)現(xiàn)自己的程序在運行期間有問題巫糙,希望暫停程序的運行,就讓他先停下來颊乘,以便考察其執(zhí)行情況参淹,并對其做修改
引入掛起原語Suspend操作后和激活原語Active后,在他們的作用下乏悄,進(jìn)程將可能發(fā)生一下幾種狀態(tài)的切換浙值,
1.活動就緒------>靜止就緒,當(dāng)進(jìn)程處于未掛起的就緒狀態(tài)時檩小,此成此活動就緒狀態(tài)表示為Readya开呐,此時的進(jìn)程可以接受調(diào)度,而使用掛起原語Suspend將進(jìn)程掛起后,進(jìn)程就變?yōu)殪o止就緒狀態(tài)末早,表示為Readys奥秆。此時的進(jìn)程不接受調(diào)度
2.活動阻塞-->靜止阻塞,當(dāng)進(jìn)程處于未被掛起的阻塞狀態(tài)的時候 瓦戚,稱它為活動阻塞,表示為Blockeda丛塌,當(dāng)使用Suspend原語掛起后较解,進(jìn)程就轉(zhuǎn)換為靜止阻塞狀態(tài),處于該進(jìn)程轉(zhuǎn)狀態(tài)的某個事件出現(xiàn)后赴邻,該進(jìn)程就由靜止阻塞狀態(tài)轉(zhuǎn)為靜止就緒狀態(tài)
3.靜止就緒---->活動就緒印衔,處于Readys狀態(tài)的進(jìn)程使用Active激活后,該進(jìn)程就變?yōu)榛顒泳途w狀態(tài)姥敛,即由Readys轉(zhuǎn)為Readya
4.靜止阻塞------>活動阻塞奸焙,處于Blockeds狀態(tài)的進(jìn)程使用激活原語Active激活后,進(jìn)程將轉(zhuǎn)換為Blockeda(活動阻塞)狀態(tài)
圖一:
圖二:
1.NULL---->創(chuàng)建,當(dāng)一個新進(jìn)程產(chǎn)生時与帆,該進(jìn)程處于創(chuàng)建狀態(tài)了赌,
2.創(chuàng)建--->活動就緒,當(dāng)前系統(tǒng)的性能和內(nèi)存容量都允許的時候鲤桥,完成對進(jìn)程創(chuàng)建的必要操作后揍拆,相應(yīng)的系統(tǒng)進(jìn)程將系統(tǒng)的狀態(tài)轉(zhuǎn)為活動就緒狀態(tài)
3.創(chuàng)建--->靜止就緒,考慮到當(dāng)前系統(tǒng)的資源狀況與性能要求茶凳,不分配給新建進(jìn)程所需資源嫂拴,。相應(yīng)的進(jìn)程狀態(tài)轉(zhuǎn)為靜止就緒狀態(tài)安放于外存
4.執(zhí)行--->終止贮喧,當(dāng)一個進(jìn)程已經(jīng)完成任務(wù)的時候筒狠,,或者出現(xiàn)了無法克服的錯誤箱沦,或者被其他進(jìn)程終結(jié)辩恼,則轉(zhuǎn)為終止?fàn)顟B(tài)
進(jìn)程控制塊PCB(Process Control Block)
1.進(jìn)程控制塊的組織方式
1.1線性方式,即所有PCB保留在一張線性表中
優(yōu)點:開銷小谓形,實現(xiàn)簡單
缺點:每次掃描都需要掃描整張表
2.鏈接方式灶伊,把具有相同狀態(tài)進(jìn)程的PCB分別通過PCB中的鏈接關(guān)鍵字鏈接成一個隊列,從而形成就緒隊列寒跳、阻塞隊列聘萨、運行隊列等。
3. 索引方式:系統(tǒng)根據(jù)進(jìn)程狀態(tài)的不同建立幾張索引表童太,米辐,并把各索引表在內(nèi)存的首地址記錄在內(nèi)存的一些專用單元中系統(tǒng)按照進(jìn)程的狀態(tài)分別建立就緒索引表、阻塞索引表等书释。
2.進(jìn)調(diào)度所需的信息
1.進(jìn)程的優(yōu)先級
2.進(jìn)程進(jìn)入阻塞狀態(tài)的原因
3.進(jìn)程檔當(dāng)前的狀態(tài)
4.進(jìn)程調(diào)度所需的其他信息
3.進(jìn)程控制信息
1.進(jìn)程的同步與通信機制
2.程序和數(shù)據(jù)的地址
3.資源清單
4.鏈接指針翘贮,他給出了本進(jìn)程(PCB)在所在隊列的下一個進(jìn)程的PCB的首地址