我有一个模拟最佳内存管理的程序。 基本上,虽然孔列表中有可用的孔,对于我们尝试分配的流程来说足够大,但是流程被分配并添加到流程列表中。然而,最终,我们达到了一个空洞变得非常分散的地步,我们需要进行压实。
最简单的方法是显示创建新列表并按顺序添加所有进程。但是,这不太现实,因为在现实世界中,您没有足够的空间来移动并创建新列表。
你能想到一种方法将所有进程推送到内存的一端并将空间释放到另一端吗?基本上它被设置为像这个孔数组(孔是包含起始索引和大小的结构)和一个进程数组(进程也是包含进程ID,起始索引和大小的结构)。
答案 0 :(得分:1)
如果在起始索引上对孔数组进行排序,则可以迭代数组并取两个孔并将其间的内存块移动到第一个孔的起始索引。
进一步说明:
每个洞都有一个起始索引和一个等于start_index + size
的结束索引。
通过比较第一个孔的结束索引和第二个孔的起始索引,可以获得介于两者之间的内存块的大小。然后你可以将内存块的memmove作为第一个起始索引。
答案 1 :(得分:1)
您可以将已分配的内存一个接一个地移动到可用内存的末尾。
伪代码:
sort procs by start_index (descending)
avail_end = END_OF_MEM - p[0].size (adjust alignment)
for p in procs
memmove( avail_end, p.start_index , p.size )
avail_end = avail_end - p.size
这应该会在可用内存开始时导致一个空闲内存块。您也可以在一个区域移动后(在达到时间阈值后)停止此功能并稍后继续(通过测试后续过程分配区域之间存在间隙,以跳过不必要的移动)。
答案 2 :(得分:0)
释放内存(并创建一个洞)时,您是否已将其与相邻的孔合并?否则,这是减少碎片的好主意。