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

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

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

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

這篇文章至少包含:處理程序(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 的相關資訊。

pcb

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

process_std

  • 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 的程式,可以同時跟使用者互動和執行複雜運算。

單執行緒和多執行緒之比較:
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)來說很可惜。

Many2one

One-to-one

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

One2one

Many-to-Many

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

Many2many

Thread Pool

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

後記

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

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

參考資料

複習一下?

作業系統筆記 目錄

我們正降低廣告比例以提升閱讀體驗。如果你喜歡這篇文章,不妨按下 Like 按鈕分享到社群,以行動支持我寫更多文章。 當然,你也可以 點此用新臺幣支持我,或 點此透過 BTC、ETH、USDC 等加密貨幣支持我
分享到: