作業系統筆記(二):利用處理程序、執行緒來多工處理
第二篇作業系統筆記,會提到電腦是怎麼透過程式、處理程序和執行緒來多工處理。
這篇文章至少包含:處理程序(Process)、多執行緒(Multi-thread)。如果你有恐龍書的話,應該會對應到第三、第四章。
程式、處理程序是什麼
常常聽到人家在寫程式,或是打遊戲打到當掉要打開工作管理員結束處理程序。
這些東西到底是什麼?所謂程式(Program) 指的是一段靜態、可以被執行的指令集(就是一個 File);而處理程序(Process) 則是正在執行、已經載入到記憶體執行的程式碼,是 active 的。
Process 可以分為 Independent Process 和 Cooperating Process,簡單來說就是獨立運作的處理程序,或是會和別人共同合作的處理程序;又可以分為 I/O-bounded process 和 CPU-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 memory 和 Message 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-one、One-to-one、Many-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 都長得那麼像染色體?
參考資料
- OS - Ch3 行程 Process
- 04. 多執行緒 (Multi-thread)
- Os讀書會20170415
- Threads: the difference of concurrency between many-to-one model and one-to-one model
- 感謝 Cyku、Gene Kuo 協助撰文
複習一下?
作業系統筆記 目錄
- 作業系統筆記(一):電腦怎麼處理各種作業的?
- 作業系統筆記(二):利用處理程序、執行緒來多工處理
- 待續