我有一个运行有这么多线程的进程。 当我使用该进程ID进行顶级-H -p时,输出中的VIRT和RES对于进程运行期间的所有线程始终是相同的。
这是什么意思?
答案 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
参数设置。由于两个线程共享相同的页表,无论它们在堆栈中执行什么操作,VIRT
和RES
都将始终相同。