Linux 如何区分线程和子进程?

Tim*_*Tim 25 linux process thread

Linux 实际上并不区分进程和线程,而是将两者都实现为一种数据结构task_struct

那么,Linux 为某些程序提供了什么来让它们从子进程中区分进程的线程?例如,有没有办法查看进程在 Linux 中拥有的所有线程的详细信息?

谢谢。

Ste*_*itt 32

从一个task_struct角度来看,进程的线程具有相同的线程组领导(group_leaderintask_struct),而子进程具有不同的线程组领导(每个单独的子进程)。

此信息暴露给用户空间通过/proc文件系统。您可以通过查看or中的ppid字段来跟踪父母和孩子(这给出了父 pid);您可以通过查看中的字段来跟踪线程(这给出了线程组 ID,它也是组长的 pid)。进程的线程在目录中可见:每个线程都有自己的子目录。(每个进程至少有一个线程。)/proc/${pid}/stat.../statustgid.../status/proc/${pid}/task

在实践中,希望跟踪自己线程的程序将依赖于它们正在使用的线程库提供的 API,而不是使用特定于操作系统的信息。通常在类 Unix 系统上,这意味着使用 pthread。

  • 你在谈论进程组;在我的回答中,组长是从内核的角度来看的。在内核的记账中,单独的进程是他们自己的组长。您可以通过运行 `(sleep 120 | sleep 120) &` 并查看每个 `sleep` 进程的 `/proc/${pid}/status` 文件中的 `Tgid` 值来看到这一点。 (2认同)

iva*_*van 6

  1. 这会运行top带有一些额外选项的命令:

    top -H -b -n 1
    
    Run Code Online (Sandbox Code Playgroud)
    • -H参数指示 top 显示每个单独的线程。通常 top 汇总其父进程下的所有线程。
    • -b参数使 top 以批处理模式运行——信息被收集、显示,然后转储到标准输出,而不是在交互模式下运行并刷新显示的数据。
    • 使用该-b选项,用户必须告诉 top 运行多少次,这是通过-n参数和最终参数完成的运行次数。

    Sotop -H -b -n 1指示系统“运行顶部,显示单个线程,以批处理模式运行,并且只运行一次”。

  2. ps命令报告当前正在运行的进程的快照。

    ps -eLf
    
    Run Code Online (Sandbox Code Playgroud)

    -eLf参数(可作为-e -L -f以及)分解如下:

    • e告诉ps显示所有进程,无论谁拥有它们或它们的当前状态——活动、睡眠、暂停、等待 I/O 等。
    • L告诉ps显示单个线程
    • f讲述ps来格式化的输出作为全格式列表,并且在结合L的NLWP(线程数)和LWP(线程ID)列被添加到输出参数。