【发布时间】:2017-01-27 11:50:38
【问题描述】:
假设我有一个 32 位内核。 4 Gb RAM,10 Gb 交换分区。
我有一个进程在无限循环中使用 malloc。因此,最终系统的OOM会杀死该进程。这里有两个论点。
参数 1:因为它是 32 位内核,虚拟地址拆分为 3:1,即用户空间为 3Gb,内核空间为 1Gb。该进程将被分配 3 Gb 的内存,然后就没有更多的内存可以提供了。因此,OOM 会终止该进程。
参数 2:因为它是 32 位内核,虚拟地址拆分为 3:1,即用户空间为 3Gb,内核空间为 1Gb。该进程将被分配 4 Gb 的内存,然后就没有更多的内存可以提供了。因此,OOM 会终止该进程。
参数 3:Malloc 将首先占用 4 Gb 内存的 Ram,然后占用 10 Gb 的 Swap 分区,然后 OOM 将终止该进程。
这些论点(如果有的话)中哪些是正确的?
论坛上有其他答案,但我不确定这个问题的答案是否取决于它的 32 位内核还是 64 位内核?
【问题讨论】:
-
没有。您的系统实际上有 14gig 的内存。但是在 32 位系统上,没有一个进程可以分配超过 4gig 的内存,而不管实际发生的 1:3 拆分内容如何。从技术上讲,交换文件根本不会被触及,假设 4gig ram 完全是空的。
-
假设一个进程的虚拟内存(高内存区域)的 1 gig 是为内核操作保留的。用户空间可以使用剩余的 3 gig。这是一个 3/1 的拆分。 malloc 不应该只占用 3 Gb 的用户空间吗?因为它是用户级进程。
-
@saurabhagarwal, no 虚拟内存是为内核操作保留的。内核以实模式运行。或者换句话说,内核的内存不占用分配给任何进程的虚拟内存的任何部分。每个进程的虚拟内存空间都属于它,而且是它自己的。
-
好吧,现在说得通了。感谢您指出。但是内核用户分割虚拟地址空间的含义是什么?这种分裂有什么意义?
-
malloc 可能会失败,也可能会过度提交,或两者兼而有之。没有通用且可靠的方法来使用 malloc 触发 OOM 处理程序。
标签: c linux memory-management linux-kernel operating-system