摘要:本文主要介紹進程資源和進程狀態.進程資源由兩部分組成:內核空間進程資源以及用戶空間進程資源.進程狀態,就緒/執行狀態、等待狀態(能夠被中斷打斷)、等待狀態(不能夠被中斷打斷)、停止狀態和僵死狀態.
1.進程資源
進程是Linux系統下資源管理的基本單位。每一個進程都有自己的獨立的執行空間.為了更好的管理Linux所訪問的資源。系統引入了進程控制(PCB)的概念。PCB結構體.進程資源由兩部分組成:內核空間進程資源以及用戶空間進程資源.
內核空間進程資源:指的就是PCB相關信息.包含進程控制塊本身、打開的文件表項、當前文件夾、當前終端信息、線程基本信息、可訪問內存地址、PID、PPID、UID、EUID等,也就是說內核通過PCB能夠訪問到進程全部的資源.這些資源僅僅能通過系統調用才干訪問到.進程退出后,資源由還有一進程來回收.
用戶空間進程資源:通過成員mm_struct映射的內存空間.實質就是進程的代碼段、數據段、堆、棧、以及能夠共享訪問的庫的內存空間.這些資源進程能夠直接訪問.在進程退出時主動釋放.在進程執行時,能夠通過文件 /proc/{pid}/maps來產看能夠訪問的地址空間.
2.進程狀態
人生三大錯覺之中的一個:QQ、暴風影音、瀏覽器等能夠一起執行。難道進程是並行執行的.非也非也.對於單CPU系統來說在某一時刻,僅僅能有一個進程處於執行狀態,占有CPU的使用權,其它進程都處於其它狀態,等待系統資源,各進程依據調度算法在某些狀態之間不停地的切換.但因為CPU處理效率較快,使用戶感覺不到當中的變化.在Linux2.6內核中。用戶級進程擁有下面幾種狀態:就緒/執行狀態、等待狀態(能夠被中斷打斷)、等待狀態(不能夠被中斷打斷)、停止狀態和僵死狀態.
TASK_RUNNING:正在運行或處於就緒狀態:就緒狀態是指進程申請到了CPU以外的其它全部資源。正所謂:萬事俱備,僅僅欠東風.提醒:一般的操作系統教科書將正在CPU上運行的進程定義為RUNNING狀態、而將可運行可是尚未被調度運行的進程定義為READY狀態。這兩種狀態在Linux下統一為 TASK_RUNNING狀態.
TASK_INTERRUPTIBLE:處於等待隊伍中,等待資源有效時喚醒(比方等待鍵盤輸入、socket連接、信號等等),但能夠被中斷喚醒.普通情況下,進程列表中的絕大多數進程都處於TASK_INTERRUPTIBLE狀態.畢竟皇帝僅僅有一個(單個CPU時),后宮佳麗幾千;假設不是絕大多數進程都在睡眠,CPU又怎么響應得過來.
TASK_UNINTERRUPTIBLE:處於等待隊伍中,等待資源有效時喚醒(比方等待鍵盤輸入、socket連接、信號等等),但不能夠被中斷喚醒.
TASK_ZOMBIE:僵死狀態。進程資源用戶空間被釋放,但內核中的進程PCB並沒有釋放。等待父進程回收.
TASK_STOPPED:進程被外部程序暫停(如收到SIGSTOP信號,進程會進入到TASK_STOPPED狀態),當再次同意時繼續運行(進程收到SIGCONT信號,進入TASK_RUNNING狀態)。因此處於這一狀態的進程能夠被喚醒.
用戶級進程之間的狀態切換關系如圖2所看到的.

圖2 用戶進程狀態切換圖
筆者:個人能力有限,僅僅是學習參考...讀者若發現文中錯誤。敬請提出.