Linux pid與tgid概念


在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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM