Linux 实际上并没有区分进程和线程,而是将两者都实现为数据结构task_struct
。
那么,Linux 为某些程序提供了什么来让它们将一个进程的线程与其子进程区分开来呢?例如,有没有办法查看一个进程在 Linux 中拥有的所有线程的详细信息?
谢谢。
Linux 实际上并没有区分进程和线程,而是将两者都实现为数据结构task_struct
。
那么,Linux 为某些程序提供了什么来让它们将一个进程的线程与其子进程区分开来呢?例如,有没有办法查看一个进程在 Linux 中拥有的所有线程的详细信息?
谢谢。
从某个
task_struct
角度来看,一个进程的线程具有相同的线程组领导(group_leader
intask_struct
),而子进程具有不同的线程组领导(每个单独的子进程)。这些信息通过
/proc
文件系统暴露给用户空间。您可以通过查看or中的ppid
字段来跟踪父母和孩子(这给出了父母 pid);您可以通过查看字段来跟踪线程(这给出了线程组 id,这也是组长的 pid)。进程的线程在目录中可见:每个线程都有自己的子目录。(每个进程至少有一个线程。)/proc/${pid}/stat
.../status
tgid
.../status
/proc/${pid}/task
在实践中,希望跟踪自己的线程的程序将依赖于它们正在使用的线程库提供的 API,而不是使用特定于操作系统的信息。通常在类 Unix 系统上,这意味着使用 pthread。
这将运行
top
带有一些额外选项的命令:-H
参数指示 top 显示每个单独的线程。通常 top 会汇总其父进程下的所有线程。-b
参数使 top 在批处理模式下运行——信息被收集、显示,然后转储到标准输出,而不是在交互模式下运行并刷新显示的数据。-b
选项,用户必须告诉 top 运行多少次,这是通过-n
参数完成的,最后一个参数是运行多少次。所以
top -H -b -n 1
指示系统“运行top,显示单个线程,以批处理模式运行,并且只运行一次”。该
ps
命令报告当前正在运行的进程的快照。-eLf
论点(也可以使用)-e -L -f
分解如下:e
告诉ps
显示所有进程,无论谁拥有它们或它们的当前状态——活动、睡眠、暂停、等待 I/O 等。L
告诉ps
显示单个线程f
告诉将ps
输出格式化为完整格式列表,并结合L
参数将 NLWP(线程数)和 LWP(线程 ID)列添加到输出中。考虑一个 PID p1 的进程
子进程的
task_struct
对象将 PPID(父 PID)作为 p1,并且它的 PID 和 TGID 设置为 p2。p1 线程的
task_struct
对象将 PID 设置为 p3,但 TGID 设置为 p1。