理解Linux的进程,线程相关的各类ID:PID,LWP,TID,TGID

tid,pid,ppid,tgid,pgid,uid,euid介绍 PID : 在Unix和Linux系统中,每个运行的程序都是一个进程。每个进程都有一个唯一的进程IDProcess Identification)PPID : 指的是父进程的pid,每个进程都可以创建一个或多个子进程,对于创建这个子进程的进程,我们称之为父进程。TID:创建的线程的IDTGID:线程组ID,包含多个线程的线程组PGID:进程组ID,包含。 阅读详情

最近实验室遇到了一个关于PID的问题,让我也跟着学习一下,查看了一下相关资料,找到一篇关于Linux进程和线程的各种ID的介绍,所以转载了过来。

作者:wipan
来源:cnblogs
地址:https://www.cnblogs.com/wipan/p/9488318.html

在Linux的top和ps命令中,默认看到最多的是pid (process ID),也许你也能看到lwp (thread ID)和tgid (thread group ID for the thread group leader)等等,而在Linux库函数和系统调用里也许你注意到了pthread id和tid等等。还有更多的ID,比如pgrp (process group ID), sid (session ID for the session leader)和 tpgid (tty process group ID for the process group leader)。概念太多可能很晕,但是只要对Linux的进程和线程的基本概念有准确的理解,这些ID的含义都迎刃而解。下面将介绍进程和线程的核心概念,并以一个示例程序来验证这些ID之间的关系。

Linux的进程和线程

Linux的进程和线程有很多异同点,可以Google下。但只要能清楚地理解一下几点,则足够理解Linux中各种ID的含义。

  • 进程是资源分配的基本单位,线程是调度的基本单位
  • 进程是资源的集合,这些资源包括内存地址空间,文件描述符等等,一个进程中的多个线程共享这些资源。
  • CPU对任务进行调度时,可调度的基本单位 (dispatchable entity)是线程。如果一个进程中没有其他线程,可以理解成这个进程中只有一个主线程,这个主进程独享进程中的所有资源。
  • 进程的个体间是完全独立的,而线程间是彼此依存,并且共享资源。多进程环境中,任何一个进程的终止,不会影响到其他非子进程。而多线程环境中,父线程终止,全部子线程被迫终止(没有了资源)。

上述第一点说明是最基础的,也是最重要的。

初步理解各种ID。基本上按照重要程度从高到低,在分割线下方的IDs不太重要。

  • pid: 进程ID。
  • lwp: 线程ID。在用户态的命令(比如ps)中常用的显示方式。
  • tid: 线程ID,等于lwp。tid在系统提供的接口函数中更常用,比如syscall(SYS_gettid)和syscall(__NR_gettid)。
  • tgid: 线程组ID,也就是线程组leader的进程ID,等于pid。
  • ------分割线------
  • pgid: 进程组ID,也就是进程组leader的进程ID。
  • pthread id: pthread库提供的ID,生效范围不在系统级别,可以忽略。
  • sid: session ID for the session leader。
  • tpgid: tty process group ID for the process group leader。

 从上面的列表看出,各种ID最后都归结到pid和lwp(tid)上。所以理解各种ID,最终归结为理解pid和lwp(tid)的联系和区别。

下面的图是一张描述父子进程,线程之间关系的图。

上图很好地描述了用户视角(user view)和内核视角(kernel view)看到线程的差别:

  • 从用户视角出发,在pid 42中产生的tid 44线程,属于tgid(线程组leader的进程ID) 42。甚至用ps和top的默认参数,你都无法看到tid 44线程。
  • 从内核视角出发,tid 42和tid 44是独立的调度单元,可以把他们视为"pid 42"和"pid 44"。

需要指出的是,有时候在Linux中进程和线程的区分也是不是十分严格的。即使线程和进程混用,pid和tid混用,根据上下文,还是可以清楚地区分对方想要表达的意思。上图中,从内核视角出发看到了pid 44,是从调度单元的角度出发,但是在top或ps命令中,你是绝对找不到一个pid为44的进程的,只能看到一个lwp(tid)为44的线程。

理解pid和lwp(tid)的示例程序

下面利用一个示例程序来进一步理解pid和lwp(tid),以及利用格式化的ps命令打印出各种ID。下面的程序在main函数中创建了2个子线程,加上main函数这个主线程,一共有3个线程。在3个线程中分别打印pthread id, pid和lwp(tid),来验证pid和lwp(tid)的关系。

threadTest.c:
#include <unistd.h>
#include <sys/syscall.h>
#include <stdio.h>
#include <pthread.h>

