一个过程的相同的virt和res

时间:2015-04-05 15:20:05

标签: linux multithreading process

我有一个运行有这么多线程的进程。 当我使用该进程ID进行顶级-H -p时,输出中的VIRT和RES对于进程运行期间的所有线程始终是相同的。

这是什么意思?

1 个答案:

答案 0 :(得分:1)

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

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