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