1. 程式人生 > >程序資源和程序狀態 TASK_RUNNING TASK_INTERRUPTIBLE TASK_UNINTERRUPTIBLE

程序資源和程序狀態 TASK_RUNNING TASK_INTERRUPTIBLE TASK_UNINTERRUPTIBLE

摘要:本文主要介紹程序資源和程序狀態.程序資源由兩部分組成:核心空間程序資源以及使用者空間程序資源.程序狀態,就緒/執行狀態、等待狀態(可以被中斷打斷)、等待狀態(不可以被中斷打斷)、停止狀態和僵死狀態.

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 使用者程序狀態切換圖