Udemy Course Multithreading, Concurrency & Performance 2

系統基礎2

ZONGRU Li
Jun 19, 2021

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:

  1. Context Switch 不便宜,但卻是multitasking(concurrency)必需的花費
  2. 更多時間去focus
  3. 每個Thread都會消耗CPU與Memory資源
  4. 當不同Thread切換時:

一個Thread儲存Data

另一個Thread恢復Data進CPU與Memory

Context Switch關鍵點:

  1. 過多Thread會造成Thrashing(指消耗更多時間在管理Threads(Context switch),而非實際的Task(任務)上)
  2. Thread消耗資源比Process少!
  3. 如上故Context switch在同一個Process內不同Threads切換會比不同Process間的Threads切換要來得便宜!

Thread Scheduling:

如何設計不同Threads的執行順序?

假設現在運行兩個應用程式

  1. 音樂撥放器: Thread 1(音樂控制) + Thread 2(UI介面)
  2. 文字編輯器: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的設計

或著是

Multi-Process設計

選擇Multi-Thread好處:

  1. Thread間分享Data
  2. Threads能夠比較快地建立或移除
  3. 在同一個Process內的Thread Switch比較迅速(比不同Process(Context) Switch)

選擇Multi-Process好處:

  1. 有更好的安全性與穩定性(每個Process間是isolated,在Multi-Thread的Process內單一個Thread可能造成整個app異常甚至shut down整個app)
  2. 不同任務區分於不同Process比較不會混淆

參考課程

--

--

ZONGRU Li
ZONGRU Li

Written by ZONGRU Li

2022/11/17 開源部分個人筆記給LINE "Java程式語言討論區"社群,希望能對社群的技術學習做一點點貢獻.(掩面....記得退訂閱!

No responses yet