为何线程有PID?

在linux下用 top -H -p <pid> 查询某个进程的线程
按理说,都是某个进程下的线程, 应该进程id PID一样啊,但实际却都不一样


实际是被PID的名字给弄混了,线程进程都会有自己的ID,这个ID就叫做PID,PID是不特指进程ID,线程ID也可以叫做PID。

pthread库里的每一个线程都对应一个内核线程,都是有单独的pid。


The four threads will have the same PID but only when viewed from above. What you (as a user) call a PID is not what the kernel (looking from below) calls a PID.

In the kernel, each thread has it's own ID, called a PID (although it would possibly make more sense to call this a TID, or thread ID) and they also have a TGID (thread group ID) which is the PID of the thread that started the whole process.

Simplistically, when a new process is created, it appears as a thread where both the PID and TGID are the same (new) number.

When a thread starts another thread, that started thread gets its own PID (so the scheduler can schedule it independently) but it inherits the TGID from the original thread.

That way, the kernel can happily schedule threads independent of what process they belong to, while processes (thread group IDs) are reported to you.


关于线程继承关系图如下:

               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和之前开始的进程一致。

Linux通过进程查看线程的方法 1).htop按t(显示进程线程嵌套关系)和H(显示线程) ,然后F4过滤进程名。2).ps -eLf | grep java(快照,带线程命令,e是显示全部进程,L是显示线程,f全格式输出) 3).pstree -p <pid>(显示进程树,不加pid显示所有) 4).top -Hp <pid> (实时) 5).ps -T -p <pid>(快照) 推荐程度按数字从小到大。

打印线程的PID的方法如下:

getpid()方法可以打印进程的PID
gettid()方法可以打印线程的PID

void * thread_start(void *arg)  
{  
    printf("Process ID: %d, thread ID %d\n", getpid(), gettid());  
}  
由于gettid()在glibc中没有包含
Note: There is no glibc wrapper for this system call; see NOTES. 

所以用如下syscall函数在用户空间替代gettid()的功能
syscall(__NR_gettid))   或者  syscall(SYS_gettid)

在文件 /usr/include/bits/syscall.h里, 有一行:
#define SYS_gettid __NR_gettid  
可见二者是一样的。__NR_gettid是系统调用号

#include <pthread.h>  
#include <stdio.h>  
#include <sys/types.h>  
#include <sys/syscall.h>  
#include <unistd.h>  


void * thread_start(void *arg)  
{  
    printf("[1] Process ID: %d, thread ID %d\n", getpid(), syscall(__NR_gettid));  
    printf("[2] Process ID: %d, thread ID %d\n", getpid(), syscall(SYS_gettid));  
}  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/383406.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于树和二叉树的一些基本概念,基本名词解释。

二叉树的概念 概念 一棵二叉树是结点的一个有限集合&#xff0c;该集合或者为空&#xff0c;或者是由一个根节点加上两棵别称为左子树和右子树 的二叉树组成。 二叉树的特点&#xff1a; 每个结点最多有两棵子树&#xff0c;即二叉树不存在度大于2的结点。二叉树的子树有左右…

在VI中删除行尾的换行符

在vi中&#xff0c;如果要删除行尾的换行符&#xff0c;可以用如下方法 第一种情况&#xff1a;只删除单行 如有文件如下&#xff1a; [fanzfSWserver ~/tmp]$ cat names.tmp 101 Nate H. 102 John M. 104 Cassy T. 106 Mary L. 107 Isaac …

用c语言构建二叉树(重点)

结点创建 二叉树创建 我们以‘#’为NULL&#xff0c;我们要把输入进来的一个字符串转变为二叉树&#xff0c;所以我们要记住递归的每一步走到数组了哪个位置 所以我们要记住创建过程中用掉的前序个数&#xff0c;并返回&#xff0c;除此之外&#xff0c;还要加上当时的那个结点…

linux 同步IO: sync msync、fsync、fdatasync与 fflush

最近阅读leveldb源码&#xff0c;作为一个保证可靠性的kv数据库其数据与磁盘的交互可谓是极其关键&#xff0c;其中涉及到了不少内存和磁盘同步的操作和策略。为了加深理解&#xff0c;从网上整理了linux池畔同步IO相关的函数&#xff0c;这里做一个罗列和对比。大部分为copy&a…

二叉树的广度优先遍历(层序遍历)

先定义一个二叉树的结点 再创建二叉树&#xff0c;这里就不写了&#xff0c;之前的有创建二叉树的博客。 层序遍历 用到栈的思想&#xff0c; 1 先让根 节点进队列&#xff0c;2 然后读队顶元素&#xff0c;3 让他出队列4 打印它的值5 让队顶元素的左右子树进栈&#xff0…

用前序中序创建二叉树(用中序后序创建二叉树)

定义二叉树结点 比如就拿这个二叉树 前序中序创建 因为前序遍历的顺序是 根 &#xff0c; 左 &#xff0c;右。 中序的遍历是 左 根 右。 我们会很不好想&#xff0c;但我们可以用前序和中序把上面那个二叉树的遍历一边 前序遍历&#xff1a;ABDEHCFG中序遍历&#xff1a;D…

Epoll详解及源码分析

