POABOB

小小工程師的筆記分享

0%

Program、Process、Thread 介紹

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 成果才會。

a

記憶體配置

  • Stack:存放 函數的參數區域 變數等。(會稱作 stack 是由於其配置 遵守 LIFO)
  • Heap:一般由程式設計師分配釋放,執行時才會知道配置大小,如 malloc/newfree/delete。(注意其資料結構不是 DS 中的 heap 而是 link-list)
  • BSS未初始化的靜態變數
  • Data全域變數、靜態變數
  • text/code常量字元串

b

配置練習

1
2
3
4
5
6
7
8
9
10
11
12
13
int a=0;   //global 初始化區
char *p1; //global 未初始化區
main(){
int b; // stack
char s[]="abc"; // stack
char *p2; // stack
char *p3="123456"; // 123456\0 在常量區,p3在stack。
static int c=0; // global (static) 初始化區
p1 = (char*)malloc(10);
p2 = (char*)malloc(20); //分配得來得10和20位元組的區域在heap
strcpy(p1,"123456");
//123456\0 在常量區,編譯器可能會將它與 p3 中的 123456\0 優化成一個地方。
}

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 SectionOS 資源
  • 輕量化 的 process。(context switch 一個 thread 比 process 快約 5 倍,建立一個 thread 比 process 快約 13 倍。)
  • 可使用 多處理器架構 : 使用 多核心

c

總結

  • 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
------ 本文結束 ------