1、基本概念:
- 進程:是程序動態執行的過程,包括創建、調度、消亡
- 程序:存放在外存中一段數據的集合
- 虛擬地址:進程使用的邏輯地址,有操作系統管理,不直接對應物理內存
- 物理地址:實際內存的硬件地址
- MMU(內存映射單元):將物理地址映射到虛擬地址
2、進程空間分布
- 每個進程運行之后,操作系統會為其開辟0 ~ 4 G的虛擬內存空間
- 進程空間 = 用戶空間 + 內核空間
- 用戶空間:文本段(文本去)+數據段(數據區)+系統數據段(堆棧)
- 文本段:存放代碼和指令
- 數據段:存放字符串常量、全局變量與靜態變量
- 系統數據段:堆(malloc生擒空間),棧(函數運行與局部變量空間)
3、多個進程存儲與調度
? 1.多個進程的存儲
- 多個進程在操作系統中存儲時,空間是獨立的(物理地址獨立)
- 多個進程在操作系統中共用一個虛擬內存空間(虛擬地址是共享的)
? 2.多個進程的調度
? ? ? ? 宏觀并行,微觀串行(CPU 在多個任務中高速切換保障多任務執行)
4、進程相關 Linux 命令
? 1.進程查看指令??
????????top
功能:
????????根據 CPU 占用率和內存占用率查看當前內存的信息
PID:
????????進程 ID 號? ? ?
USER:
????????創建者? ? ?
PR ?NI:
????????優先級? ??
VIRT ? ?RES ? ?SHR S?:
????????資源占用
%CPU %MEM:CPU:
????????和內存占用率? ? ?
TIME+:
? ? ? ? 運行時長
COMMAND :
? ? ? ? 進程命令
????????ps -ef
功能:
????????查看該時刻的所有進程信息(強調父子關系和完整的進程信息)
UID:
????????創建進程的用戶 ? ? ? ?
PID:
????????進程的ID號 ?
PPID:
????????父進程的ID號 ?
C STIME TTY:
????????進程依賴的終端 ? ? ? ?
ps -ef | grep 進程名 查找與進程名對應的進程信息
????????ps -aux
? ? ? ? 查看該時刻所有的進程信息(強調資源占用和進程的狀態)
? 2.后臺執行進程任務
指令 | 功能 |
進程名 & | 將進程轉入后臺運行 |
jobs | 查看終端下所有后臺執行任務 |
fg PID編號 | 將后臺執行的任務放到前臺執行 |
? 3.優先級調整指令
????????nice/renice
示例:nice -n 優先級編號 進程名 ? ?
? ? ? ? ? ?renice -n 優先級編號 進程PID
功能:
?????????改變進程的優先級
優先級范圍:
? ? ? ? ?-20 - 20 數字越小優先級越高
4.進程終止指令
? ? ? ? kill/killall
示例:kill -編號 進程PID ? ?
? ? ? ? ? ?killall -編號 進程名
功能:殺死進程任務
例:kill -9 PID
5、進程的狀態
進程狀態 | 標識 | 含義 |
就緒態/運行態 | R | 進程位于CPU任務調度的隊列中 |
可喚醒等待態 | S | 等待某個資源的到來,資源到來后被喚醒加入調度隊列 等待過程中可以被打斷 |
不可喚醒等待態 | D | 等待某個資源的到來,資源到來后被喚醒加入調度隊列 等待過程中不可以被打斷 |
停止態 | T | 用戶人為操作讓進程等待 |
僵尸態 | Z | 進程代碼運行結束,空間尚未回收 |
結束態 | X | 進程代碼結束,空間被回收 |
6、進程相關函數接口
? 1.fork(子進程創建接口)
- 子進程拷貝父進程的文本段、數據段、系統數據段
- 父進程與子進程的 PID 號不同
- 若在子進程結束前父進程結束,子進程會被 init 領養,子進程的父進程 PID 號改為1
原型:
????????pid_t fork(void);
功能:
????????創建一個新的進程,新的進程稱為子進程,調用fork的進程稱為父進程
返回值:
????????父進程中返回子進程的PID
????????子進程中返回0
????????出錯返回-1
2.獲取 PID 號與 父進程 PID
????????getpid和getppid
原型:
????????pid_t getpid(void); 、
功能:
????????獲得調用函數進程的PID號
原型:
????????pid_t getppid(void);
功能:
獲得調用函數進程的父進程的PID號