我运行了程序 pstree -p 31872 ,它打印了以下输出:
ruby(31872)─┬─{ruby}(31906)
└─{ruby}(32372)
pstree 的手册页显示:
进程的子线程在父进程下找到,并在大括号中显示进程名称,例如
icecast2---13*[{icecast2}]
(由于缺少 -p 选项,上面的显示有所不同,这会禁用压缩。)
在不带 -p 的情况下运行 pstree 31872 给出:
ruby───2*[{ruby}]
当我尝试使用以下命令观察 PIDS 时附注,没有找到结果。但是,pid 存在于 /proc 中。
我的问题是,为什么线程会有不同的 pid?我希望它们与进程相同(31872)。运行 htop 时会观察到相同的行为。
答案1
错误在于假设这些数字是 PIDS,而实际上它们是 TIDS(线程 ID)。请参阅 Linux 函数 gettid(2)。阅读clone(2) 可以得到很多额外的(并且有趣的)细节。
答案2
线程通常是不同的进程。至少在Linux中,“线程”通常是进程的克隆,它恰好与父进程共享一些内存。
然而,在某些语言中,线程确实保留了主进程的一部分,因为它们是“绿色”线程,在语言 VM 中进行模拟。 Java和Python因此而闻名。