Linux——一文彻底了解进程id和线程id的关系(什么是pid、tgid、lwp、pthread_t)
目录
一.内核层面:pid & tgid
二.函数调用层面:getpid & gettid & pthread_self
三.用户层面:PID & LWP(TID)
四.总结
一.内核层面:pid & tgid
首先,我们要清楚,在系统层面只有两个编号:pid、tgid。
不妨拿出task_struct结构体(进程PCB)看一看:
pid_t pid;
pid_t tgid;
我们知道,在linux中进程和线程都使用task_struct结构体实现。
在task_struct中:
pid即线程id。也就是task_struct的编号,每个task_struct各不相同。
tgid叫线程组id。也就是一个进程的id。同一个进程里每一个线程的task_struct中tgid值都一样。
二.函数调用层面:getpid & gettid & pthread_self
直接说结论:
getpid获得的是task_struct中的tgid,即线程组编号。
gettid获得的是task_struct中的pid,即线程编号。(也就是LWP/TID)
pthread_self获得的是线程在共享区数据的起始地址。
因此,在多线程中,使用getpid获取的全都相同,gettid获取的各不相同。
getpid和gettid是系统接口,获得的是内核数据;而pthread_self是库函数,获得的是用户级数据。
画图表示如下:
值得一提的是,编程时gettid不能直接使用,需要自定义封装才行:
pid_t gettid(){return static_cast<pid_t>(syscall(SYS_gettid));
}
三.用户层面:PID & LWP(TID)
当使用ps axj或ps -aL查看进程或线程时,显示的PID即线程组编号,也就是task_struct中的tgid。LWP即线程编号,也就是task_struct中的pid。
可以使用如下代码验证:
#include<iostream>
#include<unistd.h>
#include<pthread.h>
#include<sys/types.h>
#include<sys/syscall.h>
using namespace std;pid_t gettid(){return static_cast<pid_t>(syscall(SYS_gettid));
}void* func(void* arg){cout << pthread_self() << endl;cout << "tgid: " << getpid()<< endl;cout << "pid: " << gettid() << endl;cout << "***********************************************" << endl;sleep(5);
}
int main(){pthread_t tid[2];pthread_create(&tid[0], nullptr, func, nullptr);sleep(2);pthread_create(&tid[1], nullptr, func, nullptr);pthread_join(tid[0], nullptr);pthread_join(tid[1], nullptr);return 0;
}
结果:
四.总结
含义 | 内核PCB | 系统调用 | 用户显示(ps命令) |
---|---|---|---|
线程编号 | pid | gettid() | LWP/TID |
线程组编号 | tgid | getpid() | PID |
如有错误,敬请斧正
Linux——一文彻底了解进程id和线程id的关系(什么是pid、tgid、lwp、pthread_t)相关推荐
- GetWindowThreadProcessId 获得窗口所在进程ID和线程ID
GetWindowThreadProcessId 获得窗口所在进程ID和线程 在得到窗口句柄后我们可以通过GetWindowThreadProcessId这个函数来获得窗口所属进程ID和线程ID,从而 ...
- linux C语言如何获取进程号和线程号?getpid()、syscall(__NR_gettid)
有些时候,需要在Log中打出进程或线程的ID,以便调试.查找问题. 获取进程ID #include <unistd.h> pid_t getpid(void); 获取线程ID // 方法1 ...
- Linux高性能服务器编程:进程池和线程池原理及应用(有图有代码有真相!!!)
一.问题引入 在前面编写多进程.多线程服务器时通过动态创建子进程和子线程来实现并发服务器,这样做有以下缺点: 1)动态创建进程.线程将会比较耗费时间,将导致较慢的客户响应. 2)动态创建的子进程只为一 ...
- ntel Xeon E5-2658的CPU核ID和线程ID的对应关系
cpu0 核ID 0 1 2 3 4 8 9 10 11 12 线程ID 0 20 1 21 2 22 3 23 4 24 5 25 6 26 7 27 8 28 9 29 cpu1 核ID 0 1 ...
- linux进程查看所有线程,Linux中查看进程的多线程的方法
在SMP系统中,我们的应用程序经常使用多线程的技术,那么在Linux中如何查看某个进程的多个线程呢? 本文介绍3种命令来查看Linux系统中的线程(LWP)的情况: 在我的系统中,用qemu-syst ...
- C++线程id(线程号TID)
文章目录 线程id 由谁分配? 线程id和进程号区别? 线程id 进程 ID 被称为 PID,而线程 ID 被称为 TID. 线程 ID 是操作系统分配给线程的唯一标识符.线程是程序执行的基本单元,线 ...
- 【多线程】线程与进程、以及线程进程的调度
在了解多线程之前,首先要区分线程和进程的概念与区别,我目前只了解到Java的JVM中与操作系统联系中的线程和进程,在了解线程与进程之前,首先要初步了解电脑中的操作系统的地位和作用. 冯诺依曼体系 计算 ...
- linux进程号为一,一步步探究linux进程中的用户ID
转载请注明来源chengyaogen.blog.chinaunix.net 一.进程与权限 A.进程时Linux/Unix操作系统中最重要的抽象之一 B.进程是一个处于执行期的程序(目标代码存储在某种 ...
- linux 线程id 进程id,在Linux上显示正在运行的进程的线程ID
在Linux上显示正在运行的进程的线程ID 在上Linux," ps -T"可以显示正在运行的进程的线程信息: # ps -T 2739 PID SPID TTY STAT TIM ...
最新文章
- Solaris 10 x86 上折腾Mono
- 文件内存映射mmap解决大文件快速读写问题和进程间共享内存
- Nhibernate 三种配置方式
- POJ 2724 Purifying Machine (二分图匹配)
- 不同网段Linux通过路由表,Linux服务器架设---《路由表配置,实现不同网段不同网卡之间的ping...
- 使用TensorFlow.js的AI聊天机器人六:生成莎士比亚独白
- 浅谈UWB室内定位(二)
- linux centos7 配置ftp,Linux Centos7配置ftp服务器
- Java实现Modbus/TCP客户端与modsim通信
- java 读取文件成字节数组_java读取文件为字节数组
- 得物(毒)app测试开发工程师面经
- 【IT项目管理】第4章 控制项目范围
- 水中机器人电控方案设计
- springMVC学习2
- 每周推荐短视频:谈论“元宇宙”要有严肃认真的态度
- 谈一谈mmkv的使用
- 【俗话编程】什么是对象?
- 2017中国(郑州)国际医药保健品及福祉产业交易会会刊(参展商名录)
- 微服务 2.0 技术栈选型手册
- 设备树学习(十五、番外篇-中断子系统之IRQ Domain介绍)