我是心原一馬,接下來整理第三章的內容。
上一篇: 【小黑馬作業系統教室】(5) (Ch2)常見的OS結構
要我說OS第三章最重要的圖,
大概屬底下這張了吧:
這張圖展示了一個程式(process)的生命週期,
一開始這張圖對小馬來說是相當難理解的,
因為小馬怎麼樣也想不到說程式會細分為五個狀態。
對於初學程式來說,寫程式的過程無非就是
「寫程式碼」->「按下編譯按鈕執行」->「程式結束」,
所以真的要猜的話,頂多猜程式有三個狀態: 「new」->「running」->「terminated」。
會有五個狀態,大概就是描述有多個程式的互動關係了。
從字面上意思,大概可以了解粗略的意思:
new: 程式剛創建的階段
ready: 程式準備就緒,就等OS安排執行了
running: 程式正在執行中
waiting: 等候system call完成
terminated: 程式已經執行完畢
另外,從字面上意思,
「ready」和「waiting」這兩個狀態尤其難理解,
它們看起來都具有「等待」的意思,究竟分別在等什麼呢?
為了更容易地理解,
小馬決定再引入動畫的比喻:
(圖片來源: 動畫<暗殺教室>第一季第六集)
關於這張圖,在自己的作業系統教學的系列文第三篇、第四篇都有出現,
講的是這位「章魚老師」可以用20倍音速移動,
快速來回穿梭於教室之間,
達到「同時」幫幾十個同學們輔導課業的效果。
小馬自己還蠻喜歡這個比喻的,
這邊我們就以老師和學生的互動過程,
用來比喻OS跟程式之間的互動過程,
來看看程式如何在五個狀態之間切換。
我們現在就想像這樣一個情境:
由於期末考快到了,
很有熱忱的「章魚老師」決定開一個課後輔導時間,
透過快速穿梭於教室「同時」幫學生們輔導課業,
讓有需要的同學自由參加。
那麼…
new-> ready : 假設原來有19個學生在教室接受老師輔導,新來了一個學生,變成同時有20個學生接受老師輔導,那麼新來的那個學生便猶如由「new state」切換到「ready state」。
(比喻: 作業系統本來管理19支程式,新增一支程式)
ready, running state間互換稱為「context switch」:
在【小黑馬作業系統教室】(4)介紹過context switch一詞,
章魚老師快速來回穿梭於教室之間的動作,
輪流解決學生的問題,稱為「context switch」。
(比喻: OS快速交替選出程式給CPU執行)
接下來再對於兩個狀態互換來講:
ready->running:
如何決定要換哪支程式給CPU執行呢?
在OS上實際上有支叫做scheduler的程式進行程式的排程,
CPU一次只會執行一支程式,
scheduler會決定下一個給CPU執行的程式是哪個。
以比喻來說的話,
就是彷彿「章魚老師」每次在選擇要處理哪個學生的問題時,
有個類似「小老師」或是「助教」的職位幫老師決定。
running->ready:
透過interrupt打擾CPU,
對於interrupt是什麼有在【小黑馬作業系統教室】(3)細講了,
不過這邊講的interrupt除了程式有特別需求去打斷CPU以外,
更多的interrupt可能是來硬體「Timer」的打斷。
「Timer」類似一個「鬧鐘」,
因為不希望有的程式一直無限等待都沒被執行到,
(比喻: 不希望有的學生一直等待問問題但老師都不鳥他)
因此「Timer」每隔一段時間會固定發出一個interrupt打斷CPU,
告訴CPU說時間到了,該換人了。
running-> waiting:
那什麼時候程式會從running state切換到waiting state呢?
就是程式要做一件耗時的事情時,比如說I/O (之前說過I/O是input/output的簡稱),
(這點可能要寫程式的人比較有感覺,讓程式在螢幕上印出文字遠比做加法運算耗時)
OS就會先把CPU的資源讓出來給其它程式使用,
做I/O的程式便進入 waiting state。
以學生的比喻來說就是學生中途想去「上廁所」,
「上廁所」是一件耗時的事情,
那這時老師自然先處理其它學生的問題。
waiting->ready:
當程式將耗時的事情(比如: I/O)做完時,
程式就會回到ready state等候OS安排給CPU執行,
好比說學生上完廁所回到教室一樣。
running-> terminated:
程式執行完畢。
(比喻: 學生參加自由的課後輔導,由於問題都問完了,離開教室。)
講完了程式的生命週期,
我們可以看到在OS上是有支叫做scheduler的程式,
用來管理程式。
(比喻: 「章魚老師」有個「小老師」或是「助教」管理學生在教室的進出,或決定換誰給老師處理問題)
依據不同的程式狀態切換,
scheduler可以分為三種。
先整理到這裡吧。