gpt4 book ai didi

c - Linux 上的虚拟内存大小

转载 作者:IT王子 更新时间:2023-10-29 00:58:39 26 4
gpt4 key购买 nike

我试图深入了解 OS Linux 上的虚拟内存管理。

我真的不明白操作系统如何确定进程的 VM 大小。

我知道 32 位 x86 操作系统最多可以提供 3 GB 的虚拟机地址空间...总是如此吗?

在我的例子中,我有大约 110 MB 的物理内存和 32 位 Linux,我的主进程有一个大约 660 MB 的 vm 地址空间。但是,物理内存中只有 50 MB(我的进程的 RSS),所以我的物理 RAM 没有满。其余的是免费的,几乎全部被页面缓存使用。这似乎是一种正常行为。

如果我检查/proc/my_process_PID/smap,有几个 8 MB 的匿名 VMA。

我的实际问题是我需要在代码中创建一个额外的 10 MB malloc,但不幸的是 OOM-Killer 杀死了我的进程(内存不足)......我认为堆的虚拟机,不是吗?某处是否存在巨大的内存泄漏?

为什么操作系统不如此扩展我的进程虚拟机大小?

有关虚拟机大小不受限制的信息:ulimit -v : unlimited

最佳答案

每个进程可以有 3GB 的虚拟内存(大约在许多 32 位 Linux 上),并继续创建新进程占用 GB 上 GB 的虚拟内存。内核中的开销很小,但虚拟内存非常便宜。您使用的地址空间量可能并不重要,它可能不会触发 OOM killer 。

但是,您的系统只有那么多 RAM。当您开始使用 地址空间中的页面(写入它们)时,内核被迫寻找物理 RAM 来将它们映射到。如果没有物理 RAM,内核可以从 RAM 中逐出其他页面——将它们换出或丢弃。但如果它无法驱逐任何页面,则会触发 OOM killer 。

用完地址空间将导致 malloc 在我的系统上返回 NULL,而不是触发 OOM killer 。

听起来您的进程只是使用了过多的 RAM。 RSS 不是您的进程使用的内存量,它只是现在物理 RAM 中的内存量。如果您的进程存在内存泄漏并不断增长,RSS 最终将停止增长——因为对于您使用的每一个新页面,内核都会从您的进程中逐出一页。

尝试使用内存分析器,例如 Valgrind。这将帮助您理清哪些内存是您应该担心的(mallocs),哪些是您可以忽略的内存(共享库和其他内存映射文件)。内核(和/proc)不会给你足够的细节。

关于c - Linux 上的虚拟内存大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7582301/

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