理解HTOP

理解HTOP

抱歉,我是 linux/ubuntu 的新手。我读过htop这里的很多帖子,但我只是想澄清一下这些值的含义。我运行一个 32 位程序,我的理解是,大约 4.2 是此应用程序可以使用的最大内存量。如果我超过这个值,就会出现 calloc 错误。

查看时htop,我是否查看virt或查看res数量以查看何时接近 4gb 的限制?

htop 图片

答案1

正如htop手册页

M_RESIDENT(居住地)

进程的驻留集大小(文本+数据+堆栈)(即进程使用的物理内存的大小)。

M_SIZE(虚拟)

进程的虚拟内存的大小。

然而,RES仅仅表明-物理内存,它并不意味着32位二进制进程将被限制在4 GB总共,事实上如果你有已启用物理地址扩展该进程可以使用更多内存。从物理上讲,是的,2 32 个地址意味着 4GB 的物理 RAM。根据Gilles 的回答(我强调):

32 位 Linux 内核只能执行 32 位进程。根据内核编译选项,每个进程只能分配 1GB、2GB 或 3GB 内存(其余部分保留给内核处理系统调用)。这是虚拟内存的数量,与 RAM、交换和 mmapped 文件之间的任何细分无关。

此外,根据Ramesh 的回答在 Unix 和 Linux 站点上,一个进程可以分配大量内存:

最多的是过程地址是 4GB。您可能会混淆内存和地址空间。一个进程可以拥有比地址空间更多的内存。那是完全合法在视频处理和其他内存密集型应用中相当常见。一个进程可以被分配数十 GB 的内存,并可以随意将其换入或换出地址空间。每次只能将 2 GB 内存放入用户地址空间。

如果你家里有一个四车位车库,你仍然可以拥有五十辆汽车。只是你不能把它们都放在车库里。你必须在其他地方有辅助存储空间来存放至少 46 辆汽车;哪些汽车放在车库里,哪些汽车放在街边的停车场里,都由你决定。

证实突破的答案

就地址是否“有效”而言,每个进程都有自己独特的地址空间(从而实现虚拟内存方案),因此任何地址在技术上都是有效的。请记住,进程可以分配比物理可用内存更多的内存。

...

给定进程的虚拟地址映射到某些物理存储硬件(RAM、磁盘等),但映射是在运行时由操作系统和 MMU 完成的。

当然,地址空间为 4GB 意味着指针仍然是 32 位


另外Linux内核还有内存不足杀手/管理器,这将清理并释放内存。换句话说,如果您担心整个进程​​内存,那么不要担心 4GB 的限制。

相比之下,如果我们谈论的是分配 4 GB在你的代码中,然后根据相关帖子 malloc()syscall 实际上将被限制为 4 GB 的分配。但是你可以做多个malloc()总共请求超过 4GB(虽然我不完全确定这与物理限制如何关系)。

其他有趣的读物:

相关内容