Linux菜鸟问题:
如果我有 500MB 的 RAM 和 500MB 的交换空间,那么操作系统和进程可以使用 1GB 的内存吗?
换句话说,程序和操作系统可用的内存总量是物理内存大小和交换大小的总和吗?
我试图弄清楚要查询哪些 SNMP 计数器,但需要先了解 Linux 如何更好地使用虚拟内存。
谢谢
实际上,它本质上是正确的,但是您的“虚拟”记忆并不存在于您的“物理记忆”旁边(正如 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 演出作为地址限制。
您可以将文件映射到其中,从而有效地为您提供更多内存。它基本上充当额外的交换。即不是将程序的二进制代码数据加载到内存中,然后将其换出到交换文件,而是仅对文件进行映射。根据需要,页面直接从文件交换到 RAM。
您可以使用稀疏数据和映射的稀疏文件来研究一些有趣的东西。我已经看到 X-windows 声称使用了巨大的内存,而实际上它只用了一点点。
顺便说一句:“免费”可能会对您有所帮助。就像“ cat /proc/meminfo ”或/proc/$PID/status中的Vm行一样。(尤其是VmData和VmStk。)或者也许是“ ps up $PID ”
尽管大多数情况下它是正确的,但它并不完全正确。对于特定进程,您运行它的环境可能会限制您的进程可用的内存。也检查输出ulimit -v
。
是的,这基本上是正确的。实际数字可能(非常)略低,但出于所有意图和目的,如果您有x
物理内存和y
虚拟内存(在 linux 中交换),那么您就有x + y
可用于操作系统和在操作系统下运行的任何程序的内存。