Linux实际上并不区分进程和线程,而是将两者实现为数据结构task_struct
。
那么,Linux为某些程序提供了哪些功能,以使其从子进程中得知进程的线程?例如,是否可以查看Linux中某个进程具有的所有线程的详细信息?
谢谢。
Linux实际上并不区分进程和线程,而是将两者实现为数据结构task_struct
。
那么,Linux为某些程序提供了哪些功能,以使其从子进程中得知进程的线程?例如,是否可以查看Linux中某个进程具有的所有线程的详细信息?
谢谢。
Answers:
从一个task_struct
角度来看,一个进程的线程具有相同的线程组领导者(group_leader
中的task_struct
),而子进程具有不同的线程组领导者(每个单独的子进程)。
此信息暴露给用户空间通过的/proc
文件系统。您可以通过查看或中的ppid
字段来跟踪父母和孩子(这会给父母提供pid)。您可以通过查看中的字段来跟踪线程(这提供了线程组ID,这也是组长的pid)。进程的线程在目录中可见:每个线程都有自己的子目录。(每个进程至少有一个线程。)/proc/${pid}/stat
.../status
tgid
.../status
/proc/${pid}/task
实际上,希望跟踪自己的线程的程序将依赖于它们正在使用的线程库提供的API,而不是使用特定于操作系统的信息。通常在类Unix系统上,这意味着使用pthread。
(sleep 120 | sleep 120) &
并查看Tgid
每个sleep
进程/proc/${pid}/status
文件中的 值来查看此信息。
这会运行top
命令并提供一些其他选项:
top -H -b -n 1
-H
参数指示top显示每个单独的线程。通常,top总结其父进程下的所有线程。-b
参数使top在批处理模式下运行-信息被收集,显示,然后转储到stdout,而不是在交互模式下运行并刷新显示的数据。-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)列被添加到输出参数。 考虑一个带有PID p1的过程
task_struct
子进程的对象的PPID(父PID)为p1,其PID和TGID设置为p2。
task_struct
p1线程的对象将PID设置为p3,但TGID设置为p1。