前言#
Linux Kernel中的Process, Thread其實跟我們一般認知的定義有些不太一樣,因此這篇文章來記錄這些名詞上的差異。
歷史#
最開始的Linux,並沒有follow POSIX的標準,且當初也沒有針對多執行緒去設計架構,都還是以單執行緒為主,因此最早期設計了task_struct這個資料結構當作Scheduler調度CPU資源的單位,一個task_struct就代表一個Process。
後來的設計#
後來多核CPU逐漸成為主流後,多執行緒的設計就很有必要了,但Linux為了方便便延續了之前的設計,將task_struct定義改為Lightweight Process(LWP),其實就是我們一般認知的Thread的概念,而Process這個名詞則變成了一組LWP的集合,Linux稱之為Thread Group。
task_struct#
task_struct又被稱作Process descriptor(也就是OS中的PCB),存放所有跟該LWP有關的資料,其中有兩個重要的欄位:
- pid :這個LWP的Id,所有LWP的Id都是唯一的
- tgid:同一組LWP(Thread)形成的Process的Id,如果是main thread(或稱Thread Group Leader)則跟pid一致,如果是其他thread則會記錄main thread的pid
// task_struct中的欄位
pid_t pid;
pid_t tgid;
以及另外兩個重要的function:
- getpid():回傳tgid欄位
- gettid():回傳pid 欄位,也就是說pid其實實際上的意義是Thread Id,但task_struct中並沒有一個專屬的欄位紀錄tid,而是統一用pid
