博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Kernel】pid 与 tgid
阅读量:4205 次
发布时间:2019-05-26

本文共 1800 字,大约阅读时间需要 6 分钟。

总结:getpid()实际上返回的时 kernel task_struct中的tgid。

一个进程 中 有多个线程,这些线程的pid都是一致的,都对应内核态的tgid。thread group id。

但是这些线程在内核态的task_struct中的pid不一致。

 

 

参考1:

    在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?》

 

 

参考2:

一、进程PID和线程PID

        线程是轻量级的进程,有自己的PID,只不过共享进程的一些数据,比如说堆。

二、tgid

       thread group id。对于同一进程中的所有线程,tgid都是一致的,为该进程的进程ID。

 
USER VIEW <-- PID 43 --> <----------------- PID 42 ----------------->                     +---------+                     | process |                    _| pid=42  |_                  _/ | tgid=42 | \_ (new thread) _       _ (fork) _/   +---------+                  \      /                                        +---------++---------+                                    | process || process |                                    | pid=44  || pid=43  |                                    | tgid=42 || tgid=43 |                                    +---------++---------+ <-- PID 43 --> <--------- PID 42 --------> <--- PID 44 --->                     KERNEL VIEW

在这里你可以清晰的看到,创建一个新的进程会给一个新的PID和TGID,并且2个值相同,

当创建一个新的线程的时候,会给你一个新的PID,并且TGID和之前开始的进程一致。

转载地址:http://avmli.baihongyu.com/

你可能感兴趣的文章
0207 软件是如何运行和崩溃的?
查看>>
0203 生成mysql的数据库的数据字典
查看>>
0215 docker环境
查看>>
0216 aop和打印数据库执行日志
查看>>
0219 springmvc-拦截器和响应增强
查看>>
0223 研发工程师如何提高接口质量?
查看>>
0224 如何面对高并发?缓存?中台为什么会火?
查看>>
0226 rest接口设计
查看>>
0228 我的潘多拉
查看>>
0302 中台落地前概念和思考
查看>>
0228 我的潘多拉
查看>>
0302 中台落地前概念和思考
查看>>
0219 springmvc-拦截器和响应增强
查看>>
0308 软件系统的非功能需求
查看>>
0308 软件系统的非功能需求
查看>>
0309 软件基本原理1
查看>>
0312 java接口测试三棱军刺rest-assured
查看>>
0318 guava并发工具
查看>>
0312 java接口测试三棱军刺rest-assured
查看>>
中台之中台的设计
查看>>