更新於 2024/12/09閱讀時間約 8 分鐘

程式與執行緒(Process Management)

上篇著重於作業系統在硬體的角色還有記憶體 硬體運作的基本機制(資料處理流程)

本篇學習目標:了解作業系統如何管理程式

Process、Thread 和 Process Control Block(PCB)

在作業系統裡,程式的執行涉及三個重要概念:ProcessThreadProcess Control Block(PCB)

  • Program:還沒執行時,它只是靜態的檔案,比如 .exe 檔案或某個應用程式。
  • Process:當你打開程式時,程式被載入記憶體,成為一個 Process,這時它已經開始消耗記憶體和 CPU 資源了。每個 Process 都是獨立的,擁有自己的記憶體空間和執行狀態。舉例:你同時開啟音樂播放器和文字編輯器,這兩個程式就是兩個 Process。
  • Thread:一個 Process 可以包含多個 Thread,這些 Thread 共享 Process 的資源(如記憶體)。執行緒是「真正在跑任務」的單位。一個 Process 有多個 Thread 時,可以同時執行不同的任務。舉例:在音樂播放器裡,一個 Thread 處理播放音樂,另一個 Thread 處理下載歌曲。

簡單來說,Process 像是一個運作中的工廠,而 Thread 是工廠裡的工人,他們各司其職,但又共享同一套資源。

Process Control Block(PCB)

  • PCB 是作業系統用來管理 Process 的資料結構,每個 Process 都有一個 PCB,記錄它的所有資訊,包括:
    • Process 的狀態(運行中、等待中等)。
    • 分配的記憶體和資源。
    • CPU 的寄存器狀態(暫停執行時,CPU 的暫存資料)。

舉例:當你暫停一個遊戲時,作業系統會把遊戲的狀態存到 PCB,等你重新開始遊戲時,PCB 的資料可以幫助遊戲從中斷的地方繼續運行。

以工廠來比喻,PCB 是像是「生產進度報告表」記載訂單資訊、生產狀態(待料、生產中等等)。



Context Switch 的運作方式

當 CPU 需要從執行一個 Process 切換到另一個 Process 時,會進行以下步驟:

  1. 保存當前 Process 的上下文(Context)
    • 把這個 Process 的執行狀態存到 Process Control Block(PCB)裡,包括 CPU 的寄存器內容、記憶體位置、程序計數器(Program Counter,記錄下一條指令的位置)等。
  2. 切換到新 Process 的上下文
    • 從新 Process 的 PCB 中讀取已保存的上下文,恢復它的執行狀態。
  3. 繼續執行新 Process
    • CPU 開始執行新 Process 的指令,這樣看起來就像兩個程式在「同時運行」。

舉例:像寫作業被打斷

  • 你正在寫作業(Process A)。
  • 電話響了,你得接電話(Process B),所以你先把作業的進度記錄好(保存 A 的上下文)。
  • 接完電話後,你看回作業進度(讀取 A 的上下文),然後繼續寫作業。

為什麼需要 Context Switch?

Context Switch 的存在是為了讓多個 Process 和 Thread 能公平分享 CPU 資源。例如:

  • 你在聽音樂(Process 1)。
  • 你同時用瀏覽器上網(Process 2)。
  • 作業系統會快速在這兩個 Process 之間切換,讓音樂不會中斷,網頁也能即時顯示。

圖片來源:FANG Interview Question | Process vs Thread


Process state 行程狀態(Process state)

行程狀態(Process State):程式是怎麼「跑起來」的?

圖片來源

AppWorks School Batch #16 Front-End Class 學習筆記&心得(Week 17)

Process 的運作就像我們做作業的流程:先準備資料、再執行計算,最後交作業完成。同樣,行程的狀態大致分為五種:NewReadyWaitingRunningTerminated


五大狀態解釋

1. New(新生狀態)

新生狀態就像剛剛被老師分配作業的時候,還沒動手,只是程式剛開始被建立,還沒準備好運行。

例子:假設我們開啟了一個遊戲,這時候遊戲的程式還在載入,它的狀態就是 New。

2. Ready(準備狀態)

程式已經準備好了,資源也分配好了,就等 CPU 調度它去執行。

注意!

Ready 並不會直接到 Running!因為 CPU 會優先處理其他更急的任務。所以,Ready 的程式要先排隊進入 Waiting 狀態,等到時機成熟再執行。

例子:好比我們準備好了筆記本和筆,但老師(CPU)還在幫其他同學改作業,我們只能先坐著等。


3. Waiting(等待狀態)

到了這裡,有些同學可能會想:「老師,為什麼程式準備好還要等?」

原因是什麼?因為它還需要其他的條件才能執行!

例如:

  • 它可能在等資料讀取完成(比如讀硬碟上的檔案)。
  • 或者在等網路連線(像下載檔案時)。
    等這些資源準備好,它才有機會進一步執行。

4. Running(執行狀態)

終於輪到這個程式了!CPU 開始執行它的指令。這時候,程式處於「工作進行中」的狀態,正式使用 CPU 資源。

例子:像是在玩遊戲的時候,CPU 一直處理你的操作指令,比如控制角色移動、戰鬥等。


5. Terminated(終止狀態)

當程式執行完畢,或因為其他原因被終止,程式就會進入這個狀態。它已經完成任務,釋放資源,從作業系統的排程中消失。

例子:遊戲結束,畫面關閉,程式完成它的使命。


Ready 為什麼不直接到 Running?來畫圖搞清楚!

行程的狀態變化,其實是有一定順序的:

New → Ready → Waiting → Running → Terminated
  1. New → Ready
    程式剛建立,載入必要資料後,準備好等待執行。
  2. Ready → Waiting
    雖然 Ready 表示程式準備好了,但因為 CPU 資源有限,還需要等到它排到隊,才能進一步執行。
  3. Waiting → Running
    當程式的資源(如 I/O 資料)到位、CPU 空閒時,才會切換到 Running。
  4. Running → Waiting(有時候會這樣):
    如果程式在執行中需要其他額外資源,例如等待硬碟讀取,會暫時被中斷,重新回到 Waiting。
  5. Running → Terminated
    執行完成,或因錯誤而終止,正式結束。

小結一下!

Ready 不會直接跳到 Running,因為作業系統還需要進行「資源調度」和「等待」步驟,確保所有資源都到位,CPU 才能開始工作!

分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.