Udemy Course Multithreading, Concurrency & Performance 2
Context Switch:
如前述,每個應用程式在執行時都有各自的Process ID
而每一個Process都含至少一個以上的Thread在運行
這些Thread各自爭相使用著CPU資源
一般情況下是一個Thread使用完CPU資源,該Thread Stop
接著換下一個Thread使用CPU資源,接著該Thread Stop…
而Context Switch則是指這個切換過程,例如:
Stop Thread 1
Schedule Thread 1 Out
Schedule Thread 2 In
Start Thread 2
Context Switch Cost:
- Context Switch 不便宜,但卻是multitasking(concurrency)必需的花費
- 更多時間去focus
- 每個Thread都會消耗CPU與Memory資源
- 當不同Thread切換時:
一個Thread儲存Data
另一個Thread恢復Data進CPU與Memory
Context Switch關鍵點:
- 過多Thread會造成Thrashing(指消耗更多時間在管理Threads(Context switch),而非實際的Task(任務)上)
- Thread消耗資源比Process少!
- 如上故Context switch在同一個Process內不同Threads切換會比不同Process間的Threads切換要來得便宜!
Thread Scheduling:
如何設計不同Threads的執行順序?
假設現在運行兩個應用程式
- 音樂撥放器: Thread 1(音樂控制) + Thread 2(UI介面)
- 文字編輯器:Thread 3(檔案處理) + Thread 4(UI介面)
Q1:假設Thread 3與Thread 1處理時間較剩餘的Thread長
如果設計成誰先執行誰就先? 例如順序為:
Thread 3 → Thread 1 → Thread 4 → Thread 2
A1:上述將造成極差的Responsiveness(亦即較差的使用者體驗)
Q2又如果設計為短的執行Thread先?
A2:若有多個應用程式執行時,可能會造成永遠輪不到Thread 1與Thread 3
所以一般的作業系統是如何做Thread Scheduling?
→一般作業系統會切分適當的時間(時程)稱之為Epoch!
每一段Epochs內會再切分給不同的Threads使用
而不會有單一Thread佔用整個Epoch
而作業系統如何決定怎麼分配Epoch給Thread是基於Thread的:
Dynamic Priority = Static Priority + Bonus (bonus 可為負)
Static Priority :由開發者於程式中設定
Bonus:由作業系統於每個epoch中調整給予每個Thread
由前面例子,作業系統藉由Dynamic Priority將會給較優先給予Thread 2(UI介面)及Thread 4(UI介面)或是前一個epoch中尚未完成的Thread以避免停滯(Preventing Starvation)
如何決定應用程式設計為multithread或其他方式亦即:
或著是
選擇Multi-Thread好處:
- Thread間分享Data
- Threads能夠比較快地建立或移除
- 在同一個Process內的Thread Switch比較迅速(比不同Process(Context) Switch)
選擇Multi-Process好處:
- 有更好的安全性與穩定性(每個Process間是isolated,在Multi-Thread的Process內單一個Thread可能造成整個app異常甚至shut down整個app)
- 不同任務區分於不同Process比較不會混淆