在Linux操作系統層面,線程其實只是特殊的進程,最特殊之處在於跟其他“線程進程“共享內存(包括代碼段、數據段等,但不共享棧)。
這兩天看書老是看到線程組(thread group),但是線程組是什么呢?百思不得其解,幸好有StackOverflow,不多說,先上鏈接:《If threads share the same PID, how can they be identified?》
講一講我的理解。
熟悉Linux下C編程的同學都知道,每個進程都有自己的pid,每個線程都有自己的線程id(pthread_t類型),但這是在用戶空間的層面。而在內核層面中,線程其實也是進程。為了更好地區分這些概念,我們用任務/task來指代內核中的進程概念,而依舊用進程來指定用戶空間層面的進程。所以當我說task的時候,指的是內核層面,而當我說進程的時候,指的就是用戶空間層面的。
回到剛才說的地方,每個線程都是一個task,所以每個線程都有自己的一份struct task_sruct,而且每個線程都有自己獨特的pid。那內核通過什么來知道這個線程屬於哪個進程呢?答案是task_sruct.tgid。是的,一個進程就是一個線程組,所以每個進程的所有線程都有着相同的tgid。
當程序開始運行時,只有一個主線程,這個主線程的tgid就等於pid。而當其他線程被創建的時候,就繼承了主線程的tgid。這樣,內核就可以通過tgid知道某個task屬於哪個線程組,也就知道屬於哪個進程了。當我們用ps命令或者getpid()等接口查詢進程id時,內核返回給我們的也正是這個tgid。
所以什么是線程組?其實就是進程。
好像講得不是很好,大家還是看看StackOverflow大神的講解吧:《If threads share the same PID, how can they be identified?》
https://my.oschina.net/u/3258476/blog/1518920