gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 10:54:19 26 4
gpt4 key购买 nike

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

这是什么意思?

最佳答案

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

Linux 线程是通过 clone 系统调用使用 CLONE_VM 标志创建的,这意味着它们共享相同的页表(请参阅了解 Linux 内核,第 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 ...

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

关于linux - 一个进程具有相同的 virt 和 res,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29458787/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com