3.1進(jìn)程
3.1.1
在進(jìn)程執(zhí)行時(shí)虹脯,任意給定一個(gè)時(shí)間蔫慧,進(jìn)程都包含如下信息:
- 標(biāo)識(shí)符
進(jìn)程id,用于區(qū)別其他進(jìn)程 - 狀態(tài)
進(jìn)程的運(yùn)行態(tài) - 優(yōu)先級(jí)
相對(duì)于其他進(jìn)程的優(yōu)先級(jí) - 程序計(jì)數(shù)器
程序中江北執(zhí)行的下一跳指令地址 - 內(nèi)存指針
包含程序代碼和進(jìn)程相關(guān)數(shù)據(jù)的指針备埃,還有其他進(jìn)程共享內(nèi)存塊的指針 - 上下文數(shù)據(jù)
程序執(zhí)行是處理器的寄存器中的數(shù)據(jù) - IO狀態(tài)信息
包含顯式的IO請(qǐng)求节槐,分配給進(jìn)程的IO設(shè)備和被晉城市用的文件列表 - 記賬信息
可能包含處理器綜合,使用的時(shí)鐘總和锯仪,時(shí)間限制疯汁,記賬號(hào)
上述信息被存放在一個(gè)成為程序控制塊PCB中。
進(jìn)程控制塊張包含了陳芬的信息卵酪,進(jìn)程控制塊能夠支持多進(jìn)程和提供多重處理技術(shù)的關(guān)鍵工具。
3.2進(jìn)程狀態(tài)
3.2.1兩狀態(tài)進(jìn)程模型
在任何時(shí)刻進(jìn)程或者正在執(zhí)行谤碳,或者沒(méi)有執(zhí)行溃卡。一個(gè)進(jìn)程可以出于一下兩種狀態(tài)之一:運(yùn)行態(tài)或未運(yùn)行太(還有其他狀態(tài))
當(dāng)操作系統(tǒng)創(chuàng)建一個(gè)新進(jìn)程時(shí),將該進(jìn)程以未運(yùn)行太加入到系統(tǒng)中蜒简,操作系統(tǒng)指導(dǎo)這個(gè)進(jìn)程的存在瘸羡,并正在等待執(zhí)行機(jī)會(huì)。
3.2.2進(jìn)程創(chuàng)建和終止
進(jìn)程的創(chuàng)建
當(dāng)一個(gè)新進(jìn)程被添加到那些正在被管理的進(jìn)城集合中區(qū)搓茬,操作系統(tǒng)需要建立用于管理該進(jìn)程的數(shù)據(jù)結(jié)構(gòu)犹赖,并在內(nèi)存中給他分配地址空間。
一下四種情況會(huì)導(dǎo)致進(jìn)程創(chuàng)建
- 新的批處理作業(yè)
位于磁帶或磁盤(pán)中的批處理作業(yè)控制流被提供給操作系統(tǒng) - 用戶登錄
終端用戶登錄到系統(tǒng) - 操作系統(tǒng)因?yàn)樘峁┮豁?xiàng)服務(wù)而創(chuàng)建
表示用戶執(zhí)行一個(gè)功能 - 由現(xiàn)有進(jìn)程派生
用戶程序只是創(chuàng)建多個(gè)進(jìn)程卷仑。
當(dāng)操作系統(tǒng)相應(yīng)一個(gè)進(jìn)程顯式的請(qǐng)求創(chuàng)建一個(gè)新進(jìn)程時(shí)峻村,該動(dòng)作成為進(jìn)程派生。
此時(shí)有父子進(jìn)程產(chǎn)生
進(jìn)程終止
進(jìn)程終止的原因有:
- 正常完成
進(jìn)程自行執(zhí)行一個(gè)操作系統(tǒng)服務(wù)調(diào)用锡凝,exec族粘昨,表示它已經(jīng)結(jié)束運(yùn)行 - 超過(guò)時(shí)限
進(jìn)程運(yùn)行時(shí)間超過(guò)規(guī)定的時(shí)限
包括總的運(yùn)行時(shí)間,花費(fèi)在執(zhí)行上的時(shí)間窜锯, - 無(wú)可用內(nèi)存
系統(tǒng)無(wú)法滿足進(jìn)程需要的內(nèi)存空間 - 越界
進(jìn)程試圖訪問(wèn)不允許訪問(wèn)的內(nèi)存單元 - 保護(hù)錯(cuò)誤
進(jìn)程試圖使用不孕不育的資源或文件张肾,或者試圖以一種不正確的方式使用,向只讀文件中寫(xiě)入 - 算數(shù)錯(cuò)誤
如除0或存儲(chǔ)大于硬件可以接納的數(shù)子 - 時(shí)間超出
進(jìn)程等待某一事件發(fā)生的時(shí)間超過(guò)了規(guī)定的最大值
8.IO失敗
在輸出或輸入期間發(fā)生錯(cuò)誤锚扎。
找不到指定文件吞瞪,或者嘗試多次以后仍然讀寫(xiě)失敗或者無(wú)效操作,例如從打印機(jī)中讀取數(shù)據(jù) - 無(wú)效指令
司徒執(zhí)行一個(gè)不存在的指令 - 特權(quán)指令
試圖使用未操作系統(tǒng)保留的指令 - 數(shù)據(jù)無(wú)用
錯(cuò)誤類型或?yàn)槌跏蓟囊粔K數(shù)據(jù) - 操作員或操作系統(tǒng)干涉
由于某些原因驾孔,操作員終止進(jìn)程 - 父進(jìn)程終止
當(dāng)父進(jìn)程終止芍秆,操作系統(tǒng)可能終止進(jìn)程的所有子進(jìn)程 - 父進(jìn)程請(qǐng)求
父進(jìn)程終止其后代惯疙,或者是其他進(jìn)程終止別的進(jìn)程
3.2.3 五狀態(tài)模型
無(wú)狀態(tài):
- 運(yùn)行態(tài)
該進(jìn)程正在執(zhí)行 - 就緒態(tài)
進(jìn)程做好了準(zhǔn)備,只要有機(jī)會(huì)就開(kāi)始執(zhí)行 - 阻塞等待態(tài)
進(jìn)程在等待某事件浪听,例如IO操作 - 新建態(tài)
剛創(chuàng)建的進(jìn)城螟碎,操作系統(tǒng)還沒(méi)有把他加入到可執(zhí)行進(jìn)程組中。通常是進(jìn)程快已經(jīng)創(chuàng)建但是還沒(méi)有加載金內(nèi)存中的新進(jìn)程
5.退出態(tài)
操作系統(tǒng)可從執(zhí)行進(jìn)程組中釋放出的進(jìn)程
或是終止迹栓,或是被取消掉分。
處于新建態(tài)是,操作系統(tǒng)所需要的關(guān)于該進(jìn)程的信息保存在內(nèi)存的進(jìn)程表中克伊,但是進(jìn)程本身還未進(jìn)入內(nèi)存酥郭,也就是進(jìn)程的程序代碼不在內(nèi)存中,操作系統(tǒng)也沒(méi)有為這個(gè)程序相關(guān)的數(shù)據(jù)分配空間愿吹。代碼和數(shù)據(jù)保存在磁盤(pán)中
狀態(tài)轉(zhuǎn)換
- 空->新建
穿件一個(gè)新進(jìn)程 - 新建->就緒
操作系統(tǒng)準(zhǔn)備好在接納一個(gè)晉城市不从,吧一個(gè)進(jìn)程從新建態(tài)轉(zhuǎn)換到就緒態(tài)。 - 就緒->運(yùn)行
需要選擇一個(gè)新進(jìn)程運(yùn)行時(shí)犁跪,操作系統(tǒng)選擇一個(gè)處于就緒態(tài)的進(jìn)城椿息。
由調(diào)度器或分配器工作。 - 運(yùn)行->退出
如果當(dāng)前運(yùn)行進(jìn)程表示自己已完成或取消坷衍,他將被操作系統(tǒng)終止寝优。 - 運(yùn)行->就緒
正在運(yùn)行的進(jìn)程達(dá)到了允許不中斷執(zhí)行的最大時(shí)間段。也就是一個(gè)進(jìn)程達(dá)到了該進(jìn)程被分配的運(yùn)行時(shí)間枫耳。 - 運(yùn)行->阻塞
進(jìn)程請(qǐng)求他必須等待某些事件時(shí)乏矾,則進(jìn)入阻塞太。 - 阻塞->就緒
當(dāng)?shù)却臅r(shí)間發(fā)生時(shí)迁杨,處于阻塞態(tài)的進(jìn)城轉(zhuǎn)換到了就緒態(tài) - 就緒->退出
父進(jìn)程可以再任何時(shí)刻終止一個(gè)子進(jìn)程 - 阻塞->退出
同上
3.2.4被掛起的進(jìn)程
交換
沒(méi)有使用虛擬內(nèi)存的操作系統(tǒng)的進(jìn)城都必須全部載入內(nèi)存钻心,所有進(jìn)程必須都在內(nèi)存中。
為了能夠容納更多進(jìn)程:
- 增加內(nèi)存
但是相對(duì)的進(jìn)程增加速度更加快 - 交換
把內(nèi)存中某個(gè)進(jìn)程的一部分或全部移動(dòng)到磁盤(pán)中铅协,當(dāng)內(nèi)存中沒(méi)有處于就緒狀態(tài)的晉城市捷沸,操作系統(tǒng)就把被阻塞的進(jìn)城換出到磁盤(pán)中的掛起隊(duì)列中,暫時(shí)保存從內(nèi)存中被驅(qū)逐出來(lái)的進(jìn)程隊(duì)列狐史,或者是被掛起的進(jìn)程隊(duì)列亿胸。
操作系統(tǒng)在此后取出掛起隊(duì)列中的另一個(gè)進(jìn)城或僅售一個(gè)新進(jìn)程的請(qǐng)求,將其納入內(nèi)存運(yùn)行预皇。
交換是一個(gè)IO操作侈玄,因此可能是問(wèn)題更加惡化。由于換出到的磁盤(pán)一般是系統(tǒng)中運(yùn)行最快的IO設(shè)備吟温,因此會(huì)提高性能序仙。
因此模型再加入掛起態(tài)。
一個(gè)掛起態(tài)模型
兩個(gè)掛起態(tài)進(jìn)程
這種模型中鲁豪,新建進(jìn)程可能直接掛起潘悼,也可能就緒律秃。
因此就多了兩個(gè)狀態(tài)。
- 阻塞->掛起/掛起
當(dāng)操作系統(tǒng)確定正在運(yùn)行的進(jìn)程需要更多內(nèi)存空間或是為了維護(hù)基本性能治唤,會(huì)出現(xiàn)這種轉(zhuǎn)換棒动。 - 阻塞/掛起->就緒/掛起
如果程序阻塞的事件發(fā)生了,就被轉(zhuǎn)化為就緒掛起 - 就緒/掛起->就緒
內(nèi)存中沒(méi)有就就緒態(tài)進(jìn)程宾添,操作系統(tǒng)需要調(diào)入一個(gè)進(jìn)程繼續(xù)執(zhí)行船惨。
就緒/掛起態(tài)進(jìn)程比任何出于就緒態(tài)的任何進(jìn)程優(yōu)先級(jí)都要高的時(shí)候 - 就緒->就緒/掛起
當(dāng)掛起阻塞進(jìn)程仍然不夠內(nèi)存時(shí),就掛起就緒進(jìn)程缕陕。 - 新建->就緒/掛起 和 新建->就緒
當(dāng)內(nèi)存中沒(méi)有足夠的內(nèi)存粱锐,那么需要進(jìn)入就緒/掛起狀態(tài) - 阻塞/掛起->阻塞
一個(gè)進(jìn)程終止,釋放了內(nèi)存空間扛邑,阻塞/掛起隊(duì)列中的優(yōu)先級(jí)比其他進(jìn)程優(yōu)先級(jí)都搞怜浅,那么就發(fā)生此狀態(tài)轉(zhuǎn)換 - 運(yùn)行->就緒/掛起
當(dāng)分配給一個(gè)進(jìn)程的時(shí)間期滿時(shí),就發(fā)生這個(gè)轉(zhuǎn)換蔬崩。
因此恶座,進(jìn)程如果從就緒到掛起,是因?yàn)閮?nèi)存不夠沥阳。如果從阻塞/掛起到阻塞是因?yàn)閮?yōu)先級(jí)跨琳。
掛起進(jìn)程概念與不在內(nèi)存中的進(jìn)程概念是等價(jià)的。
當(dāng)如下特點(diǎn)是會(huì)掛起進(jìn)程:
- 進(jìn)程不能立即執(zhí)行
- 進(jìn)程在等待一個(gè)時(shí)間沪袭,阻塞時(shí)間的發(fā)生不會(huì)是進(jìn)程立即被執(zhí)行
- 為了阻止一個(gè)進(jìn)程的執(zhí)行,可以通過(guò)代理把進(jìn)程置于掛起狀態(tài)樟氢。
- 除非代理顯式的命令系統(tǒng)進(jìn)行狀態(tài)轉(zhuǎn)換冈绊,否則進(jìn)程一直在代理中
通過(guò)掛起程序,程序員可以修改程序或數(shù)據(jù)埠啃,進(jìn)行調(diào)試死宣。
導(dǎo)致進(jìn)程被掛起的原因:
- 交換
需要是房租購(gòu)的內(nèi)存空間 - 其他os原因
操作系統(tǒng)可能掛起后臺(tái)進(jìn)程或工具程序進(jìn)程 - 交互式用戶請(qǐng)求
用戶掛起程序,進(jìn)行調(diào)試或與一個(gè)資源的使用進(jìn)行連接 - 定時(shí)
一個(gè)進(jìn)程可能會(huì)周期執(zhí)行碴开,而且可能在等待下一個(gè)時(shí)間間隔被掛起 - 父進(jìn)程請(qǐng)求
父進(jìn)程掛起子進(jìn)程毅该,然后修改掛起進(jìn)程
3.3進(jìn)程描述
操作系統(tǒng)為處理器執(zhí)行進(jìn)程,而且進(jìn)行調(diào)度和分配資源潦牛,并相應(yīng)用戶程序的基本服務(wù)請(qǐng)求眶掌。
操作系統(tǒng)是管理系統(tǒng)資源的實(shí)體。
操作系統(tǒng)的控制結(jié)構(gòu)
操作系統(tǒng)構(gòu)造并維護(hù)它所管理的每個(gè)實(shí)體的信息表:
- 內(nèi)存
- IO
- 文件
- 進(jìn)程
內(nèi)存表
用于更總內(nèi)存(物理內(nèi)存)和外存巴碗。內(nèi)存的某些部分為操作系統(tǒng)保修朴爬,剩余部分是進(jìn)程可以使用的。保存在虛擬內(nèi)存中的進(jìn)程使用頁(yè)進(jìn)行簡(jiǎn)單的交換橡淆。
內(nèi)存表包含:
- 分配給進(jìn)程的內(nèi)存
- 分配給進(jìn)程的外存
- 內(nèi)存塊或虛擬內(nèi)存的任何保護(hù)屬性召噩,例如共享內(nèi)存區(qū)域
- 管理虛擬內(nèi)存所需要的任何信息
IO表
用于管理計(jì)算機(jī)系統(tǒng)內(nèi)的IO設(shè)備和通道母赵,在任何給定的時(shí)刻,一個(gè)IO設(shè)備或是可用的具滴,或者是已經(jīng)分配給某個(gè)特定的進(jìn)城凹嘲。
文件表
提供關(guān)于文件是否存在,文件在外存(磁盤(pán))中的作用构韵,當(dāng)前狀態(tài)和其他屬性的信息周蹭。
進(jìn)程表
后面詳細(xì)講
3.3.2 進(jìn)程控制結(jié)構(gòu)
操作系統(tǒng)管理和控制進(jìn)城,需要知道進(jìn)城的位置贞绳,和屬性谷醉。
進(jìn)程位置
一個(gè)進(jìn)程至少包括足夠內(nèi)存空間,用來(lái)保存該進(jìn)程的代碼和數(shù)據(jù)冈闭,還有棧椌隳幔空間,還有進(jìn)程的屬性萎攒。通常的屬性集合稱為進(jìn)程控制塊PCB遇八。
程序、數(shù)據(jù)耍休、棧刃永、屬性的集合稱為進(jìn)程映像。
進(jìn)程映像包括:
- 用戶數(shù)據(jù)
用戶空間中可修改的部分:程序數(shù)據(jù)羊精,用戶棧斯够,可修改的程序 - 用戶程序
將被執(zhí)行的程序,代碼 - 系統(tǒng)棧
每個(gè)進(jìn)程有一個(gè)或多個(gè)系統(tǒng)棧喧锦,用于保存參數(shù)读规,過(guò)程調(diào)用地址和系統(tǒng)調(diào)用地址。 - 進(jìn)程控制塊
操作系統(tǒng)控制進(jìn)程所需要的數(shù)據(jù)
進(jìn)程屬性
進(jìn)程屬性的集合稱為進(jìn)程塊
包括:
進(jìn)程標(biāo)志信息燃少,進(jìn)程控制信息束亏,進(jìn)程狀態(tài)信息。
進(jìn)程標(biāo)志信息
- 標(biāo)識(shí)符
進(jìn)程的標(biāo)識(shí)符阵具,創(chuàng)建該進(jìn)程的父進(jìn)程碍遍,用戶標(biāo)識(shí)符(userID)
處理器狀態(tài)信息
- 用戶課件寄存器
處于用戶態(tài)處理器執(zhí)行語(yǔ)言可以訪問(wèn)的寄存器,通常有8~32個(gè)阳液。 - 控制和狀態(tài)存儲(chǔ)器
程序計(jì)數(shù)器:包含將要取得下一條指令地址怕敬。
條件碼:最近的算術(shù)或邏輯運(yùn)算的結(jié)果,符號(hào)帘皿,零赖捌,進(jìn)位。等于。溢出
狀態(tài)信息:包括終端允許禁用的標(biāo)志越庇,異常模式 - 棧指針
每個(gè)進(jìn)程有一個(gè)或多個(gè)相關(guān)聯(lián)的后進(jìn)先出系統(tǒng)棧罩锐。棧用于保存參數(shù)和過(guò)程調(diào)用或是系統(tǒng)調(diào)用的地址,棧指針指向棧頂卤唉。
進(jìn)程控制信息
- 調(diào)度和狀態(tài)信息
進(jìn)程狀態(tài):運(yùn)行態(tài)涩惑,就緒態(tài),等待態(tài)桑驱,停止太
優(yōu)先級(jí)用于描述進(jìn)程調(diào)度的一個(gè)或多個(gè)域竭恬。在某些系統(tǒng)中,需要多個(gè)值:默認(rèn)熬的,當(dāng)前痊硕,最高許可。
調(diào)度相關(guān)信息取決于調(diào)度算法押框。例如進(jìn)程等待時(shí)間總量和進(jìn)程上一次運(yùn)行時(shí)執(zhí)行時(shí)間總量
事件:進(jìn)程在繼續(xù)執(zhí)行前等待的時(shí)間標(biāo)識(shí) - 數(shù)據(jù)結(jié)構(gòu)
進(jìn)程可以一隊(duì)列環(huán)或別的結(jié)構(gòu)與其他進(jìn)程進(jìn)行連接岔绸。
標(biāo)識(shí)某一特定優(yōu)先級(jí)且處于等待狀態(tài)進(jìn)程可以連接到一個(gè)隊(duì)列中,父子進(jìn)程關(guān)系橡伞,因此需要包含指向其他進(jìn)程的指針 - 進(jìn)程間通信
與兩個(gè)獨(dú)立進(jìn)程間通信相關(guān)聯(lián)的各種標(biāo)記信號(hào)和信息盒揉。 - 進(jìn)程特權(quán)
進(jìn)程根據(jù)其可以訪問(wèn)的內(nèi)存空間以及可移植性的指令類型被賦予各種特權(quán) - 存儲(chǔ)管理
指向分配給進(jìn)程的虛擬內(nèi)存空間的段表和頁(yè)表的指針 - 資源和所有權(quán)的使用情況
表示打開(kāi)的文件,包括處理器或是其他資源的使用歷史兑徘,調(diào)度器需要著細(xì)信息
標(biāo)識(shí)符的作用
表示主進(jìn)程表中的一個(gè)索引刚盈,因此需要一個(gè)銀蛇,使系統(tǒng)可以genuine進(jìn)程標(biāo)識(shí)符定位相應(yīng)的標(biāo)挂脑,進(jìn)程間相互通信可以終止通信的目標(biāo)藕漱,指明父子進(jìn)程
處理器狀態(tài)信息
當(dāng)進(jìn)程運(yùn)行時(shí),信息存在寄存器中崭闲,當(dāng)進(jìn)程被中斷時(shí)肋联,所有寄存器信息被保存,使得進(jìn)程恢復(fù)被執(zhí)行時(shí)這些信息可以被恢復(fù)镀脂。
寄存器組包括寄存器牺蹄、控制和狀態(tài)寄存器和棧指針忘伞。
所有處理器設(shè)計(jì)都包括一個(gè)或一組程序狀態(tài)字(Program status word psw)寄存器薄翅。包括所有的狀態(tài)信息。psw包含條件碼和其他狀態(tài)信息氓奈。
進(jìn)程控制信息
每個(gè)進(jìn)程映像包括一個(gè)進(jìn)程控制塊翘魄、用戶棧、進(jìn)程專用地址空間以及別的進(jìn)程共享的其他內(nèi)存空間舀奶。
進(jìn)程控制塊的作用
進(jìn)程控制塊是錯(cuò)做系統(tǒng)中最重要的數(shù)據(jù)結(jié)構(gòu)暑竟,每個(gè)進(jìn)程控制塊包含操作系統(tǒng)做需要的關(guān)于進(jìn)程的所有信息。
操作系統(tǒng)多個(gè)程序需要訪問(wèn)進(jìn)程控制塊,因此需要保護(hù)但荤。
3.4進(jìn)程控制
3.4.1執(zhí)行模式
用戶程序通常在用戶態(tài)模式下運(yùn)行罗岖。
特權(quán)態(tài)成為系統(tǒng)態(tài)、控制態(tài)或是內(nèi)核態(tài)腹躁。同一個(gè)名字桑包。
使用兩種模式可以保護(hù)操作系統(tǒng)重要的操作系統(tǒng)表(如進(jìn)程控制塊)不守用戶程序的干涉。用戶態(tài)下纺非,軟件具有對(duì)處理器以及所有指令哑了、寄存器和內(nèi)存的控制能力。而這些能力對(duì)用戶程序不是必須的烧颖。
程序狀態(tài)字中有一位表示執(zhí)行模式弱左,處理器使用該位來(lái)判斷是程序運(yùn)行在什么態(tài)中。
這一位對(duì)應(yīng)某些事件的要求而改變炕淮,當(dāng)用戶調(diào)用一個(gè)系統(tǒng)服務(wù)觸發(fā)系統(tǒng)例程的執(zhí)行時(shí)拆火,執(zhí)行模式設(shè)置成內(nèi)核態(tài),當(dāng)從系統(tǒng)服務(wù)返回到用戶進(jìn)程時(shí)鳖悠,執(zhí)行模式被設(shè)置成用戶態(tài)榜掌。
3.2.2進(jìn)程創(chuàng)建
進(jìn)程創(chuàng)建的步驟:
- 給新進(jìn)程分配一個(gè)唯一的進(jìn)城標(biāo)識(shí)符
主進(jìn)程表中增加一個(gè)新表項(xiàng),表中的每個(gè)表項(xiàng)對(duì)應(yīng)一個(gè)進(jìn)程 - 進(jìn)程分配空間
包括進(jìn)程映像中的所有元素(代碼乘综,數(shù)據(jù)憎账,棧屬性),因此操作系統(tǒng)需要知道私有用戶地址空間和用戶棧需要多少空間卡辰。
如果一個(gè)進(jìn)程由另一個(gè)進(jìn)城生成胞皱,則父進(jìn)程可以吧所需的值作為進(jìn)程創(chuàng)建請(qǐng)求的一部分傳遞給操作系統(tǒng)。如果任何現(xiàn)有的地址空間被這個(gè)新進(jìn)程共享九妈,那么必須建立正確的連接反砌。最后,必須給進(jìn)程控制塊分配空間萌朱。 - 初始化進(jìn)程控制塊
進(jìn)程標(biāo)識(shí)符包括進(jìn)程ID和其他相關(guān)ID宴树,如父進(jìn)程ID等。
處理器狀態(tài)信息部分的絕大多出項(xiàng)目通常初始化為0.但程序計(jì)數(shù)器被設(shè)置為程序入口點(diǎn)晶疼、系統(tǒng)棧指針用來(lái)定義程序邊界除外酒贬。
進(jìn)程控制信息部分的初始化:基于標(biāo)準(zhǔn)默認(rèn)值和為該進(jìn)程所請(qǐng)求的屬性。例如進(jìn)程狀態(tài)翠霍,優(yōu)先級(jí)锭吨。資源(如果不請(qǐng)求或者父進(jìn)程繼承,那么不擁有資源) - 設(shè)置正確的連接
操作系統(tǒng)把調(diào)度丟了都保存成鏈表寒匙,新進(jìn)程必須防止在就緒或就緒/掛起鏈表中 - 創(chuàng)建或擴(kuò)充其他數(shù)據(jù)結(jié)構(gòu)
記賬等零如。
3.4.3進(jìn)程切換
系統(tǒng)中斷分為兩種類型:中斷,陷阱。
中斷
是與當(dāng)前進(jìn)程A無(wú)關(guān)的某種類型的外部事件相關(guān)考蕾,例如別的進(jìn)程B進(jìn)行IO請(qǐng)求的時(shí)候交出控制權(quán)祸憋,進(jìn)程A開(kāi)始執(zhí)行,當(dāng)進(jìn)程B的IO操作完成時(shí)肖卧,進(jìn)程A被中斷夺衍。
控制需要先移交給中斷處理器,然后轉(zhuǎn)到已經(jīng)發(fā)生的特定類型的中斷相關(guān)的操作系統(tǒng)例程喜命。
例如:
- 系統(tǒng)中斷
操作系統(tǒng)確定當(dāng)前正在運(yùn)行進(jìn)程的執(zhí)行時(shí)間已經(jīng)超過(guò)了最大允許時(shí)間段(時(shí)間片)沟沙。此時(shí)進(jìn)程必須切換到就緒態(tài),另一個(gè)進(jìn)程切換到運(yùn)行態(tài) - IO中斷
操作系統(tǒng)將所有對(duì)應(yīng)的阻塞態(tài)進(jìn)程轉(zhuǎn)換到就緒態(tài)(阻塞/掛起也一樣)壁榕。
并不執(zhí)行對(duì)應(yīng)的進(jìn)程矛紫,只是設(shè)置其狀態(tài) - 內(nèi)存失效/缺頁(yè)中斷
處理器訪問(wèn)虛擬地址時(shí),此地址黨員不在內(nèi)存中牌里,操作系統(tǒng)必須從外存中把包含這個(gè)引用的內(nèi)存塊調(diào)入內(nèi)存颊咬。在發(fā)生調(diào)入內(nèi)存塊的IO請(qǐng)求后,操作系統(tǒng)可能會(huì)執(zhí)行一個(gè)進(jìn)程切換牡辽,已恢復(fù)另一個(gè)進(jìn)程的執(zhí)行喳篇,發(fā)生缺頁(yè)的進(jìn)城被置為阻塞態(tài)。當(dāng)想要的塊調(diào)入內(nèi)存重視态辛,該進(jìn)程被置為就緒態(tài)
陷阱
當(dāng)前運(yùn)行進(jìn)程所產(chǎn)生的錯(cuò)誤或異常條件麸澜。如非法文件訪問(wèn)。
操作系統(tǒng)確定異常調(diào)教是否指明奏黑,如果致命炊邦,當(dāng)前運(yùn)行的金恒被轉(zhuǎn)換到退出態(tài),并發(fā)生進(jìn)程切換熟史。如果不致命馁害,操作系統(tǒng)的動(dòng)作取決于錯(cuò)誤的種類和操作系統(tǒng)的設(shè)計(jì)。
系統(tǒng)調(diào)用
一個(gè)用戶進(jìn)程正在運(yùn)行蹂匹,并且請(qǐng)求一個(gè)IO操作碘菜,該調(diào)用會(huì)使進(jìn)程陷入內(nèi)核態(tài),通常系統(tǒng)調(diào)用會(huì)導(dǎo)致吧童虎進(jìn)程置為阻塞限寞。
場(chǎng)景切換
當(dāng)存在未處理的中斷忍啸,處理器需要做一下工作,例如模式切換
模式切換:
- 把程序計(jì)數(shù)器設(shè)置成中斷處理程序的開(kāi)始地址
- 從用戶態(tài)切換到內(nèi)核態(tài)昆烁,使得中斷處理代碼可以包含特權(quán)的指令
同時(shí)還需要保存進(jìn)程上下文吊骤。
此時(shí)的上下文稱為中斷上下文缎岗,作用在于:所有中斷處理可能改變的信息和恢復(fù)被中斷程序時(shí)所需要的信息静尼。包含程序計(jì)時(shí)器,其他處理器寄存器和棧信息
中斷處理程序:通常是執(zhí)行一些與中斷相關(guān)的基本任務(wù)的小程序。
進(jìn)程狀態(tài)的變化
模式切換和進(jìn)程切換不同鼠渺,發(fā)生模式切換可以不改變正處于運(yùn)行態(tài)的進(jìn)程狀態(tài)鸭巴,在這種情況下,保存上下文環(huán)境和以后恢復(fù)上下文環(huán)境需要很少的開(kāi)銷拦盹,但是進(jìn)程切換鹃祖,如果當(dāng)前正在運(yùn)行的進(jìn)城被切換到另一狀態(tài),則操作系統(tǒng)使其環(huán)境產(chǎn)生實(shí)質(zhì)性的變化普舆。
進(jìn)程切換步驟:
- 保存處理器上下文恬口,包括程序計(jì)數(shù)器和其他寄存器
- 更新當(dāng)前處于運(yùn)行態(tài)進(jìn)程的進(jìn)城控制塊,包括江金城狀態(tài)改變到另一個(gè)狀態(tài)(就緒態(tài)沼侣,阻塞態(tài)等等)祖能。還必須更新相關(guān)域,包括離開(kāi)運(yùn)行態(tài)的原因和記賬信息
- 將進(jìn)程的進(jìn)城控制塊移到相應(yīng)的隊(duì)列(就緒蛾洛,事件i處阻塞养铸、就緒)。
- 選擇另一個(gè)進(jìn)程執(zhí)行(需要調(diào)度算法)
- 更新所選擇進(jìn)程的進(jìn)程控制塊轧膘,包括將進(jìn)程的狀態(tài)變?yōu)檫\(yùn)行態(tài)
- 跟新內(nèi)存管理的數(shù)據(jù)結(jié)構(gòu)钞螟,取決于如何管理地址轉(zhuǎn)換,(后面講)
- 恢復(fù)處理器在被選擇進(jìn)程最后一次切換出運(yùn)行狀態(tài)時(shí)的上上下文谎碍,可以通過(guò)載入程序計(jì)數(shù)器和其他寄存器以前的值來(lái)實(shí)現(xiàn)
進(jìn)程切換涉及狀態(tài)變化鳞滨,因而比模式切換需要更多的工作。
因此上下文只是寄存器的值蟆淀,是否包括棧太援??扳碍?提岔??笋敞?碱蒙??夯巷?赛惩??
3.5操作系統(tǒng)的執(zhí)行
無(wú)進(jìn)程內(nèi)核
內(nèi)核運(yùn)行不是以進(jìn)程的形式存在趁餐。當(dāng)進(jìn)程被中斷或產(chǎn)生一個(gè)系統(tǒng)調(diào)用時(shí)喷兼,該進(jìn)程的模式上下文被保存,控制權(quán)交給內(nèi)核后雷。操作系統(tǒng)有自己的內(nèi)存區(qū)域和系統(tǒng)棧季惯,用于控制過(guò)程調(diào)用和返回吠各。
內(nèi)核在用戶進(jìn)程中執(zhí)行
進(jìn)程映像包含內(nèi)核的程序數(shù)據(jù)和棧結(jié)構(gòu)。