Process vs Thread

Program/Process/Thread 差異

Samuel Liu
6 min readSep 24, 2021

Program: 尚未load入記憶體的 code,如同軟體的藍圖

Process: 已經執行並且 load 到記憶體中的 Program。點開應用程式就是將 Program 活化成 Process。可以想像Process為正在作業的工廠,而Program是工廠的藍圖。

以下條列幾點 Process 的觀念 —

  • Process 是電腦中已執行 Program 的實體。
  • 每一個 Process 是互相獨立的。
  • Process 本身不是基本執行單位,而是 Thread (執行緒)的容器。
  • Process 需要一些資源才能完成工作,如 CPU、記憶體、檔案以及I/O裝置。
  • 在多功作業系統(Multitasking Operating System)中,可以同時執行數個Process ,然而一個CPU核心一次只能執行一個 Process (因此才有現在的多核處理器),而 Process 的運行量總量不會少於 CPU 的總量,又Process 會佔用記憶體,因此如何排程(Scheduling,恐龍本第五章) 、如何有效管理記憶體(恐龍本第八章)則是 OS 所關注的事。

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

而作業系統為了管理那麼多 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 從記憶體移到HDD的virtual memory,必要的時候再把它放回來。

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

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

Thread: 在同一個 Process 中會有很多個 Thread ,每一個 Thread 負責某一項功能。以聊天室 Process 為例,可以同時接受對方傳來的訊息以及發送自己的訊息給對方,就是同個 Process 中不同 Thread的功勞。Thread 就是工廠內的工人,確保工廠的每項功能,並且共享工廠內的每一項資源。

以下條列幾點 Thread 的觀念 —

  • 同一個 Process 會同時存在多個 Thread。
  • 同一個 Process 底下的 Thread 共享資源,如 記憶體、變數等,不同的Process 則否。
  • 在多執行緒中(Multithreading),兩個執行緒若同時存取或改變全域變數(Global Variable),則可能發生同步(Synchronization,恐龍本第六章)問題。若執行緒之間互搶資源,則可能產生死結(Deadlock,恐龍本第七章),同樣的,如何避免或預防上述兩種情況的發生,依然是 OS 所關注並改善的。

Thread 共享的資源有global variables, static variables(bss area, data area), text area, dynamic allocated variables(heap area).

Thread的local variables, stack裡的variables是不共享的

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

Process 和 Thread 之比較:

Process
1. OS 分配 資源 之對象單位
2. Process 間並無共享記憶體
3. Process 的 Context Switch 慢,管理成本高

Thread
1. OS 分配 CPU 時間 之對象單位
2. Thread 間共用同一個 Process 的記憶體
3. Thread 的 Context Switch 快,管理成本低

Reference:
https://noob.tw/operating-system-multitasking/
https://medium.com/@yovan/os-process-thread-user-kernel-%E7%AD%86%E8%A8%98-aa6e04d35002(此篇有延伸user-level thread/kernel-level thread)

--

--

No responses yet