一个进程具有相同的 virt 和 res

same virt and res for a process

我有一个进程运行那么多线程。 当我使用该进程 ID 执行 top -H -p 时,输出中的 VIRT 和 RES 对于进程 运行.

中的所有线程始终相同

这是什么意思?

您看到相同的值是因为 Linux 中的线程共享相同的地址 space(页表,更准确地说)。

Linux 线程是通过使用 CLONE_VM 标志的 clone 系统调用创建的,这意味着它们共享相同的页表(参见 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 将始终相同。