進程資源和進程狀態 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 用戶進程狀態切換圖

筆者:個人能力有限,只是學習參考...讀者若發現文中錯誤,敬請提出.

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------勿在浮沙築高臺,靜下心來,慢慢地沉澱---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

發佈了33 篇原創文章 · 獲贊 44 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章