用于分配存储器页面和页面表的算法

时间:2010-01-20 06:28:34

标签: c++ c linux algorithm memory-management

我想设计一种分配和释放内存页面和页面表的算法。哪些数据结构可以实现最佳性能和最简单的实现?

2 个答案:

答案 0 :(得分:3)

最常见的算法和数据结构不出所料地被称为page table。最基本的是,它由一个数组映射虚拟地址空间块到物理地址空间块;未分配的页面设置为null。当进程尝试访问未映射的内存时,系统会获取以前未使用的物理内存块并将其映射到页表中。

由于大多数虚拟内存空间对于单级页表来说太大(具有4k页的32位机器需要32位*(2 ^ 32字节/ 4千字节)=每个虚拟地址空间4兆字节,而64位第一位需要指数级更多),使用多级页表:顶级包含指向第二级页表的指针,指向物理内存的实际区域(可能具有更多级别的间接)。这允许系统在大面积地址空间未使用时在页面表上节省内存。

答案 1 :(得分:1)

即使操作系统通常实现页表,但更简单的解决方案可能是这样的。

将一个大的连续内存作为数组。分配一些内存时,请在存储数组索引和数据部分长度的链表中维护该信息。

在构建链接列表时,请确保它在索引上排序。

如果要分配内存,请扫描链表,这将需要O(N)。其中N是已经完成的分配。

删除将扫描数组以查找特定索引并删除链接列表中的节点。

删除节点后,请使用包含这些免费分配的单独链接列表。

插入将如下所示。 1.如果请求的大小列表中有元素,请检入空闲列表。 2.如果不是,请在链表的最后一个元素

之后分配内存

删除会像这样工作, 1.将节点移动到空闲列表。

确保免费列表和链接列表在索引上排序。

这种方法没有解决内存分配器中的碎片问题。一种简单的方法是使用压缩。定期扫描自由节点链表,并为每个元素移动数组中的元素,并相应地更新链表中节点的索引。