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