Linux noob问题:

如果我有500MB的RAM和500MB的交换空间,操作系统和进程是否可以使用1GB的内存?

换句话说,程序和操作系统可用的内存总量是物理内存大小和交换大小的总和吗?

我正在试图找出要查询的SNMP计数器,但需要先了解Linux如何更好地使用虚拟内存。

由于

有帮助吗?

解决方案

是的,这基本上是正确的。实际数字可能(非常)略低,但是对于所有意图和目的,如果你有 x 物理内存和 y 虚拟内存(在linux中交换),那么你有 x + y 内存可供操作系统和操作系统下运行的任何程序使用。

其他提示

实际上,它基本上是正确的,但你的“虚拟”是正确的。内存不会位于旁边您的“物理内存”。 (正如Matthew Scharley所说)。

您的“虚拟内存”是一个覆盖“物理”和“物理”的抽象层。 (如在RAM中)和“交换” (如在硬盘中,当然与RAM一样多的物理)内存。

虚拟内存是一个抽象层。您的程序始终会解决“虚拟”问题。地址,您的操作系统转换为RAM或磁盘上的地址(需要首先加载到RAM),具体取决于数据所在的位置。所以你的程序永远不必担心内存不足。

再也没有那么简单......

内存页面被懒惰分配。一个进程可以malloc()大量的内存,永远不会使用它。所以在你的500MB_RAM + 500MB_SWAP系统上,我可以 - 至少在理论上 - 从堆中分配2 gig的内存,并且一切都会快速运行直到我尝试使用太多的内存。 (此时任何进程无法获取更多内存页面都会被破坏。希望这是我的过程。但并非总是如此。)

个别进程可能限制为4 gig,作为32位系统的硬地址限制。即使你在机器上有超过4演出的RAM并且你正在使用来自地狱寻址方案的那种奇怪的分段36位暴行,个别进程仍然只限于4演出。其中一些演出必须用于共享库和程序代码。因此,作为ADDRESSING限制,可以使用2-3 gig的堆栈+堆。

您可以mmap文件,有效地为您提供更多内存。它基本上充当额外的交换。即而不是将程序的二进制代码数据加载到内存中,然后将其交换到交换文件,该文件只是mmapped。根据需要,页面直接从文件交换到RAM中。

您可以使用稀疏数据和mmapped稀疏文件来处理一些有趣的内容。我已经看到X-windows声称占用大量内存,实际上它只是用了一点点。

BTW:“免费”可能会帮助你。可能是“ cat / proc / meminfo ”或 / proc / $ PID / status 中的 Vm 行。 (特别是 VmData VmStk 。)或者可能是“ ps up $ PID

虽然大多数情况都是如此,但 正确。对于特定进程,您运行它的环境可能会限制进程可用的内存。检查 ulimit -v 的输出。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top