- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
操作系统第一次实验报告
操作系统课程实验报告题目: Lab 2学生姓名: 王家威 学生学号: 201308070217 专业班级: 智能 1302 指导老师: 李蕊 完成日期:2015年12月24日实验内容实现first_fit连续物理内存分配算法实现寻找虚拟地址对应页表项释放某虚地址所在页并取消对应二级页表的映射实验原理首次适配算法指存储管理器,沿着段链表进行搜索直到找到一个足够大的空闲区域。如果空闲区域和进程所需要的区域刚好相等那么刚好,如果大则将该区域分为两部分,一部分供进程使用,另一部分成为新的空闲区域。首次适配算法很快因为它减少了搜索的次数,只要搜索到就分配。在改写代码前,需要弄清楚描述物理页的数据结构,双向链表以及管理物理页的数据结构Page。双向链表结构用来表示每个页帧,链表头用free_area_t结构体表示,包含了一个list_entry的双向链表指针和纪录当前空闲页的个数的无符号整型变量nr_free。typedef struct {list_entry_t free_list; // the list headerunsigned int nr_free; // # of free pages in this free list} free_area_t;Page结构体是实现连续物理内存分配算法的关键数据结构,可通过此数据结构来完成空闲块的链接和信息存储,而基于这个数据结构的管理物理页数组起始地址就是全局变量pagesstruct Page { int ref; // 映射此物理页的虚拟页个数 uint32_t flags; // 物理页属性(空或不空)unsigned int property; // 连续空页有多少(只在地址最低页有值,其余为0)list_entry_t page_link; // 双向链接各个Page结构的page_link双向链表(用于释放)};实验内容与实现练习1:实现first_fit连续物理内存分配算法;整体思路:物理内存页管理器顺着双向链表进行搜索空闲内存区域,直到找到一个足够大的空闲区域,这是一种速度很快的算法,因为它尽可能少地搜索链表。如果空闲区域的大小和申请分配的大小正好一样,则把这个空闲区域分配出去,成功返回;否则将该空闲区分为两部分,一部分区域与申请分配的大小相等,把它分配出去,剩下的一部分区域形成新的空闲区。其释放内存的设计思路很简单,只需把这块区域重新放回双向链表中即可。实现目标:重写default_init_memmap(),default_alloc_pages(),default_free_pages()函数。(1)default_init_memmap()函数用于内存块的初始化,base块中首页,通过指针遍历块中的n页,将每个页的flags位设置为0,表明当前页空闲可用,然后将页的property属性设置为set_page_refdefault_init_memmap(struct Page *base, size_t n) { assert(n 0); struct Page *p = base; for (; p != base + n; p ++) {//检查此页是否为保留页 assert(PageReserved(p)); //设置标志位 p-flags = p-property = 0; SetPageProperty(p);//清零此页的引用计数 set_page_ref(p, 0); //将空闲页插入到链表list_add_before(free_list, (p-page_link)); } base-property = n; //计算空闲页总数 nr_free += n;}default_alloc_pages()函数主要是用于为进程分配空闲页。其分配步骤主要为:①寻找足够大的空闲块,如果找到了,重新设置标志位②从空闲链表中删除此页③判断空闲块大小是否合适,如果不合适,分割页块,如果合适则不进行操作④计算剩余空闲页个数⑤返回分配的页块地址代码:static struct Page *default_alloc_pages(size_t n) { assert(n 0); if (n nr_free) { return NULL; } list_entry_t *len;list_entry_t *le = free_list;//在空闲链表中寻找合适大小的页块 while ((le = list_next(le)) != free_list) { struct Page *p = le2page(le, page_link);//找到了合适大
文档评论(0)