#define gettidv1() syscall(__NR_gettid) // new form
#define gettidv2() syscall(SYS_gettid)  // traditional form

void *ThreadFunc1()
{
        printf("the pthread_1 id is %ld\n", pthread_self());
        printf("the thread_1's Pid is %d\n", getpid());
        printf("The LWPID/tid of thread_1 is: %ld\n", (long int)gettidv1());
        pause();

        return 0;
}

void *ThreadFunc2()
{
        printf("the pthread_2 id is %ld\n", pthread_self());
        printf("the thread_2's Pid is %d\n", getpid());
        printf("The LWPID/tid of thread_2 is: %ld\n", (long int)gettidv1());
        pause();

        return 0;
}

int main(int argc, char *argv[])
{
        pid_t tid;
        pthread_t pthread_id;

        printf("the master thread's pthread id is %ld\n", pthread_self());
        printf("the master thread's Pid is %d\n", getpid());
        printf("The LWPID of master thread is: %ld\n", (long int)gettidv1());

        // 创建2个线程
        pthread_create(&pthread_id, NULL, ThreadFunc2, NULL);
        pthread_create(&pthread_id, NULL, ThreadFunc1, NULL);
        pause();

        return 0;
}

注意编译的时候要利用-l指定library参数。

gcc threadTest.c -o threadTest -l pthread

执行程序,结果如下:

# ./threadTest

the master thread's pthread id is 140154481125184
the master thread's Pid is 20992
The LWPID of master thread is: 20992
the pthread_1 id is 140154464352000
the thread_1's Pid is 20992
The LWPID/tid of thread_1 is: 20994
the pthread_2 id is 140154472744704
the thread_2's Pid is 20992
The LWPID/tid of thread_2 is: 20993

上述结果说明pthread id是pthread库提供的ID,在系统级别没有意义。pid都是线程组leader的进程ID,即20992。而lwp(tid)则是线程ID,分别是20993和20994。

同时利用ps来查看结果,注意ps默认只打印进程级别信息,需要用-L选项来查看线程基本信息。

# ps -eo pid,tid,lwp,tgid,pgrp,sid,tpgid,args -L | awk '{if(NR==1) print $0; if($8~/threadTest/) print $0}'
  PID   TID   LWP  TGID  PGRP   SID TPGID COMMAND
20992 20992 20992 20992 20992 30481 20992 ./threadTest
20992 20993 20993 20992 20992 30481 20992 ./threadTest
20992 20994 20994 20992 20992 30481 20992 ./threadTest

从上述结果中可以看到:

  • PID=TGID: 20992
  • TID=LWP: 20993 or 20994
  • 至于SID,30481是bash shell的进程ID。

Linux用户态命令查看线程

1. top命令

默认top显示的是task数量,即进程。

可以利用敲"H",来切换成线程。如下,可以看到实际上有96个线程。也可以直接利用top -H命令来直接打印线程情况。

2. ps命令

ps的-L选项可以看到线程,通常能打印出LWP和NLWP相关信息。如下命令即可查看线程信息:

ps -eLf

3. pidstat

pidstat -t [-p pid号] 可以打印出线程之间的关系。

4. htop

要在htop中启用线程查看,开启htop,然后按<F2>来进入htop的设置菜单。选择“设置”栏下面的“显示选项”,然后开启“树状视图”和“显示自定义线程名”选项。按<F10>退出设置。
注:MAC的F2按fn+F2。

参考

Linux进程与线程的区别

Linux内核进程,线程,进程组,会话组织模型以及进程管理 唤醒睡眠状态任意的线程可以用wake_up_process,它可和唤醒处于深度睡眠状态的线程。结合最开始的图和代码,我们可以得到如下结论:1.kthead衍生的内核线程没有session pid,说人话就是所有的内核线程没有都没有操作控制台,不能通过控制台去操作控制。2.idle任务不会出现在for_each_process的处理循环中。3.每cpu_rq就绪队列中,不会将idle统计到nr_running中。 阅读详情

相关推荐

配置权重_高盛都在用的资产配置模型,BL贝叶斯框架改进Markowitz

前面我们说到,markoviz的均值-方差模型,第一次,用数学的方式严格证明了投资组合存在最优的权重,但它的学术意义大于实战。主要原因有两个:1,人们很难有效的预测期望收益率;2,最优资产组合配置对输入非常敏感,结果往往难以被人理解。还有就是在投资中,定量只是完成初步构建,同步的定性判断依然非常重要:第一,投资者的认知偏好:倾向于关注他们认为被低估,但有发展潜力或者可以确定相对交易价值的小部分股票...

