程序 pstree 和 htop 显示具有唯一 PIDS 的线程。这怎么可能?

程序 pstree 和 htop 显示具有唯一 PIDS 的线程。这怎么可能?

我运行了程序 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因此而闻名。

相关内容