談完Process跟Thread後,就可以來看CPU排成的一個方式了~
題外話,今年四五月那時候,那是一段低潮期——當時遭遇了指導教授的嚴厲指正,感情、學業、自己的事都剛好在同一時間爆掉。我那時候完全崩潰了,也是從那段時間開始接觸安眠藥。
因為這些事,並不是可以跟別人提起的,所以只能在夜深人靜時,從那時起,包括在寫這篇文章的此時此刻,就是一個人在床上,靜靜著想著,自己身上發生的所有事。可以補救的,就盡力去補救;喜歡的人錯過了,挽回不了只能一遍又一遍的勸自己放下(不過說真的,好難放下歐...)今天剛好在跟指導教授講公事的時候,指導教授回這一句:
坦白說,我知道這是教授的鼓勵,但...我並沒有任何的喜悅。
這一段話的背後,我真的改了好多好多,改了個性,改了講話/打訊息的時間、頻率,話也都用GPT矯正過好多次,只為了看起來更成熟、穩重、不添麻煩。在試著理解別人的期待之中,學會調整自己的樣子;在跌跌撞撞的適應裡,摸索什麼叫「被接受」。也許,不是所有的成長都會讓人開心,有些只是靜靜地,把自己最純粹的樣子藏起來。
心裡有點酸,有點累,但...就這樣吧。
在單核心系統中,CPU 在同一時間只能服務一個 process,因此 Scheduling 的目的,是為了決定讓誰處理,誰等著。這這樣是為了:不讓 CPU 閒著:如果某個 process 卡在 I/O,CPU 就可以轉去處理其他 process,資源不浪費。
而到了現代多核心系統中,每一個核心都像一台小 CPU,可以同時跑一個 process。因此:
每個 process 執行的模式大概會長這樣:
CPU Burst → I/O Burst → CPU Burst → I/O Burst → … 最後結束
其中:
對於CPU Burst,多數是短時間(exponential 分布),少數是長時間。而且可以在進一步細分:
接下來要講Scheduling很重要的名詞:Preemptive跟Nonpreemptive。
Preemptive(可搶佔)指的是OS可以強制讓 process中斷,把 CPU 分給別人。Preemptive的優點是比較快,也比較公平(大家都有得用ww)。但缺點就是,對於正在使用的process,就是用到一半硬生生被別人搶斷。而這樣的過程中,就會發生資料競爭(race condition),也因此,我們會在後續討論到「鎖」來保護資料。
在感情中,不可以公平,要專一,要給唯一的人你的偏愛歐。
而Nonpreemptive(不可搶佔)指的是,Process就像個很容易吃醋,佔有慾極重的天蠍一樣(Me?),不放下誰也不能搶。只有當自己真的累了,承認「我沒辦法陪你走下去了」才有可能輪到其他Process進入到她的生活當中(好像偏題了?
而Linux、Windows等現代作業系統幾乎都支援可搶佔排程,因為效率與互動性都更好。
那在Scheduling上,哪些情況會觸發排程決策這件事呢?我們拆開來看:
當Process 從 running → waiting(例如:要 I/O)=> 非搶佔式(Nonpreemptive)。
當Process 從 running → ready(例如:被中斷)=> 搶佔式(Preemptive)。
當Process 從 waiting → ready(I/O 完成)=> 搶佔式(Preemptive)。
當Process 結束=> 非搶佔式(Nonpreemptive)。
上述所提到的Scheduling中,負責排的人就是Scheduler。但實際在執行是Dispatcher。負責安排process,而實際在調動的就是Dispatcher。
假設你今天在打球,場上的球員(process)要換人,裁判就要決定誰上場。scheduler就是擔任裁判的角色,決定誰可以上場。而真正把球員帶上場、讓他站到正確位置準備接球的,叫做派遣器(dispatcher)。
具體而言,Dispatcher主要做四件事:
那這邊可以在跟跟前面的議題討論,
Context switch是由Scheduler還是Dispatcher執行的呢?答案是Dispatcher歐~
此外,我們還要確保Dispatch Latency(派遣延遲)(也就是一次 context switch 所花的時間)盡可能地降低。因為在因為Context switch中,CPU是在等待的。如果Dispatch Latency時間太久,CPU 就會閒著沒事做,造成整體效率變差。