文章来源&#xff1a;http://blog.csdn.net/chen19870707/article/details/42525887 Author&#xff1a;Echo Chen&#xff08;陈斌&#xff09; Email&#xff1a;chenb19870707gmail.com Blog&#xff1a;Blog.csdn.net/chen19870707 Date&#xff1a;Jan.7th, 2015 1…

非递归实现二叉树(前序,中序,后序)c/c++实现

这里还是用到栈的思想&#xff0c;为了方便用了c的一些内容&#xff0c;把出栈&#xff0c;进栈&#xff0c;读栈顶元素用一个个函数封装起来了&#xff0c;前面做了一些处理来使用这些函数。 前序非递归 思想&#xff1a;一直走左边&#xff0c;依次进栈。等左边为空的时候&…

Linux 中统计一个进程的线程数

如果你想看到 Linux 中每个进程的线程数&#xff0c;有以下几种方法可以做到这一点。 方法一: /proc proc 伪文件系统&#xff0c;它驻留在 /proc 目录&#xff0c;这是最简单的方法来查看任何活动进程的线程数。 /proc 目录以可读文本文件形式输出&#xff0c;提供现有进程和系…

Linux_linux基础命令(增删查,权限,Linux下的重要目录,重要命令(. du, df, top, free, pstack, su, sudo).安装gcc/g++, gdb, vim )

r&#xff1a;表示可读w&#xff1a;表示可写x&#xff1a;表示可执行也可以用数字表示这一点我们会在修改文件权限说明。对于文件夹的rwx表示&#xff1a;r表示可读及可以查看文件夹内容可以ls查看w表示可写及可以向文件夹中传送内容如文件x表示可执行及可以向文件夹中可以cd进…

pthread_create会导致内存泄露

这几天一直在调试一个系统&#xff0c;系统的功能就是定时发送数据、接收数据然后解析收到的数据&#xff0c;转换成一定的格式存入数据库中。我为了并发操作&#xff0c;所以每接收到一个数据包&#xff0c;就调用pthread_create函数创建一个默认属性的线程进行处理。 系统…

Linux_linux常用工具之make/makefile详解

make/makefile make/makefile: 项目自动化构建工具 makefile:普通文本文件&#xff0c;记录了项目的构建流程规则。 make: 一个解释程序&#xff0c;到当前执行make命令的目录下寻找makefile文件&#xff0c;并且对makefile 中记录的项目构建规则进行解释执行。makefile: 编写…

Linux_linux常用工具(git,vim ,gcc ,gdb,权限)超详解

git :项目版本控制工具 项目克隆&#xff1a;git clone项目提交&#xff1a;git add&#xff08;本地仓库提交&#xff09; git commit -m “bak msg”&#xff08;-m 备注信息&#xff09;同步到服务器&#xff1a;git push origin master&#xff08;提交到主分支&…

T20调试札记

最近在调试T20的内存&#xff0c;使用的指令在此记录一下 1. pmap指令查看指定进程中的内存分布。该指令需要在busybox中开启 pmap -x 111 2.应用与so需要执行strip操作&#xff0c;可以减小存储空间的大小 mips-linux-gnu-strip libsysutils.so 3.nm指令和file指令可以查…

samba 2.2.7a 编译

今天在君正T20上编译samba 2.2.7a 遇到了一些问题&#xff0c;特此记录一下 1.自己写一个build.sh脚本&#xff0c;方便后续的再次编译 #!/bin/sh # export CFLAGS"-O2 -muclibc" export CPPFLAGS"-O2 -muclibc" export CXXFLAGS"-O2 -muclibc&qu…

Linux_linux常用工具------进度条程序

缓冲区对文件读写的影响&#xff1a;数据并没有直接写入文件&#xff0c;而是写入到缓冲区&#xff08;内存&#xff09;中&#xff0c;等到缓冲区中数据写满或者刷新缓冲区的时候&#xff0c;才会将数据真正的写入文件 fflush&#xff08;stdout&#xff09;刷新。 回车与换行…

Ubuntu下QT的安装详细教程

本文转自&#xff1a;http://blog.chinaunix.net/uid-7945126-id-4987195.html 经测试完美解决 ------------------------------------------------------------- 最近需要在Ubuntu下开发桌面软件&#xff0c;想起了QT。书上介绍的方法太老了&#xff0c;网上找了一大堆安装方法…

Linux_linux常用工具---闲杂篇(除了vim, 还有哪些常用的牛逼的编辑器, 并能够横向对比编辑器之间的区别和优缺点.)

vim自行查找资料, 自行配置插件. 借鉴别人的 " 显示相关 “”""""""""""""""""""""""""""""""""&…

ubuntu14.04下安装qt4.8.6 +qt creator

原创作品&#xff0c;允许转载&#xff0c;转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://248341.blog.51cto.com/238341/1438867以前安装时没太注意&#xff0c;安装qt后发现在qt creator下无法输入中文&#xff0c;或者中文无法…

网络基础一(协议的概念,网络应用程序设计模式)

协议的概念 什么是协议&#xff1f; 从应用的角度出发&#xff0c;协议可理解为“规则”&#xff0c;是数据传输和数据的解释的规则。 假设&#xff0c;A、B双方欲传输文件。规定&#xff1a; 第一次&#xff0c;传输文件名&#xff0c;接收方接收到文件名&#xff0c;应答OK…