Memory 这个过程如何';虚拟内存比物理内存大+;交换

Memory 这个过程如何';虚拟内存比物理内存大+;交换,memory,operating-system,virtualization,memory-address,Memory,Operating System,Virtualization,Memory Address,据我所知,在本例中,docker的守护进程已经从操作系统请求了1114MB的内存,为其分配了一部分虚拟地址空间,但直到进程实际需要物理内存时,才使用物理内存。那很好 然而,当操作系统无法满足这个请求时,它怎么能说“当然,这是你的1.1GB”呢?malloc()(或docker正在使用的任何东西)不应该立即失败吗 如果它实际上是“过度销售”内存空间,那么malloc()的返回值有什么意义 没有一个rational操作系统允许您在没有页面空间的情况下分配虚拟内存。可悲的是,有些操作系统是不合理的(或

据我所知,在本例中,
docker
的守护进程已经从操作系统请求了1114MB的内存,为其分配了一部分虚拟地址空间,但直到进程实际需要物理内存时,才使用物理内存。那很好

然而,当操作系统无法满足这个请求时,它怎么能说“当然,这是你的1.1GB”呢?
malloc()
(或docker正在使用的任何东西)不应该立即失败吗

如果它实际上是“过度销售”内存空间,那么
malloc()
的返回值有什么意义


没有一个rational操作系统允许您在没有页面空间的情况下分配虚拟内存。可悲的是,有些操作系统是不合理的(或者具有支持这种非理性行为的系统参数)。您的操作系统可能允许您的malloc调用成功地将页面映射到内存,然后在您尝试访问内存时失败。这使调试成为一场噩梦。一些系统将此称为“过度使用”。请注意,在操作系统术语中,此术语通常用于完全不同的目的。

正如@user3344003所说,发生这种情况是因为Linux默认情况下(至少在我的情况下)过度使用内存:

/proc/sys/vm/overmit\u内存

此开关知道3种不同的设置:

0:Linux内核可以自由地过度分配内存(这是默认设置),使用启发式算法来确定是否有足够的内存可用

1:Linux内核总是会过度分配内存,并且从不检查 有足够的内存可用。这会增加内存不足的风险 但同时也改善了内存密集型工作负载

2:Linux内核不会过度分配内存,只分配Overmit_ratio中定义的内存

Debian上的默认值是0。这意味着malloc不会失败,当机器无法在任何地方分配新页面时,内核的OOM杀手将介入其中

进一步阅读可在