上篇著重於作業系統在硬體的角色還有記憶體 硬體運作的基本機制(資料處理流程)
本篇學習目標:了解作業系統如何管理程式
Process、Thread 和 Process Control Block(PCB)
在作業系統裡,程式的執行涉及三個重要概念:Process、Thread 和 Process 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 時,會進行以下步驟:
- 保存當前 Process 的上下文(Context)
- 把這個 Process 的執行狀態存到 Process Control Block(PCB)裡,包括 CPU 的寄存器內容、記憶體位置、程序計數器(Program Counter,記錄下一條指令的位置)等。
- 切換到新 Process 的上下文
- 從新 Process 的 PCB 中讀取已保存的上下文,恢復它的執行狀態。
- 繼續執行新 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 的運作就像我們做作業的流程:先準備資料、再執行計算,最後交作業完成。同樣,行程的狀態大致分為五種:New、Ready、Waiting、Running 和 Terminated。
五大狀態解釋
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
- New → Ready:
程式剛建立,載入必要資料後,準備好等待執行。 - Ready → Waiting:
雖然 Ready 表示程式準備好了,但因為 CPU 資源有限,還需要等到它排到隊,才能進一步執行。 - Waiting → Running:
當程式的資源(如 I/O 資料)到位、CPU 空閒時,才會切換到 Running。 - Running → Waiting(有時候會這樣):
如果程式在執行中需要其他額外資源,例如等待硬碟讀取,會暫時被中斷,重新回到 Waiting。 - Running → Terminated:
執行完成,或因錯誤而終止,正式結束。
小結一下!
Ready 不會直接跳到 Running,因為作業系統還需要進行「資源調度」和「等待」步驟,確保所有資源都到位,CPU 才能開始工作!