作業系統筆記(二):利用處理程序、執行緒來多工處理

第二篇作業系統筆記,會提到電腦是怎麼透過程式、處理程序和執行緒來多工處理。

這篇文章至少包含:處理程序(Process)、多執行緒(Multi-thread)。如果你有恐龍書的話,應該會對應到第三、第四章。

程式、處理程序是什麼

常常聽到人家在寫程式,或是打遊戲打到當掉要打開工作管理員結束處理程序。

這些東西到底是什麼?所謂程式(Program) 指的是一段靜態、可以被執行的指令集(就是一個 File);而處理程序(Process) 則是正在執行、已經載入到記憶體執行的程式碼,是 active 的。

Process 可以分為 Independent ProcessCooperating Process,簡單來說就是獨立運作的處理程序,或是會和別人共同合作的處理程序;又可以分為 I/O-bounded processCPU-bounded Process,等待鍵盤輸入或螢幕輸出的就是前者,比較吃 CPU 的(如算圓周率、解壓縮程式)就是後者。

Process 建立後,主要會包含:

  • CPU Registers
  • Stack(存放暫存資料:如函式參數、返回地址(return addresses)、區域變數等)
  • Code Section(又稱 text section、程式放在這裡)
  • Data Section(存放全域變數的地方)
  • Heap(動態產生的記憶體)
    和其他東西。

而作業系統為了管理那麼多 Process,會在 Kernel 中針對每一個 Process 建立一個表格或 Block,稱為 PCB(Process Control Block),記載該 Process 的相關資訊。

而所謂的分時多工就是指,CPU 在極短的時間內切換做不同的事情,短到讓我們感覺它同時在處理;既然 Process 不是同時被處理的,那麼 Process 就會有不同的狀態。以下是 Process 的五個狀態,這圖又稱為 Process State Diagram很重要

  • New(或稱 Created):是指 Process 被建立,但尚未配置 Memory,還在等待。
  • Ready:Long-term Scheduler 會決定要把哪些 Process 載入到 Memory,放在 Ready Queue 中等待執行。
  • Running:接著會由 Short-term Scheduler 決定哪些 Process 要讓 CPU 執行。在 Running 階段就是取得 CPU 執行階段。若該 Process 被中斷(Interrupt),也會回到 Ready 階段。
  • Wait(或稱 Blocked):Process 因為等待某些事件而放在這裡,例如 I/O 事件。之後會再回到 Ready Queue 中等待 Short-term Scheduler 分派(Dispatch)。
  • Terminated:最後 Process 結束工作。

還有一種東西叫 Medium-term Scheduler,不是每個作業系統都有。它會把 Process 從記憶體移開,必要的時候再把它放回來。

由於 Process 的狀態被改變,CPU 每次處理不同事情前後也都要把狀態存下來、重新載入,這個動作則稱為 Context Switch,就看硬體配備不同而會有不同的耗時。

通常 Context Switch 的時機:多工、中斷、System Call。

另外 Process 還會建立其他子 Process,最後 Process 會形成一個 樹狀結構。這就是為什麼你可以在工作管理員的處理程序頁面對 Chrome 按右鍵→ 結束處理程序樹狀目錄

Process 是怎麼溝通的?Process 溝通的方式叫做 IPC,Interprocess Communication,通常分為 Shared memoryMessage Passing。前者是共享一塊記憶體;後者是透過 send()receive() 來傳遞、接收資料。

執行緒(Thread)

如果你寫過 .Net 或 Java,應該或多或少聽過多執行緒(Threading)這東西。Thread 又被稱為 Lightweight Process,是作業系統中進行運算排程的最小單位,被包含在 Process 中。

Thread 有獨立的空間(Stack),可以做自己的事情;但多個 Thread 之間因為共用 Process 的記憶體,故可以共用變數。

早期 Single-thread 的程式在執行複雜操作時,整個 Process 容易被 block,所以視窗就卡在那裏不能動;但現在 Multi-thread 的程式,可以同時跟使用者互動和執行複雜運算。

單執行緒和多執行緒之比較:

Process 和 Thread 之比較:

Process Thread
OS 分配 資源 之對象單位 OS 分配 CPU 時間 之對象單位
Process 間並無共享記憶體 Thread 間共用同一個 Process 的記憶體
Process 的 Context Switch 慢,管理成本高 Thread 的 Context Switch 快,管理成本低

Multithread Model 之比較

執行緒也有分為在 User mode 執行的和在 Kernel mode 執行的,就稱為 User thread 和 Kernel Thread。

而 User thread 和 Kernel thread 之間的溝通有三種模式:Many-to-oneOne-to-oneMany-to-many

Many-to-one

多個 User thread 都只和一個 Kernel thread 溝通,好處是 User thread 要開幾個都沒問題,但是對多核心處理器(Multi-processor)來說很可惜。

One-to-one

每次產生一個 User thread,Kernel 就會產生一條 Kernel Thread 來跟它互動,算是真正實現同時處理的概念;但因為 Kernel 沒辦法產生那麼多 Thread,通常會限制 User thread 的數量。

Many-to-Many

有一堆 Kernel thread 和一堆 User thread 同時對應來對應去,你看你看到這句話腦袋都沒有畫面,你就知道這種架構實作起來比較複雜了,所以知道有這種架構就好了。雖然多對多感覺比較潮,但實際上效率並沒有 One-to-one 好。

Thread Pool

Thread pool 就是一個充滿 Thread 的地方。雖然 Thread 產生相對比 Process 快很多,但產生還是要時間嘛!為了節省時間到一個極致,平常就產生一些 Thread 起來放,要用的時候可以隨時拿出來用。 這個地方就是 Thread Pool。

後記

部分圖片取自這裡並再修改。

還有為什麼 User thread 都長得那麼像染色體?

參考資料

複習一下?

作業系統筆記 目錄