《操作系统》OS学习(十):进程控制
進(jìn)程切換(上下文切換):
- 定義:暫停當(dāng)前運(yùn)行進(jìn)程,從運(yùn)行狀態(tài)變成其他狀態(tài),調(diào)度另一個(gè)進(jìn)程從就緒狀態(tài)變成運(yùn)行狀態(tài)
- 要求:切換前,保存進(jìn)程上下文;切換后,恢復(fù)進(jìn)程上下文;快速切換
- 進(jìn)程存儲(chǔ)的生命周期的信息:寄存器(PC,SP,...);CPU狀態(tài);內(nèi)存地址空間
進(jìn)程控制塊PCB:內(nèi)核的進(jìn)程狀態(tài)記錄
- 內(nèi)核為每個(gè)進(jìn)程維護(hù)了對(duì)應(yīng)的進(jìn)程控制塊PCB
- 內(nèi)核將相同狀態(tài)的進(jìn)程的PCB放置在同一隊(duì)列
進(jìn)程控制塊結(jié)構(gòu):
- 進(jìn)程標(biāo)識(shí)信息
- 進(jìn)程狀態(tài)信息
- 進(jìn)程占用的資源(存儲(chǔ)資源、內(nèi)核堆棧等)
- 保護(hù)現(xiàn)場(chǎng)用的內(nèi)容
- 當(dāng)前進(jìn)程在哪個(gè)隊(duì)列
其中內(nèi)存地址空間結(jié)構(gòu)中會(huì)包含:有哪些內(nèi)存塊及地址空間,第一級(jí)頁(yè)表起始地址,置換相關(guān)結(jié)構(gòu)
進(jìn)程創(chuàng)建:
- Windows進(jìn)程創(chuàng)建API:CreateProcess
- Unix進(jìn)程創(chuàng)建系統(tǒng)調(diào)用:fork/exec。fork()把一個(gè)進(jìn)程復(fù)制成兩個(gè)進(jìn)程,父子進(jìn)程有各自的PID;接下來(lái)的exec()用新程序來(lái)重寫(xiě)當(dāng)前進(jìn)程,PID不改變。
空閑進(jìn)程創(chuàng)建
當(dāng)用戶代碼執(zhí)行完之后,系統(tǒng)將在空閑進(jìn)程中執(zhí)行。
第一個(gè)內(nèi)核線程的創(chuàng)建:
fork()的開(kāi)銷(xiāo):
- 對(duì)子進(jìn)程分配內(nèi)存
- 復(fù)制父進(jìn)程的內(nèi)存和CPU寄存器到子進(jìn)程里
- 開(kāi)銷(xiāo)昂貴
99%調(diào)用fork是為了接下來(lái)調(diào)用exec,考慮到fork()操作中內(nèi)存復(fù)制是沒(méi)有作用的,子進(jìn)程可能會(huì)關(guān)閉打開(kāi)的文件和連接,因此考慮將其合并到一個(gè)調(diào)用中,于是出現(xiàn)了vfork()。
vfork():
- 創(chuàng)建進(jìn)程時(shí),不再創(chuàng)建一個(gè)同樣的內(nèi)存映像,而是當(dāng)調(diào)用exec()時(shí)才開(kāi)始復(fù)制,而要被覆蓋或者關(guān)閉的資源不再進(jìn)行復(fù)制
- 一些時(shí)候稱(chēng)為輕量級(jí)fork()
- 子進(jìn)程應(yīng)該幾乎立刻調(diào)用exec()
- 現(xiàn)在使用Copy on Write(COW)技術(shù)
進(jìn)程加載exec
- exec調(diào)用成功時(shí):是相同的進(jìn)程,運(yùn)行了不同的程序
- exec()允許一個(gè)進(jìn)程加載一個(gè)不同段程序,并在MAIN執(zhí)行,(_start)
- 允許一個(gè)進(jìn)程指定參數(shù)的數(shù)量argc和字符串參數(shù)數(shù)字argv
- 允許進(jìn)程指定不同的控制流,OS中可指定不同的應(yīng)用程序,即調(diào)用成功=相同進(jìn)程,運(yùn)行的是不同的程序!
- Code(代碼段)stack(堆棧)heap(堆)等完全重寫(xiě)
進(jìn)程等待與退出:
父進(jìn)程等待子進(jìn)程:
1. wait()系統(tǒng)調(diào)用用于父進(jìn)程等待子進(jìn)程的結(jié)束
- 子進(jìn)程結(jié)束時(shí)通過(guò)exit()向父進(jìn)程返回一個(gè)值
- 父進(jìn)程通過(guò)wait()接受并處理返回值
2. wait()系統(tǒng)調(diào)用的功能
- 有子進(jìn)程存活時(shí),父進(jìn)程進(jìn)入等待狀態(tài),等待子進(jìn)程的返回結(jié)果。當(dāng)某子進(jìn)程調(diào)用exit()時(shí),喚醒父進(jìn)程,將exit()返回值作為父進(jìn)程中wait的返回值
- 有子進(jìn)程調(diào)用exit()而父進(jìn)程還未調(diào)用wait()處理時(shí),子進(jìn)程被稱(chēng)為僵尸進(jìn)程。如果此時(shí)父進(jìn)程調(diào)用wait()則直接處理并返回
- 無(wú)子進(jìn)程或無(wú)子進(jìn)程存活時(shí),wait()也是立刻返回
3. exit()用于進(jìn)程的有序終止
- 進(jìn)程結(jié)束執(zhí)行時(shí)調(diào)用exit(),完成進(jìn)程資源回收。
4.?exit()系統(tǒng)調(diào)用的功能
- 將調(diào)用參數(shù)作為進(jìn)程的結(jié)果返回
- 關(guān)閉所有打開(kāi)的文件等占用資源
- 釋放內(nèi)存
- 釋放大部分進(jìn)程相關(guān)的內(nèi)核數(shù)據(jù)結(jié)構(gòu)
- 檢查是否父進(jìn)程是存活的:如果父進(jìn)程存活,保留結(jié)果的值直到父進(jìn)程用wait()處理,進(jìn)入僵尸狀態(tài);如果父進(jìn)程不存活,則子進(jìn)程為孤兒進(jìn)程,直接釋放所有數(shù)據(jù)結(jié)果,進(jìn)程結(jié)束
- 清理所有等待的僵尸進(jìn)程
其他進(jìn)程控制系統(tǒng)調(diào)用
- 優(yōu)先級(jí)控制:nice()指定進(jìn)程的初始優(yōu)先級(jí);unix系統(tǒng)中進(jìn)程優(yōu)先級(jí)會(huì)隨執(zhí)行時(shí)間而衰落
- 進(jìn)程調(diào)試支持:ptrace()允許一哥進(jìn)程控制另一個(gè)進(jìn)程的執(zhí)行;設(shè)置斷點(diǎn)和查看寄存器
- 定時(shí):sleep()可以讓進(jìn)程在定時(shí)器的等待隊(duì)列中等待指定。
為什么要讓父進(jìn)程等?而不是直接結(jié)束?
當(dāng)進(jìn)程執(zhí)行完畢退出后,幾乎所有資源都回收到OS中。但有個(gè)資源很難回收,就是PCB,PCB是代表進(jìn)程存在的唯一標(biāo)識(shí),OS要依據(jù)PCB執(zhí)行回收。這個(gè)功能由父進(jìn)程完成。
?
總結(jié)
以上是生活随笔為你收集整理的《操作系统》OS学习(十):进程控制的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ISO14229-1道路车辆-统一诊断服
- 下一篇: SPI 读取不同长度 寄存器_SPI协议