一、分段还是分页
1、从表示方式和状态确定角度考虑
段的长度大小不同。 页的大小固定,只需要位图就能表示页的分配与释放。
2、从内存碎片利用率看
由于段的长度大小不一,更容易产生内存碎片。 页的大小固定分配的最小单位是页,页也会产生碎片。可以通过修改页表的方式,将连续的虚拟页面映射到非连续的物理页面。
3、从内存和硬盘的数据交换效率看
当内存不足时,操作系统希望将内存的一部分数据写回硬盘,来释放内存。这就涉及内存和硬盘之间的交换数据。 由于段长度大小不一,不同段写回硬盘的时间也不同,硬盘的空间分配也会有这样的问题,这样会导致系统性能抖动。每次交换一个页,则没有这些问题。 段最大的问题是使得虚拟内存地址空间,难于实施。
二、如何表示一个页
使用分页模式来管理内存。首先把物理内存空间分成4KB大小页,这页表示从地址x开始到x+0xFFF这段物理内存空间,x必须是0x1000对齐的,这段内存空间成为内存页。‘ 真实的物理内存地址空间不是连续的,中间可能有空洞,可能是显存,也可能是外设寄存器。 如果使用位图或者整形变量数组,用其中一个位代表一个页,或者用整形数组中的一个元素表示一个页。如果这样分配的话,分配释放内存页的算法就确定了,就是扫描位图或者数组。但这样效率比较低。这是因为我们仅仅保存了内存页空闲和已分配的信息,这是不够的,可以用C语言结构体将页的状态、页的地址、页分配计数、页的类型、页的链表封装起来。
三、内存区
内存区只是逻辑上的概念,没有内存区,不影响硬件正常工作,但是没有内存页是绝对不行的。 根据上面的图片,将物理内存分为三个区,分为硬件区、内核区、应用区。 硬件区占用物理内存低端区域,虚拟地址主要依赖于CPU中的MMU,但有很多外部硬件能与内存直接交换数据,例如DMA。所以说很多内存页不能随便分配给这些设备,但是只要规定硬件区分配内存页就好。 内核区,也需要使用内存,内核区同样需要运行在虚拟地址空间,需要一段物理内存空间和内核的虚拟地址空间是线性映射关系。很多时候内核使用内存需要大的、连续的物理内存空间,我们就需要在这个内核区分配内存。 应用区主要是给应用用户态程序使用,应用程序使用虚拟内存空间,一开始并不会为应用一次性分配完所需的所有物理内存,而是按需分配,即应用到一页就分配一个页。 如果访问到一个没有与物理内存建立映射关系的虚拟内存页,这时CPU就会产生缺页异常。最终这个缺页异常由操作系统处理,操作系统会分配一个物理内存页,并建立好映射关系。
四、组织内存页
组织内存页,就是组织msadsc_t结构,而msadsc_t结构中就有一个链表,我们组织msadsc_t结构正是通过另一个数据结构中的链表,将msadsc_t结构串联其中。需要更加科学合理的组织msadsc_t结构,需要定义一个挂载msadsc_t结构的数据结构,他其中需要锁、状态、msadsc_t结构数量,挂载的链表和一些统计数据。有了bafhlst_t数据结构,只是有了挂载的地方,需要将bafhlst_t数据结构放在一个更高的数据结构中,这个数据结构就是内存分割合并数据结构memdivmer。
|