weixin_39892309的博客 716

Linux——一文彻底了解进程id和线程id的关系(什么是pid、tgid、lwp、pthread_t)

​首先,我们要清楚,在系统层面只有两个编号: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值都一样。当使用ps axj或ps -aL查看进程

weixin_61857742的博客 8505

数据去重复_京东商品评论情感分析|文本数据预处理

本文爬取了十款热销手机的文本评论数据后,首先对文本评论数据做文本预处理,文本评论数据中存在大量的无价值信息,引入无用的文本数据,对其作情感分析,显然没有价值,得出的文本挖掘结果也不尽人意。所以对于文本评论数据先进行文本预处理是必不可少的一步,把大量的、冗余的、无价值的信息去除,可以极大提高文本数据的质量,精确文本分析结果。1 文本去重1.1文本去重的原因文本数据预处理时,首先应去除文本评论数据中反...

weixin_34556808的博客 2074

理解Linux的进程,线程,PID,LWP,TID,TGID

在Linux的top和ps命令中,默认看到最多的是pid (process ID),也许你也能看到lwp (thread ID)和tgid (thread group ID for the thread group leader)等等,而在Linux库函数和系统调用里也许你注意到了pthread id和tid等等。还有更多的ID,比如pgrp (process group ID),s...

weixin_30920513的博客 1173

台式机ubuntu系统屏幕无法调节的问题(已解决)(汇总)

背景:新配了一台主机,安装了双系统,windows下屏幕在带鱼屏上显示良好,但Ubuntu系统屏幕拉伸严重。 问题描述:系统没有适应屏幕被整个拉伸了,进入设置界面,显示Built-in Display,分辨率只有1024*768无法设置。 尝试一:网上最多的方法就是使用xrandr, 结果显示:xrandr:Failed to get size of gamma for output default 尝试二: 第一次进入命令行页面:login:填你的用户面 password:使用字母上方的数字键输入你的密码

weixin_45626706的博客 4630

手把手教你 RT-DETR 添加注意力机制 | 一次性添加 20+ 种!

手把手教你 RT-DETR 添加注意力机制 | 一次性添加 20+ 种!

Coding... 2853

LIN总线ID与PID相互转化

LIN总线ID与PID相互转化查询表 ]

weixin_40713604的博客 2万+

生成模型实战 | 基于Transformer生成音乐

本文介绍了基于Transformer架构的音乐生成方法,将音乐视为一系列事件序列进行处理。与将音乐表示为多维图像的MuseGAN不同,该方法使用类似GPT的仅解码器模型,基于先前事件预测下一个音乐事件。模型使用MIDI格式的钢琴音乐数据,通过分词处理将音符转换为note-on、note-off、time-shift和velocity四种事件类型,共388个独特词元,映射为索引序列后输入网络。训练完成后,可通过调整温度参数控制生成音乐的新颖性,从而创作出风格类似训练数据且连贯逼真的音乐作品。

盼小辉丶的博客 5882

Linux的进程,线程,PID,LWP,TID,TGID

转自:http://www.jsniushi.com/rumen/20190706/2364.html 在Linux的top和ps命令中,默认看到最多的是pid (process ID),也许你也能看到lwp (thread ID)和tgid (thread group ID for the thread group leader)等等,而在Linux库函数和系统调用里也许你注意到了pthrea...

LinuxBegin的博客 1008

手把手教你学Simulink--基础电机控制场景实例:基于Simulink的无刷直流电机六步换相仿真

摘要:本文详细介绍了基于Simulink的无刷直流电机(BLDC)六步换相仿真方法。文章首先阐述了BLDC六步换相控制的原理,包括霍尔传感器定位、六步换相逻辑和方波电流驱动三大支柱。然后通过电动工具(角磨机)应用场景,展示了如何在Simulink中搭建完整的六步换相系统:从主电路构建、霍尔信号生成、Stateflow换相逻辑实现到开环电压控制。仿真结果显示该系统具有低成本优势(仅需霍尔传感器),但存在±20%转矩脉动。文章还提供了核心代码实现,包括霍尔信号生成、六步换相状态机和转矩分析脚本,并对比了六步换相

MHD0815的博客 149

Agent Harness Engineering: AI Agent 执行管控与安全沙箱 原理与最佳实践

我们正站在计算范式转移的历史节点上。2024-2026 年间,AI 系统从被动的内容生成器(Generative AI)演变为主动的行动执行者(Agentic AI)。这一转变的根本特征是:根据 2026 年初的行业数据:然而,能力的提升伴随着风险的指数级增长。2024-2026 年间发生的多起标志性安全事件揭示了 Agent 系统的脆弱性:案例 1:Slack AI 数据外泄事件(2024 年 8 月)案例 2:制造业供应链攻击(2026 年 Q3)案例 3:Arup 深度诈骗案(2026 年 9 月)这

