(進程的狀態與轉換)

進程與線程

導讀

大家好,很高興又和大家見面啦!!!

在上一篇內容中,我們共同探討了進程的基本概念——進程作為操作系統中資源分配和獨立運行的基本單位,是理解系統如何實現多任務併發的關鍵。

進程並非是靜態不變的,它有着自己的“生命週期”,會在不同的狀態間動態轉換,以響應系統的調度和各類事件的發生。

理解這些狀態及其轉換規律,就如同掌握了進程活動的脈搏。接下來,就讓我們直接進入正文,一起揭開進程狀態與轉換的奧秘。

一、五種狀態

進程在其生命週期內,由於系統中各個進程之間的相互制約及系統的運行環境的變化,使得進程的狀態也在不斷地發生變化。通常有以下5種狀態,前3種是進程的基本狀態:

  • 運行態:進程正在 CPU 上運行。

    • 在單 CPU 中,每個時刻只有一個進程處於運行態。
    • 在多 CPU 中,每個時刻可以有多個進程處於運行態
  • 就緒態:進程獲得了除 CPU 外的一切所需資源,一旦得到 CPU ,便可立即運行。

    • 系統中處於就緒態的進程可能有多個,通常將它們排成一個隊列,稱為就緒隊列
  • 阻塞態:也稱等待態。進程正在等待某一事件而暫停運行,如某個資源可用(不包括 CPU)或等待 I/O 完成。即使 CPU 空閒,該進程也不能運行。

    • 系統通常將處於阻塞態的進程也排成一個隊列,甚至根據阻塞原因的不同,設置多個阻塞隊列。
  • 創建態:進程正在被創建,尚未轉到就緒態。

    • 創建進程需要多個步驟:
      • 申請一個空白 PCB,並向 PCB 中填入用於控制和管理進程的信息
      • 為該進程分配運行時所必須的資源
      • 將該進程轉入就緒態並插入就緒隊列
    • 若進程所需的資源尚不能得到滿足,如內存不足,則創建工作尚未完成,進程此時所處的狀態稱為創建態
  • 終止態:進程正從系統中消失,可能是進程正常結束或其他原因退出運行。

    • 進程需要結束運行時,系統首先將該進程置為終止態,然後進一步處理資源釋放和回收等工作。

1.1 就緒態與阻塞態

在這五種狀態中,其中有兩種狀態是我們容易混淆的——就緒態阻塞態

下面存在一個場景:

現在超市的收銀台這裏排着兩列隊伍,這兩列隊伍均在等待着進行貨品結算與付款,但是這兩列隊伍的等待的原因不相同:

  • 隊伍1:已經完成了所需貨品的購入,現在只需要等待付款即可
  • 隊伍2:已經完成了所需貨品的購入,但是都有不同的原因而導致現在無法付款,如還有同伴在選購其他商品,或者是現在手上的錢不夠等着父母轉錢,再或者是隻是幫朋友排個隊,朋友還沒有過來……

在上述的場景中,這兩列隊伍此時所處的狀態是不相同的:

  • 隊伍1中的顧客只等着前面的顧客完成結算付款後,輪到自己時可以直接進行貨品的結算與付款
  • 隊伍2中的顧客需要等到自己的條件滿足後並且收銀員處於空閒狀態才能夠進行貨品的結算與付款。
    • 也就是説,如果此時收銀員處於空閒狀態,但是自己的條件沒有滿足,如自己手上的錢不太夠,父母還沒有把錢轉過來,這時該顧客也無法進行貨品的結算與付款。

這兩列隊伍的狀態就很好的反映了操作系統中進程的兩種狀態——就緒態阻塞態

場景中的隊伍1對應的就是進程的就緒態,此時的進程已經做好了一切準備,只等着 CPU 來運行,因此處於該狀態的進程稱為就緒態

場景中的隊伍2對應的就是進程的阻塞態,此時的進程還未完全做好準備,只能等到導致其阻塞的原因解決後才算是完全做好了準備,因此處於該狀態的進程稱為阻塞態

這裏我們需要清楚,當 CPU 空閒時,它會立即執行的是處於就緒態的進程,而不是處於阻塞態的進程。

1.2 CPU 與其他資源

在分時操作系統中,一切資源的使用都是以時間片的形式進行分配,而 CPU 和其他資源在分配過程中是有一定的區別:

  • CPU 在時間片輪轉機制中,每個進程分到的時間片是若干毫秒
  • 其他資源在時間片輪轉機制中,每個進程分到的時間片相對較長,甚至是原超過在 CPU 中分配到的時間片

這裏我們可以參考打印機的執行,當該進程被運行時,該進程在運行時會請求打印機的運行,這個過程可能就若干毫秒的時間,而整個打印的過程可能會有幾十秒、幾分鐘,甚至是更長的時間。

正是因為這種區別,這使得進程在運行的過程中會頻繁的轉換到就緒態,而轉換到阻塞態的次數相對較少。因此我們需要將 CPU 與其他資源分開進行説明。

二、狀態轉換

在操作系統中,進程所處的不同狀態如下所示:

graph LR
A[創建]--->|創建成功|b[就緒態]--->|調度|c[運行態]--->|退出|d[終止態]--->B[終止]
A--->|創建失敗|a[創建態]--->|創建成功|b
c--->|運行時間結束|b
c--->|等待某一事件發生<br>打斷進程運行|e[阻塞態]
e--->|等待的事件已經發生|b

