分配内存页和页表的算法

Posted

技术标签:

【中文标题】分配内存页和页表的算法【英文标题】:Algorithm for allocating memory pages and page tables 【发布时间】:2010-01-20 06:28:33 【问题描述】:

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

【问题讨论】:

正如他们所说:快速、好或便宜:选择任何两个。 你想用所说的页面和/或页表做什么?使用可以帮助缩小实施范围。空闲页面的链接列表会非常快,但会消耗大量内存。更详细的问题将导致更详细的答案。 上述算法必须设计用于内存非常低的嵌入式平台,比如 64 MB。由于反复出现页面错误,某些应用程序运行缓慢。分配页表中的散列如何帮助我优化/减少页面错误的发生。 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

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

在构建链表时,确保它是按索引排序的。

当你想分配内存时,扫描链表,这将花费 O(N)。其中 N 是已经完成的分配。

删除将扫描数组中的特定索引并删除链表中的节点。

一旦节点被删除,就有一个包含这些空闲分配的单独链表。

插入将如下所示。 1. 如果请求的大小列表中有元素,则检查空闲列表。 2.如果没有,则在链表的最后一个元素之后分配内存

删除将像这样进行, 1. 将节点移动到空闲列表中。

确保空闲列表和链表在索引上排序。

这种方法不能解决内存分配器中的碎片问题。一种简单的方法是使用压缩。定期扫描空闲节点链表,对每个元素移动数组中的元素,并适当更新链表中节点的索引。

【讨论】:

以上是关于分配内存页和页表的算法的主要内容,如果未能解决你的问题,请参考以下文章

理论+实例,带你掌握Linux的页目录和页表

操作系统3(内存页表段表)

408考研操作系统)第三章内存管理-第一节6-2:非连续分配管理方式之基本分页存储管理之基本地址变换机构

(王道408考研操作系统)第三章内存管理-第一节6-2:非连续分配管理方式之基本分页存储管理之基本地址变换机构

理论+实例,带你掌握Linux的页目录和页表

Linux从头学15:页目录和页表-理论 + 实例 + 图文的最完全最接地气详解