AI天才研究院 1670

linux 线程tid,关于linux:PID和TID之间的区别

PID和TID有什么区别?标准答案是PID用于进程,而TID用于线程。 但是,我已经看到一些命令可以互换使用。 例如,htop有一列用于PID的列,其中显示了同一进程的线程的PID(具有不同的值)。 那么,PID何时表示线程或进程?您可以更改htop设置以查看其他颜色的进程和线程。 它还有助于使用树视图。这很复杂:pid是进程标识符; tid是线程标识符。但是碰巧的是,内核并没有真正区分它们:线程...

weixin_30794639的博客 3687

30天入门Python(办公篇)——第34天:pandas - 数据处理与分析利器

摘要 本文介绍了Python数据分析库pandas的核心功能,包括数据结构和基本操作。主要内容涵盖:1) Series和DataFrame两种核心数据结构的创建与使用;2) 多种文件格式的读写方法;3) 数据查看、筛选和清洗技巧;4) 基础统计分析功能;5) 数据透视表和交叉表制作;6) 数据排序与合并等变换操作。文章通过大量代码示例演示了pandas在数据处理各环节的应用,适合作为pandas入门的实践指南,帮助读者快速掌握这一强大工具的基本使用方法。

weixin_42636075的博客 303

理解Linux进程/线程的各种ID

