Program
定義
放在二級儲存裝置 (硬碟) 中,沒有被加載到記憶體的一堆 Code ,中文又稱「程式」,可以想像成它是死的。
Process
定義
已經被加載到記憶體,並且程式碼隨時都會被 CPU 所執行,且其宣告的在記憶體的變數的值會隨著需求而不斷變動,包含程式計數器(process counter)、堆疊(stack)、資料區段(data section)、堆積(heap)。中文稱之為「行程」,可以想像成它是活的。
現代執行緒設計導向的系統中,行程本身不是基本執行單位,而是執行緒的容器
五大狀態
new
:行程新產生中,已分得 PCB 空間,尚未被載入記憶體。running
:獲取 CPU,正在執行。waiting
:在 Waiting Queue 等待 I/O Completed 或 Event Occurs,例如等待使用者輸入完成,亦稱「阻塞」(blocked)。ready
:已在記憶體內,且在 Ready Queue 排班中,等待 CPU。terminated
:完成執行,其 PCB 可能尚未回收,要等其 Parent Process 收集該子 Process 成果才會。
記憶體配置
Stack
:存放函數的參數
、區域
變數等。(會稱作 stack 是由於其配置遵守 LIFO
)Heap
:一般由程式設計師分配釋放,執行時才會知道配置大小,如malloc/new
和free/delete
。(注意其資料結構不是 DS 中的 heap 而是link-list
)BSS
:未初始化
的靜態變數Data
:全域
變數、靜態
變數text/code
:常量字元串
配置練習
1 | int a=0; //global 初始化區 |
Thread
定義
是 OS 能夠進行運算排程的最小單位,它被包含在 process 之中,是 process 中的實際運作單位。一個Process的全域變數可以讓它的所有 Threads 共享,而每個 Thread 也有自己的專屬的變數。
記憶體配置
Thread ID
:執行緒 ID。Thread State
:執行緒狀態。Process Counter
:程式計數器,負責記錄下一個要執行程式的地址。CPU Register value
:指的是 cpu 的暫存器的內容,專門暫存指令、資料和位址的記憶體空間。Stack
:負責存放 process 活動過程需要調用的指令及區域變數。
Threads 內會共享
Code Section
:程式碼區域
,每一個行程都是因為執行某段程式碼
而開啟的。Data Section
:資料區域
,代表行程會用到哪些資源
。OS Resources
Code section + Data section = memory space, Address space, Heap memory
MultiThread 的好處
- 允許程式中的某部份
被中斷
或是執行得非常久
時,該程式仍然可以繼續執行
。 - 分享
Code/Data Section
和OS 資源
。 輕量化
的 process。(context switch 一個 thread 比 process快約 5 倍
,建立一個 thread 比 process快約 13 倍
。)- 可使用
多處理器架構
: 使用多核心
。
總結
- Thread 是系統處理工作的基本單元。
- Thread 是 OS 分配 CPU 時間的對象;Process 是 OS 分配資源的對象。
- 一個 Process 會同時存在多個 Thread。
- 一個 Process 底下的 Thread 共享資源,如記憶體、全域變數 (Global Variable) 等,不同的 Process 則否。
- OS 會根據 Thread 的優先權以及使用過的 CPU 時間,在不同的 Thread 作切換,讓各個 Thread 都有執行的機會。
參考資料
- https://www.mropengate.com/2015/01/operating-system-ch4-multithread.html
- https://blog.kennycoder.io/2020/05/16/進程-Process-、線程-Thread-、協程-Coroutine-的概念講解/
- https://medium.com/erens-tech-book/理解-process-thread-94a40721b492