- Linux內核完全注釋(20周年版·第2版)
- 趙炯編著
- 809字
- 2024-05-10 12:20:19
2.4.2 進程運行狀態
一個進程在其生存期內,可處于一組不同的狀態下,稱為進程狀態,如圖2-6所示。進程狀態保存在進程任務結構的state字段中。當進程正在等待系統中的資源而處于等待狀態時,則稱其處于睡眠等待狀態。在Linux系統中,睡眠等待狀態被分為可中斷的和不可中斷的等待狀態。

圖2-6 進程狀態及轉換關系
(1)運行狀態(TASK_RUNNING)。當進程正在被CPU執行,或已經準備就緒隨時可由調度程序執行,則稱該進程為處于運行狀態(running)。進程可以在內核態運行,也可以在用戶態運行。當系統資源已經可用時,進程就被喚醒而進入準備運行狀態,該狀態稱為就緒態。這些狀態(圖中中間一列)在內核中表示方法相同,都被稱為處于TASK_RUNNING狀態。
(2)可中斷睡眠狀態(TASK_INTERRUPTIBLE)。當進程處于可中斷睡眠狀態時,系統不會調度該進程執行。當系統產生一個中斷或者釋放了進程正在等待的資源,或者進程收到一個信號,都可以喚醒進程,轉換到就緒狀態(運行狀態)。
(3)不可中斷睡眠狀態(TASK_UNINTERRUPTIBLE)。與可中斷睡眠狀態類似。但處于該狀態的進程只有被wake_up()函數明確喚醒時才能轉換到可運行的就緒狀態。
(4)暫停狀態(TASK_STOPPED)。當進程收到信號SIGSTOP、SIGTSTP、SIGTTIN或SIGTTOU時就會進入暫停狀態。可向其發送SIGCONT信號讓進程轉換到可運行狀態。在Linux 0.11中,還未實現對該狀態的轉換處理。處于該狀態的進程將被作為進程終止來處理。
(5)僵死狀態(TASK_ZOMBIE)。當進程已停止運行,但其父進程還沒有詢問其狀態時,稱該進程處于僵死狀態。
當一個進程的運行時間片用完,系統就會使用調度程序強制切換到其他的進程去執行。另外,如果進程在內核態執行時需要等待系統的某個資源,此時該進程就會調用sleep_on()或interruptible sleep_on()自愿地放棄CPU的使用權,而讓調度程序去執行其他進程。進程則進入睡眠狀態(TASK_UNINTERRUPTIBLE或TASK_INTERRUPTIBLE)。
只有當進程從“內核運行態”轉移到“睡眠狀態”時,內核才會進行進程切換操作。在內核態下運行的進程不能被其他進程搶占,而且一個進程不能改變另一個進程的狀態。為了避免進程切換時造成內核數據錯誤,內核在執行臨界區代碼時會禁止一切中斷。
- Linux從零開始學(視頻教學版)
- 精通Linux內核開發
- Learn Helm
- 深入Linux內核架構與底層原理(第2版)
- 無蘋果不生活 The New iPad隨身寶典
- Django Project Blueprints
- RHCSARHCE 紅帽Linux認證學習指南(第7版)EX200 & EX300
- 新編電腦辦公(Windows 10+ Office 2013版)從入門到精通
- Windows 8實戰從入門到精通(超值版)
- 從實踐中學習Windows滲透測試
- Ubuntu Linux操作系統實用教程
- Linux內核分析及應用
- Unity AR/VR開發:實戰高手訓練營
- Docker for Developers
- SQL Server on Azure Virtual Machines