進程
一、基本概念
- 進程:是程序動態執行過程,包括創建、調度、消亡
- 程序:存放在外存的一段數據的集合
二、進程創建
(一)進程空間分布
- 每個進程運行起來后,操作系統開辟0-4G的虛擬空間
- 進程空間:用戶空間+內核空間(不允許用戶訪問)
- 用戶空間:文本段(文本區)+數據段(數據區)+系統數據段(堆區、棧區)
- 文本段:存放代碼和指令
- 數據段:字符串常量、已初始化全局變量/靜態變量,未初始化全區變量/靜態變量
- 數據區存放數據特點:未初始化值為0、編譯時開辟空間、程序結束回收空間。
- 系統數據段:堆區(malloc空間)、棧區(局部變量、函數運行)
- 堆區存放數據特點:malloc申請堆區空間、free釋放堆區空間、注意避免內存泄漏
- 棧區存放數據特點:未經初始化值為隨機值,執行到變量定義開辟內存空間,超過變量作用? 域回收變量空間
(二)虛擬地址和物理地址
- 虛擬地址:所有能被用戶看到的地址均為虛擬地址,表示用戶可以尋址的范圍
- 物理地址:內存存放數據對應的實際硬件物理地址
- MMU:虛擬地址與物理地址之間的映射由內存單元(MMU)完成
(三)多進程存儲
? ? ? ? 1.存儲方式
? ? ? ? ? ? ? ? 1.1:多個進程空間在操作系統中存儲時,空間是獨立的(物理地址時獨立的)
? ? ? ? ? ? ? ? 1.2:多個進程在操作系統中共用一個虛擬內存空間(虛擬地址是共享的)
(四)進程的調度
????????1.常見的進程調度算法
? ? ? ? ? ? ? ? 1.1先來先執行,后來后執行
? ? ? ? ? ? ? ? 1.2高優先級調度算法
? ? ? ? ? ? ? ? 1.3時間片輪轉調度算法
? ? ? ? ? ? ? ? 1.4多級隊列調度算法
? ? ? ? ? ? ? ? 1.5負載均衡調度算法
? ? ? ? 2.進程調度本質
? ? ? ? ? ? ? ? 2.1宏觀并行,微觀串行? ? ? ??
? ? ? ? ? ? ? ? 2.2宏觀分析:一個CPU同時執行多個進程任務
? ? ? ? ? ? ? ? 2.3微觀分析:一個CPU在多個進程任務中高速切換保障多任務執行
(五)進程相關的命令
? ? ? ? 1.top
? ? ? ? 2.ps -ef
? ? ? ? 3.ps-aux
? ? ? ? 4../a.out &:后臺執行進程(a.out)任務
? ? ? ? 5.fg 編號(通過jobs查看):后臺執行的任務放到前臺執行
? ? ? ? 6.jobs:查看終端下所有后臺進程任務
? ? ? ? 7.nice/renice
? ? ? ? 8.kill/killall
(六)進程的狀態
進程狀態 | 標識 | 含義 |
就緒態/運行態 | R | 進程位于CPU任務調度的隊列中 |
可喚醒等待態 | S | 等待某個資源的來,資源到來后被喚醒加入調度隊列 等待過程可以被打斷 |
不可喚醒等待態 | D | 等待某個資源的來,資源到來后被喚醒加入調度隊列 等待過程不可以被打斷 |
停止態 | T | 用戶人為讓進程任務暫停等待 |
僵尸態 | Z | 進程代碼運行結束,空間尚未被回收 |
結束態 | X | 進程代碼運行結束,空間被回收 |
三、進程相關函數接口
? ? ? ? 1.fork
注意:
- 子進程拷貝父進程文本段、數據段、系統數據段
- 父進程與子進程空間獨立,同一份代碼中的變量和數據都會在父子進程中各有一份,父子進程修改自己的空間數據不會影響對方的空間
- 進程的PID不一樣
- fork的返回值不一樣,父進程返回子進程的PID,子進程返回0
- PID:父進程一定是>0的
? ? ? ? 2.getpid 和getppid
? ? ? ? 3.exit與_exit
? ? ? ? 注意
- 在主函數中調用exit和return功能保持一致
- return在函數內部將結束該函數
- exit在函數內部會將進程結束
- exit會在結束前刷新緩存區
- _exit不會刷新緩存區
? ? ? ? 4.進程回收
? ? ? ? ? ? ? ? 4.1wait和waitpid
注意:
- wait具有阻塞等待功能,等到有子進程結束才會回收子進程繼續向下執行
- wait可以實現父子進程任務的同步
- waitpid可以非阻塞回收子進程空間
- waitpid可以回收指定子進程空間
????????
四、進程消亡
(一)孤兒進程:父進程先結束,子進程會成為孤兒進程,被init進程收養
(二)僵尸進程
? ? ? ? 1.是每個進程結束必然經歷的階段
? ? ? ? 2.產生原因:子進程結束后,父進程沒有回收子進程空間,導致進程執行結束,空間依然被占用的狀態
? ? ? ? 3.如何吧面產生僵尸進程?
- ? ? ? ? 父進程先結束,子進程成為孤兒進程,孤兒進程被init收養,子進程在結束,init進程回收進程空間
- 子進程結束,父進程回收子進程空間
五、exec函數族
? ? ? ? 1.exec函數族
- 利用進程空間執行另外一份代碼
- exec常用搭配fork使用,fork負責創建新的子進程,exec負責讓子進程執行自己的代碼
? ? ? ? 2.主函數傳參
? ? ? ? 3.system函數