通过Linux的top和ps命令中,默认看到最多的是pid (process ID),也许你也能看到lwp (thread ID)和tgid (thread group ID for the thread group leader)等等,而在Linux库函数和系统调用里也许你注意到了pthread id和tid等等。还有更多的ID,比如pgrp (process group ID), sid (session ID for the session leader)和 tpgid (tty process gr

ce123的技术博客 3294

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Linux线程本质剖析:从LWP、TID到并发编程避坑指南

在Linux并发编程中,进程与线程的区别往往停留在理论层面,一旦落到实际代码或线上排查,就会遇到LWP、TID、TGID等概念混杂的问题。线程的本质是将资源所有权与执行单位解耦:进程持有地址空间、文件描述符等资源,线程则作为内核调度实体独立运行。Linux内核通过clone()系统调用创建轻量级进程(LWP),同一进程内的线程共享TGID,但各自拥有唯一的TID,这正是ps -eLf输出中PID相同而LWP不同的原因。理解这些底层机制,就能解释pthread_create后多线程的真实面貌,也能避开栈超限、

weixin_33146151的博客 74

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

【Linux】线程概念与控制:从地址空间、LWP 到 pthread_create、join、detach 与 NPTL

进程提供资源容器↓线程是可独立调度的执行流↓同组线程共享地址空间和进程级资源↓每个线程保留独立寄存器、栈、mask、errno 与调度状态↓pthread_create 创建新执行流↓pthread_t、TGID、TID 分别服务于不同观察层线程共享地址空间,但不共享寄存器上下文和栈的使用权;“线程私有栈”不代表其他线程在硬件上无法访问它;编译线程程序应使用-pthread;多数 Pthreads 函数直接返回错误号,不通过errno报错;pthread_t。

星光编译者的技术博客,专注 C/C++、Linux、数据结构与算法。 439

为什么说一个线程组中的所有线程使用使用和该线程组的领头线程相同对PID

Linux 通过pid和tgid对外统一:所有线程组内的线程共享 TGID(PID),保持了pskill等工具的兼容性,资源统计以组为单位。对内独立:每个线程有独立的 TID(pid),支持内核调度、信号处理等需要区分单个执行流的场景。实现高效:通过clone()的标志位控制资源共享,复用结构体,避免为线程设计全新的数据结构。这种设计体现了 Linux 内核的 “实用主义哲学”—— 在兼容传统模型的同时,为新特性(多线程)提供支持,成为 UNIX 系系统中线程实现的经典范例。

Mr_-G,一名勤奋底层软件开发工程师的博客 840

【Linux】二十六.线程篇三《Linux多线程编程:线程控制、线程ID以及进程地址空间分布、线程局部存储__thread以及clone系统调用》---详解

在上节课内容中我们学写了线程的创建相关的知识点,今天我们紧接着学习后面的知识。

2501_93351213的博客 735

Linux线程ID与地址空间布局:从pthread_t到内核TID完全解读

Linux多线程编程中,线程ID与地址空间布局是两个基础却极易混淆的概念。线程在内核中以轻量级进程(LWP)实现,用户态pthread_t与内核TID由不同机制生成,理解它们的区别对并发调试至关重要。进程地址空间由所有线程共享,但每个线程拥有独立的栈和线程局部存储(TLS),栈大小与guard page直接影响程序稳定性。掌握这些知识,能帮助开发者快速排查段错误、死锁与栈溢出问题,并在高并发场景下合理规划线程资源。通过实际代码示例和/proc文件系统,可以直观验证pthread_t、gettid()与线程组

weixin_29300931的博客 225

Linux系统中与线程有关的指令

本文的重点其实就是ps指令:(除了ps指令外还有:top指令,pstree,gdb调试多线程程序,strace指令,pstack指令,以及/proc文件系统,perf指令,valgrind指令。这些内容大家根据自己需求看就好了)# 第一个# 显示指定进程 ID (<pid>) 下的所有线程及其 TID。# 第二个# 显示指定进程 ID (<pid>) 下的所有线程及其 TID。# 第三个# 显示和<your_program>有关的全部线程的详细信息,包含列名核心概念回顾:进程的唯一标识符。

LXdian_LX的博客 729

全面理解Linux线程

Linux线程本质上是共享资源的轻量级进程(LWP),内核通过task_struct统一管理。线程创建时分配独立的内核栈、用户栈和调度实体,但共享地址空间和文件描述符等资源。线程ID(TID)即内核的task_struct.pid,而进程ID(PID)对应tgid(线程组ID)。线程退出后资源不会立即释放,需通过pthread_join或pthread_detach回收。内核不区分进程和线程,区别仅在于clone()调用时共享的资源范围。

weixin_42129433的博客 365

Linux线程

Linux线程本质与特性 Linux线程本质上是共享资源的轻量级进程(LWP),内核通过task_struct管理,共享地址空间、文件描述符等资源,但拥有独立的栈和寄存器状态。线程创建通过clone()系统调用实现,相比进程开销更小。 线程标识与同步 线程组共享PID(TGID),内核为每个线程分配唯一TID 需关注线程安全(互斥锁保护)与可重入性(仅用局部变量) 线程本地存储(TLS)通过__thread关键字实现线程私有数据 信号与终止处理 信号可定向到整个进程或特定线程,建议主线程集中处理信号 线程取

2302_80908313的博客 1051

线程概念和线程控制

线程概念与Linux实现 线程是进程内部的执行流,Linux内核中通过轻量级进程(LWP)实现线程。与传统进程不同,线程共享进程的地址空间、文件描述符等资源,但拥有独立的栈和寄存器上下文。Linux内核使用task_struct统一管理进程和线程,线程创建时通过clone()系统调用共享父进程资源,而非创建全新地址空间。这使得线程调度更高效,CPU只需处理独立的执行流task_struct。 线程控制与创建 使用pthread_create()创建线程时,需注意: 线程函数参数应为堆内存或全局变量,避免栈变

Vect__的博客 1059

线程为什么叫轻量级进程?Linux内核线程实现与进程区别全解析

在并发编程中,进程与线程是最基础也最容易混淆的概念。简单来说,进程是资源分配与隔离的容器,而线程是进程内部真正被CPU调度的执行单元。Linux内核并没有为线程单独设计数据结构,而是通过task_struct统一表示进程与线程,并利用clone系统调用及CLONE_VM、CLONE_THREAD等flag控制资源共享程度。正是这种设计,让线程创建和同进程内切换的开销远低于进程,也解释了为什么线程常被称为轻量级进程。理解这套机制,不仅能帮你区分getpid、gettid与线程ID,还能在实际多线程开发中快速定

weixin_31102231的博客 189

Linux进程与线程:task_struct、fork/clone与共享内存的本质区别

在Linux系统中,进程与线程常被混为一谈,但内核只通过一个核心结构——task_struct——来管理所有可调度实体。进程与线程的本质区别并不在名称,而在于是否共享地址空间、文件表等资源。fork采用写时复制机制,让父子进程初时共享物理页,而clone通过CLONE_VM等标志创建线程,使同一进程内多个执行流共享同一份资源。理解PID与TGID的差异、文件偏移的共享关系,能帮助开发者准确区分父子进程、同进程线程、不同进程等组合。在实际工程中,选型进程还是线程,取决于隔离与共享的权衡;多线程程序中调用for

weixin_42666036的博客 272
上一篇: Ubuntu 18.04安装持久化内存配置工具ndctl
下一篇: Linux使用 ftrace 来跟踪内核函数调用
SweeNeil
博客等级 码龄9年 251粉丝 86原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值