這裏我簡單的説明一下上圖的含義:

  • 當某一進程正在被創建時會存在兩種結果:
    • 該進程創建成功時,該進程進入就緒態
    • 該進程創建失敗時,該進程進入創建態
  • 處於創建態的進程在滿足創建條件並創建成功後,該進程進入就緒態
  • 處於就緒態的進程會通過系統的調度進入到運行態
  • 處於運行態的進程在運行時會存在三種結果:
    • 該進程運行完成後或因為某些原因,而需要退出運行,進程由運行態進入到終止態
    • 該進程在運行的過程中需要等待某一事件的發生,該進程就會進入到阻塞態
    • 該進程在運行的過程中被分配的時間已經結束,該進程會重新回到就緒態等待下一次運行
  • 處於終止態的進程在完成了系統資源的回收與釋放後,該進程就會終止運行
  • 處於阻塞態的進程在中斷其運行的事件完成後,該進程會重新回到就緒態

2.1 三種基本狀態的轉換

這整個過程中,我們需要重點關注的是進程的三種基本狀態之間的轉換:

  • 就緒態 $->$ 運行態:處於就緒態的進程被調度後,獲得 CPU 資源(分配 CPU 的時間片),於是進程由就緒態轉換為運行態

  • 運行態 $->$ 就緒態:處於運行態的進程在時間片用完後,不得不讓出 CPU ,從而進程由運行態轉換為就緒態

    • 在可剝奪的操作系統中,當由更高優先級的進程就緒時,調度程序將正在執行的進程轉換為就緒態,讓更高優先級的進程執行
  • 運行態 $->$ 阻塞態:進程請求某一資源(如I/O設備)的使用和分配或等待某一事件的發生(如I/O操作的完成)時,它就從運行態轉換為阻塞態

    • 進程以系統調用的形式請求操作系統提供服務,這是一種特殊的、由運行用户態程序調用操作系統內核過程的形式。
  • 阻塞態 $->$ 就緒態:進程等待的事件到來時,如 I/O 操作完成或中斷結束時,中斷處理程序必須將相應進程的狀態由阻塞態轉換為就緒態

在這些狀態轉換中,運行態轉換到阻塞態的行為是主動發生; 阻塞態轉換到就緒態的行為是被動發生,需要其他相關進程的協助;

三、進程的組織

在操作系統中,進程有兩種組織方式:鏈接索引。下面我們簡單的瞭解一下這兩種方式;

3.1 鏈接方式

在操作系統中,會以管理隊列的形式進行進程的組織與管理:

  • 執行指針指向處於運行態的進程
  • 就緒隊列指針指向就緒隊列中的隊頭進程,並且為了方便管理,就緒隊列中會將優先級高的進程放在隊頭
  • 阻塞隊列指針指向阻塞隊列中的隊頭進程,並且在一些操作系統中會以阻塞原因的不同,將阻塞隊列分為不同的阻塞隊列

3.2 索引方式

在操作系統中,會以管理索引表的形式進行進程的組織與管理:

  • 處於不同狀態的進程會被放入不同的索引表中
  • 執行指針會指向處於運行態的進程
  • 就緒表指針會指向記錄了就緒態進程索引信息的就緒態索引表
  • 阻塞表指針會指向記錄了阻塞態進程索引信息的阻塞態索引表

結語

今天的內容到這裏就全部結束了。通過本文的學習,我們系統地掌握了操作系統中進程狀態與轉換的核心機制

進程並非靜態實體,它在生命週期中會經歷​​創建態​​、​​就緒態​​、​​運行態​​、​​阻塞態​​和​​終止態​​這五種狀態,形成一個完整的生命週期循環。

理解​​就緒態​​與​​阻塞態​​的本質區別是掌握進程調度的關鍵

  • 就緒態進程已獲得除CPU外的所有必要資源,只要獲得CPU即可立即運行;

  • 阻塞態進程則因等待某些事件(如I/O操作完成)而無法繼續執行,即使CPU空閒也無法運行。

進程狀態之間的轉換遵循嚴格的邏輯規律。三種基本狀態(就緒態、運行態、阻塞態)之間的轉換構成了進程併發執行的基礎:

  • 從就緒到運行通過進程調度實現;

  • 從運行到就緒常因時間片耗盡;

  • 從運行到阻塞多因資源請求或事件等待;

  • 而從阻塞到就緒則發生在等待事件完成時。

需要特別注意的是,​​運行態轉換到阻塞態是進程的主動行為,而阻塞態轉換到就緒態是被動行為​​,需要其他相關進程的協助。

操作系統通過​​進程控制塊(PCB)​​ 來跟蹤和管理每個進程的狀態信息,並採用​​鏈接方式​​(如就緒隊列、阻塞隊列)或​​索引方式​​來組織這些PCB,確保系統能夠高效地進行進程調度和狀態維護。

理解進程的狀態與轉換機制,是掌握操作系統如何實現多任務併發和資源管理的基石,也為進一步學習進程同步、進程通信等重要概念奠定了堅實基礎。

互動與分享

  • 點贊👍 - 您的認可是我持續創作的最大動力

  • 收藏⭐ - 方便隨時回顧這些重要的基礎概念

  • 轉發↗️ - 分享給更多可能需要的朋友

  • 評論💬 - 歡迎留下您的寶貴意見或想討論的話題

感謝您的耐心閲讀! 關注博主,不錯過更多技術乾貨。我們下一篇再見!