操作系统实验报告Lab2物理内存管理含challengeWord文档下载推荐.docx

上传人:b****3 文档编号:18394954 上传时间:2022-12-16 格式:DOCX 页数:10 大小:1.16MB
下载 相关 举报
操作系统实验报告Lab2物理内存管理含challengeWord文档下载推荐.docx_第1页
第1页 / 共10页
操作系统实验报告Lab2物理内存管理含challengeWord文档下载推荐.docx_第2页
第2页 / 共10页
操作系统实验报告Lab2物理内存管理含challengeWord文档下载推荐.docx_第3页
第3页 / 共10页
操作系统实验报告Lab2物理内存管理含challengeWord文档下载推荐.docx_第4页
第4页 / 共10页
操作系统实验报告Lab2物理内存管理含challengeWord文档下载推荐.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

操作系统实验报告Lab2物理内存管理含challengeWord文档下载推荐.docx

《操作系统实验报告Lab2物理内存管理含challengeWord文档下载推荐.docx》由会员分享,可在线阅读,更多相关《操作系统实验报告Lab2物理内存管理含challengeWord文档下载推荐.docx(10页珍藏版)》请在冰豆网上搜索。

操作系统实验报告Lab2物理内存管理含challengeWord文档下载推荐.docx

否则将该空闲区分为两部分,一部分区域与申请分配的大小相等,把它分配出去,剩下的一部分区域形成新的空闲区。

其释放内存的设计思路很简单,只需把这块区域重新放回双向链表中即可。

实现目标:

重写default_init_memmap(),default_alloc_pages(),default_free_pages()函数。

具体细节:

a)default_init_memmap()函数

这个函数是用来初始化空闲页链表的。

主要有两个步骤:

初始化每一个空闲页,计算空闲页的总数。

注意:

1.使用头插法是因为地址是从低地址向高地址增长。

2.p->

flags=0语句已经将PG_reserved标志位置零。

b)default_alloc_pages()函数

这个函数是用来分配空闲页的。

主要步骤如下:

1.寻找足够大的空闲块

1.1.如果找到了,重新设置标志位

1.2.从空闲链表中删除此页

1.3.判断空闲块大小是否合适

1.3.1.如果不合适,分割页块

1.3.2.如果合适则不进行操作

1.4.计算剩余空闲页个数

1.5.返回分配的页块地址

备注:

在参考答案中,我认为有些语句是冗余的,如图:

验证:

在第二次重置标志位前后,分别输出标志位的值,发现,flags并没有发生变化。

然后将这两句话注释,编译后运行,依旧可以得到正确答案。

所以我认为这两句话是没有必要的。

c)default_free_pages()函数

这个函数的作用是释放已经使用完的页,把他们合并到freelist中。

具体步骤如下:

1在freelist中查找合适的位置以供插入

2改变被释放页的标志位,以及头部的计数器

3尝试在freelist中向高地址或低地址合并

在合并后,需要更新头部的页块大小的值即property。

三、练习2:

实现寻找虚拟地址对应的表项

尝试获取页表的地址,如果获取不到就新建一个页表。

四、练习3:

释放某虚地址所在的页并取消对应二级页表的映射

判断此页被引用的次数,如果仅仅被引用一次,则这个页也可以被释放。

否则,只能释放页表入口。

五、简析slub分配器

slub分配器是通过slab分配器改进得来的,它减去了slab中一些复杂的数据结构。

为了清楚的了解slub,首先应当了解slab分配器的相关原理。

a)slab分配器简介

i.slab分配器主要结构

下图给出了slab结构的高层组织结构。

在最高层是cache_chain,这是一个slab缓存的链接列表。

这对于best-fit算法非常有用,可以用来查找最适合所需要的分配大小的缓存(遍历列表)。

cache_chain的每个元素都是一个kmem_cache结构的引用(称为一个cache)。

它定义了一个要管理的给定大小的对象池。

ii.超级麻烦的维护体系

1.slab分配器直接工作在伙伴系统之上。

2.每种缓冲区由多个slab组成,每个slab就是一组连续的物理内存页框,被划分成了固定数目的对象。

根据对象大小的不同,缺省情况下一个slab最多可以由1024个物理内存页框构成。

出于对齐等其它方面的要求,slab中分配给对象的内存可能大于用户要求的对象实际大小,这会造成一定的内存浪费。

3.kmem_cache对象是以cache_chain为队列头的一个双向循环队列。

4.每个slab都需要一个类型为structslab的描述符数据结构管理其状态,同时还需要一个kmem_bufctl_t(被定义为无符号整数)的结构数组来管理空闲对象。

5.每个slab对象会根据状态的不同在三个队列中转换。

6.SLAB分配器允许对象在一级硬件高速缓存中对齐

7.同时使用着色(color)策略,使得同一缓冲区内不同slab中相同编号的对象的地址相互错开

8.为了支持多处理器同时分配对象,缓冲区为每个处理器维护一个本地缓存。

b)slub分配器

SLUB分配器特点是简化设计理念,同时保留SLAB分配器的基本思想:

每个缓冲区由多个小的slab组成,每个slab包含固定数目的对象。

i.简化了kmem_cache

slab中有35个参数,而slub中有17个。

ii.slab等相关的管理数据结构个改变

slab没有额外的空闲对象队列。

slab也没有额外的描述结构,因为SLUB分配器在代表物理页框的page结构中加入freelist,inuse和slab的union字段,所以slab的第一个物理页框的page结构就可以描述自己。

c)slub分配器的申请函数slab_alloc()

d)查找正确的object——_slab_alloc()函数

这个函数很长,因为它需要对很多情况进行处理:

1.判断当前object是否和当前处理器匹配

2.当前page中是否还有slab

3.当前slab中是否还有page

4.empty_slab中是否还有slab

5.Partial_slab中是否还有slab

当出现异常的时候,解决的办法是找到可用的object,具体的方法是由下至上逐层查找是否存在空闲的结构。

查找方向如图所示:

e)具体代码

判断有没有可用slab和处理器的匹配问题

load_freelist:

返回可用的object

unlock_out:

解锁(前面的代码对page加了锁)。

another_slab:

在当前freelist中寻找另外一个slab

new_slab:

在Partialslab队列中选取一个slab。

如果队列也没有可用slab了,则重新申请一个

 

参考资料:

[1]LinuxSLUB分配器详解

[2]LinuxSLAB分配器剖析

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1