一个进程具有相同的 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
参数设置。由于两个线程共享相同的页表,无论它们在堆栈上做什么,VIRT
和 RES
将始终相同。
我有一个进程运行那么多线程。 当我使用该进程 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
参数设置。由于两个线程共享相同的页表,无论它们在堆栈上做什么,VIRT
和 RES
将始终相同。