内存未使用且可用但内存分配失败 - 可能吗?

问题描述 投票:0回答:1

在 Linux 或通常带有 MMU 的操作系统中,用于虚拟内存管理系统,如 x86 架构,我通过一个示例实现了一个场景,其中内存可用但 malloc 可能会失败。请确认这是否真的可行。

考虑我们在系统中有 4GB 空闲内存,我们依次分配了 100 万个两种大小的块,第一个是 3k,下一个是 1k,这意味着我们分配了一个总块的 4k,尽管有两个块,其中有 100 万个总共 4k 块,所以我们为每个 1mb 大小分配了总共 4GB 的内存。分配按顺序分配 3k 块,操作系统 MMU 将分配 1 页 4k,然后它将为下一个 1k 块分配剩余的 1k 页。

接下来考虑进行内存分配的进程将释放或释放 100 万个 1k 块,因此我们应该获得 1GB 的空闲内存。然而,这些块在地址上是连续的,交替分配 3k 个块,所以我们不能回收这些内存用于进一步分配,除非下一个进程分配请求是 1k 或更少。如果将来的进程从不请求等于或小于 1k 的块的分配,或者如果它将来只请求例如 3k 块,那么将永远不会使用通过释放 1k 块释放的 1GB 内存。

Linux 等操作系统的MMU 将如何处理?如果这种情况是真实存在的,即内存将未被使用,并且不会有进一步的内存分配可能,那么通常会有更多这样的场景。如果 Linux 或任何操作系统 MMU 处理这种情况并且不会浪费内存,它是怎么做到的?

我知道页面分配以及 Linux 上的伙伴分配器是如何工作的,尽管我找不到任何解决这个问题的方法,否则请解释一下是否可以解决这个问题。显然,当使用 3k 块时,我们无法在进程继续时打破那些虚拟内存到物理内存的映射。

linux memory-management linux-kernel paging virtual-memory
1个回答
0
投票

你的场景是可能的,它被称为内存碎片。当分配和释放内存的方式在分配的块之间留下不可用内存的间隙时,就会发生这种情况。

Linux 内核有一个称为 内存压缩 的功能,它试图通过将可移动页面移动到内存区域的一端并在另一端创建更大的连续空闲块来减少内存碎片。

内存压缩可以通过将节点号写入

/proc/sys/vm/compact_node
按需触发,也可以由每个节点
kcompactd
线程定期运行。但是,由于页面扫描和移动,内存压缩也会导致性能开销。

© www.soinside.com 2019 - 2024. All rights reserved.