我有一个进程运行这么多线程。
当我使用该进程ID执行top-H-p时,对于进程运行期间的所有线程,输出中的VIRT和RES总是相同的。
那是什么意思?

最佳答案

您看到的是相同的值,因为Linux中的线程共享相同的地址空间(更准确地说,是页表)。
Linux线程是通过使用clone标志的CLONE_VM系统调用创建的,这意味着它们共享相同的页表(参见Understanding the Linux Kernel第3章)。在我的机器上,使用libpthread创建两个线程会导致以下调用:

clone(child_stack=0x7fbcc9aeaff0, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID ...
[...]
clone(child_stack=0x7fbcc92e9ff0, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID ...

一个可能的问题是:它是如何与堆栈一起工作的,而堆栈对每个线程都是私有的?堆栈由父对象malloc编辑,并通过child_stack参数设置。由于两个线程共享相同的页表,因此无论它们在堆栈上做什么,VIRTRES都将始终相同。

关于linux - 流程具有相同的值(value),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29458787/

10-16 11:19