【发布时间】:2010-12-09 14:55:08
【问题描述】:
Linux 菜鸟问题:
如果我有 500MB 的 RAM 和 500MB 的交换空间,那么操作系统和进程可以使用 1GB 的内存吗?
换句话说,程序和操作系统可用的内存总量是物理内存大小和交换大小的总和吗?
我试图弄清楚要查询哪些 SNMP 计数器,但需要先了解 Linux 如何更好地使用虚拟内存。
谢谢
【问题讨论】:
Linux 菜鸟问题:
如果我有 500MB 的 RAM 和 500MB 的交换空间,那么操作系统和进程可以使用 1GB 的内存吗?
换句话说,程序和操作系统可用的内存总量是物理内存大小和交换大小的总和吗?
我试图弄清楚要查询哪些 SNMP 计数器,但需要先了解 Linux 如何更好地使用虚拟内存。
谢谢
【问题讨论】:
虽然大多数情况下它是正确的,但它并不完全正确。对于特定进程,您运行它的环境可能会限制您的进程可用的内存。检查ulimit -v 的输出。
【讨论】:
实际上,它本质上是正确的,但是您的“虚拟”内存并不存在于旁边您的“物理内存”(正如 Matthew Scharley 所说)。
您的“虚拟内存”是一个抽象层,涵盖“物理”(如 RAM)和“交换”(如硬盘,当然与 RAM 一样多的物理)内存。
虚拟内存本质上是一个抽象层。您的程序始终寻址一个“虚拟”地址,您的操作系统根据数据所在的位置将其转换为 RAM 或磁盘上的地址(需要先加载到 RAM)。所以你的程序永远不必担心内存不足。
【讨论】:
没有什么比这更简单了......
内存页面是延迟分配的。一个进程可以 malloc() 大量内存并且从不使用它。因此,在您的 500MB_RAM + 500MB_SWAP 系统上,我可以 - 至少在理论上 - 从堆中分配 2 gig 的内存,并且事情会顺利运行,直到我尝试使用过多的内存。 (此时任何无法获取更多内存页面的进程都会遭到攻击。希望这是我的进程。但并非总是如此。)
作为 32 位系统上的硬地址限制,单个进程可能被限制为 4 gig。即使您的机器上有超过 4 gig 的 RAM,并且您正在使用来自地狱寻址方案的奇怪的分段 36 位暴行,单个进程仍然仅限于 4 gig。这 4 个演出中的一些必须用于共享库和程序代码。因此,作为寻址限制,您可以降低到 2-3 gigs 的堆栈 + 堆。
您可以将文件映射到其中,从而有效地为您提供更多内存。它基本上充当额外的交换。 IE。与其将程序的二进制代码数据加载到内存中,然后将其交换到交换文件中,不如直接映射文件。根据需要,页面会直接从文件交换到 RAM。
您可以通过稀疏数据和映射的稀疏文件获得一些有趣的东西。我见过 X-windows 声称使用了巨大的内存,而实际上它只用了一点点。
顺便说一句:“免费”可能会对您有所帮助。就像“cat /proc/meminfo”或 /proc/$PID/status 中的 Vm 行一样。 (尤其是 VmData 和 VmStk。)或者也许是“ps up $PID”
【讨论】:
是的,这基本上是正确的。实际数字可能(非常)略低,但出于所有意图和目的,如果您有x 物理内存和y 虚拟内存(在 linux 中交换),那么您有x + y 内存可供操作系统使用以及在操作系统下运行的任何程序。
【讨论】: