操作系统(Linux与Windows)的进程管理
進(jìn)程
描述和管理程序的“運(yùn)行過程”-------進(jìn)程
進(jìn)程概念
定義:進(jìn)程是程序在某個(gè)數(shù)據(jù)集合上的一次運(yùn)行活動(dòng)
進(jìn)程的特征
-
動(dòng)態(tài)性
進(jìn)程是程序的一次執(zhí)行過程,動(dòng)態(tài)產(chǎn)生消亡
-
并發(fā)性
進(jìn)程可以同其他程序一起向前推進(jìn)
-
異步性
進(jìn)程按各自的速度向前推進(jìn)
-
獨(dú)立性
進(jìn)程是系統(tǒng)分配資源和調(diào)度CPU的單位
進(jìn)程的狀態(tài)
-
運(yùn)行狀態(tài)
進(jìn)程已經(jīng)占有CPU,在CPU上運(yùn)行 -
就緒狀態(tài)
具備運(yùn)行條件但由于無CPU,暫時(shí)不能運(yùn)行 -
阻塞狀態(tài)
應(yīng)為等待某項(xiàng)服務(wù)完成或信號(hào)來到而不能運(yùn)行的狀態(tài)
例如等待:系統(tǒng)調(diào)用,I/O操作,合作進(jìn)程的服務(wù)或信號(hào)
進(jìn)程狀態(tài)的變遷
進(jìn)程的掛起和解掛操作
掛起:用戶或OS將進(jìn)程有意暫停
解掛:將掛起的進(jìn)程繼續(xù)
阻塞:禁止阻塞(阻塞時(shí)掛起)和活動(dòng)阻塞(正常阻塞)
就緒:禁止就緒(就緒時(shí)掛起)和活動(dòng)就緒(正常就緒)
Linux進(jìn)程狀態(tài)
- 可運(yùn)行態(tài):TASK_RUNNING
1.就緒:在就緒隊(duì)列中等待調(diào)度
2.運(yùn)行:正在運(yùn)行 - 阻塞(等待)態(tài):
1.淺度阻塞:TASK_INTERRUPTIBLE
可被其他進(jìn)程的信號(hào)或時(shí)鐘中斷喚醒
2.深度阻塞:TASK_UNINTERRUPTIBLE
不可被其他進(jìn)程通過信號(hào)或時(shí)鐘中斷喚醒 - 僵死態(tài):TASK_ZOMBIE
進(jìn)程終止執(zhí)行,釋放大部分內(nèi)存 - 掛起態(tài):TASK_STOPPED
進(jìn)程被掛起
進(jìn)程的描述
進(jìn)程控制塊(PCB)
1.描述進(jìn)程狀態(tài)、資源、和相關(guān)進(jìn)程關(guān)系的一中數(shù)據(jù)結(jié)構(gòu)
2.PCB是進(jìn)程的標(biāo)志
3.創(chuàng)建進(jìn)程時(shí)創(chuàng)建PCB;進(jìn)程撤銷后PCB同時(shí)撤銷
進(jìn)程=程序+PCB
Linux的進(jìn)程控制塊PCB:task_struct
Linux 進(jìn)程的標(biāo)識(shí):
PID
PPID:父進(jìn)程ID
PGID:進(jìn)程組ID
Linux進(jìn)程的用戶標(biāo)識(shí):
UID:用戶ID
GID:用戶組ID
STAT:進(jìn)程狀態(tài)
| R | 運(yùn)行或準(zhǔn)備運(yùn)行 |
| S | 睡眠狀態(tài) |
| I | 空閑 |
| Z | 僵尸 |
| D | 不間斷睡眠 |
| W | 進(jìn)程沒有駐留頁(yè) |
| T | 停止或跟蹤 |
進(jìn)程控制
四個(gè)典型控制為:
- 創(chuàng)建進(jìn)程
- 撤銷進(jìn)程
- 阻塞進(jìn)程
- 喚醒進(jìn)程
創(chuàng)建進(jìn)程的過程
創(chuàng)建一個(gè)空白PCB
賦予進(jìn)程標(biāo)識(shí)符ID
為進(jìn)程分配空間
初始化PCB(默認(rèn)值)
插入相應(yīng)的進(jìn)程隊(duì)列(新進(jìn)程插入就緒隊(duì)列)
進(jìn)程撤銷過程
在PCB隊(duì)列中檢索出PCB
獲取該進(jìn)程狀態(tài)
- 若在運(yùn)行態(tài),立即終止該進(jìn)程
- 遞歸檢查是否有子進(jìn)程,先撤銷子進(jìn)程
釋放進(jìn)程占有的資源
將進(jìn)程從PCB隊(duì)列中移除
- 遞歸檢查是否有子進(jìn)程,先撤銷子進(jìn)程
進(jìn)程阻塞時(shí)機(jī)和過程
時(shí)機(jī);
- 請(qǐng)求系統(tǒng)服務(wù)
- 啟動(dòng)某種操作
- 新數(shù)據(jù)尚未到達(dá)
- 無新工作可做
停止運(yùn)行
將PCB“運(yùn)行態(tài)”改為“阻塞態(tài)”
插入相應(yīng)原因的阻塞隊(duì)列
轉(zhuǎn)調(diào)度程序
進(jìn)程喚醒
系統(tǒng)服務(wù)由不滿足到滿足
I/O完成
新數(shù)據(jù)到達(dá)
進(jìn)程提出新請(qǐng)求
進(jìn)程控制原語:
- 創(chuàng)建原語
- 撤銷原語
- 阻塞原語
- 喚醒原語
Linux進(jìn)程控制
創(chuàng)建進(jìn)程fork
fork執(zhí)行流程:
- 正文段、用戶數(shù)據(jù)段及系統(tǒng)數(shù)據(jù)段task_struct的大部分內(nèi)容,并對(duì)子程序中有別于父進(jìn)程的項(xiàng)進(jìn)行初始化
init進(jìn)程:
在linux系統(tǒng)初啟時(shí),生成init進(jìn)程(1號(hào)進(jìn)程)
其他進(jìn)程有當(dāng)前進(jìn)程通過系統(tǒng)調(diào)用fork建立
子進(jìn)程執(zhí)行自己的功能
exce函數(shù)族
功能:
- 裝入一個(gè)指定的可執(zhí)行程序運(yùn)行
- 使子進(jìn)程具有和父進(jìn)程完全不同的新功能
步驟:
- 根據(jù)文件名找到相應(yīng)的可執(zhí)行文件
- 可執(zhí)行文件的內(nèi)容填入子程序的地址空間
- exce調(diào)用成功就會(huì)進(jìn)入新進(jìn)程且不再返回
- 調(diào)用失敗返回-1,繼續(xù)在克隆來的地址空間中從調(diào)用點(diǎn)向下執(zhí)行
進(jìn)程阻塞 wait
進(jìn)程立即阻塞自己,如果它找到一個(gè)已經(jīng)成為僵尸的子進(jìn)程,wait就會(huì)收集這個(gè)子進(jìn)程的信息,并把它徹底銷毀后返回
進(jìn)程終結(jié)exit
進(jìn)程釋放自己占用的資源并匯報(bào)給父進(jìn)程
調(diào)用exit后變?yōu)榻┦瑧B(tài),幾乎所有的內(nèi)存空間,保存PCB信息供wait收集
進(jìn)程的休眠sleep
Windows進(jìn)程
進(jìn)程是被加載到內(nèi)存的,正在運(yùn)行的應(yīng)用程序?qū)嵗?br /> 進(jìn)程由內(nèi)核對(duì)象和地址空間所組成
- 內(nèi)核對(duì)象PCB
- 地址空間
包括代碼、數(shù)據(jù)、堆、棧、堆上動(dòng)態(tài)分配的空間
windows創(chuàng)建進(jìn)程creatProcess
過程:
- 創(chuàng)建進(jìn)程內(nèi)核對(duì)象,創(chuàng)建虛擬地址空間
- 裝載exe和、或dll的代碼和數(shù)據(jù)到地址空間中
- 創(chuàng)建主線程和線程內(nèi)核對(duì)象
- 啟動(dòng)主線程,進(jìn)入主函數(shù)
有一個(gè)非常有趣的例子,見我另一篇博客
Windows結(jié)束進(jìn)程
主函數(shù)返回
ExitProcess
TerminateProcess
補(bǔ)充:守護(hù)進(jìn)程daemon
守護(hù)進(jìn)程編程:
pid = fork(); //創(chuàng)建子進(jìn)程 if(pid>0) eixt(0); //退出父進(jìn)程 setsid(); //讓進(jìn)程脫離控制終端 chdir("/"); //避免原工作目錄不能被卸載 umake(0); //文件權(quán)限掩碼設(shè)置0 for(int i = 0;i<MAXFILE;i++)close(i); //關(guān)閉繼承自父進(jìn)程的文件 《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的操作系统(Linux与Windows)的进程管理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 动态加载技术
- 下一篇: Linux虚拟内存与线性地址翻译