iT邦幫忙

2025 iThome 鐵人賽

DAY 10
0
Software Development

用作業系統讀懂另一半的OS系列 第 10

【2025鐵人賽】用作業系統讀懂另一半的OS:CPU Scheduling 01

  • 分享至 

  • xImage
  •  

談完Process跟Thread後,就可以來看CPU排成的一個方式了~

題外話,今年四五月那時候,那是一段低潮期——當時遭遇了指導教授的嚴厲指正,感情、學業、自己的事都剛好在同一時間爆掉。我那時候完全崩潰了,也是從那段時間開始接觸安眠藥。
因為這些事,並不是可以跟別人提起的,所以只能在夜深人靜時,從那時起,包括在寫這篇文章的此時此刻,就是一個人在床上,靜靜著想著,自己身上發生的所有事。可以補救的,就盡力去補救;喜歡的人錯過了,挽回不了只能一遍又一遍的勸自己放下(不過說真的,好難放下歐...)

今天剛好在跟指導教授講公事的時候,指導教授回這一句:
https://ithelp.ithome.com.tw/upload/images/20250806/20177764AFNJPDQuBt.jpg
坦白說,我知道這是教授的鼓勵,但...我並沒有任何的喜悅。
這一段話的背後,我真的改了好多好多,改了個性,改了講話/打訊息的時間、頻率,話也都用GPT矯正過好多次,只為了看起來更成熟、穩重、不添麻煩。

在試著理解別人的期待之中,學會調整自己的樣子;在跌跌撞撞的適應裡,摸索什麼叫「被接受」。也許,不是所有的成長都會讓人開心,有些只是靜靜地,把自己最純粹的樣子藏起來。
心裡有點酸,有點累,但...就這樣吧。

在單核心系統中,CPU 在同一時間只能服務一個 process,因此 Scheduling 的目的,是為了決定讓誰處理,誰等著。這這樣是為了:不讓 CPU 閒著:如果某個 process 卡在 I/O,CPU 就可以轉去處理其他 process,資源不浪費。

而到了現代多核心系統中,每一個核心都像一台小 CPU,可以同時跑一個 process。因此:

  • 系統可以同時執行多個 process(或 thread),不是輪流,而是真正的「並行」。
  • Scheduler 不只要安排誰接替誰,還要決定哪個 process 放到哪顆核心上(這就涉及到 CPU affinity、load balancing 等議題)。

CPU–I/O Burst Cycle

每個 process 執行的模式大概會長這樣:

CPU Burst → I/O Burst → CPU Burst → I/O Burst → … 最後結束

其中:

  • CPU Burst是指CPU再處理Process的時間(CPU 忙著幫你運算邏輯)。
  • I/O Burst是指CPU等待資料的時間(例如檔案還沒讀進來、網路還沒回應)

對於CPU Burst,多數是短時間(exponential 分布),少數是長時間。而且可以在進一步細分:

  • I/O-bound 程式:很多小 CPU burst → 等 I/O
  • CPU-bound 程式:少量但長 CPU burst → 不太等 I/O

https://ithelp.ithome.com.tw/upload/images/20250726/20177764bRMBfhKX5q.png

https://ithelp.ithome.com.tw/upload/images/20250806/201777645btCUoE5YE.jpg

可搶佔(Preemptive) vs 不可搶佔排程(Nonpreemptive Scheduling)

接下來要講Scheduling很重要的名詞:Preemptive跟Nonpreemptive。
Preemptive(可搶佔)指的是OS可以強制讓 process中斷,把 CPU 分給別人。Preemptive的優點是比較快,也比較公平(大家都有得用ww)。但缺點就是,對於正在使用的process,就是用到一半硬生生被別人搶斷。而這樣的過程中,就會發生資料競爭(race condition),也因此,我們會在後續討論到「鎖」來保護資料。

在感情中,不可以公平,要專一,要給唯一的人你的偏愛歐。
https://ithelp.ithome.com.tw/upload/images/20250806/201777647thlMmaZXm.jpg

而Nonpreemptive(不可搶佔)指的是,Process就像個很容易吃醋,佔有慾極重的天蠍一樣(Me?),不放下誰也不能搶。只有當自己真的累了,承認「我沒辦法陪你走下去了」才有可能輪到其他Process進入到她的生活當中(好像偏題了?

https://ithelp.ithome.com.tw/upload/images/20250806/20177764szy3OY06Ok.jpg

而Linux、Windows等現代作業系統幾乎都支援可搶佔排程,因為效率與互動性都更好。

哪些情況會觸發「排程決策」

那在Scheduling上,哪些情況會觸發排程決策這件事呢?我們拆開來看:
當Process 從 running → waiting(例如:要 I/O)=> 非搶佔式(Nonpreemptive)。
當Process 從 running → ready(例如:被中斷)=> 搶佔式(Preemptive)。
當Process 從 waiting → ready(I/O 完成)=> 搶佔式(Preemptive)。
當Process 結束=> 非搶佔式(Nonpreemptive)。

派遣器(Dispatcher)

上述所提到的Scheduling中,負責排的人就是Scheduler。但實際在執行是Dispatcher。負責安排process,而實際在調動的就是Dispatcher。

假設你今天在打球,場上的球員(process)要換人,裁判就要決定誰上場。scheduler就是擔任裁判的角色,決定誰可以上場。而真正把球員帶上場、讓他站到正確位置準備接球的,叫做派遣器(dispatcher)。

具體而言,Dispatcher主要做四件事:

  1. 將舊process 的 context 到 PCB ,
  2. 將新的process放進來
  3. 切換到user mode
  4. 跳至新程式該跑的程式碼位置

那這邊可以在跟跟前面的議題討論,

Context switch是由Scheduler還是Dispatcher執行的呢?答案是Dispatcher歐~
此外,我們還要確保Dispatch Latency(派遣延遲)(也就是一次 context switch 所花的時間)盡可能地降低。因為在因為Context switch中,CPU是在等待的。如果Dispatch Latency時間太久,CPU 就會閒著沒事做,造成整體效率變差。


上一篇
【2025鐵人賽】用作業系統讀懂另一半的OS:Threads & Concurrency 02
下一篇
2025鐵人賽】用作業系統讀懂另一半的OS:CPU Scheduling 02
系列文
用作業系統讀懂另一半的OS30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言