文档详情

可变分区存储管理方式的内存分配回收.doc

发布:2019-12-08约6.33千字共12页下载文档
文本预览下载声明
上海交通大学 实验报告 文 档 编 号 Document number 版 本 Version 页 码 Page number A0 PAGE 2 ( NUMPAGES 12) XXXXXXXXXX 文档状态 Document status 发布版 发布日期 Release date 2017-3-30 DZ-2013-5 DZ-2013-5 上海交通大学 实验报告 文 档 编 号 Document number 版 本 Version 页 码 Page number A0 PAGE 1 ( NUMPAGES 12) 实验报告 操作系统 可变分区存储管理方式的内存分配回收 班级:XXXXXXXXXXXX 学号:XXXXXXXXXXXX 姓名:XXXXXX 日期:XXXX.XX.XX 版本历史 Revisions History 版 本 号 Version Number 修改项目 To modify the project 修订者 Redactor 日期 Date 目录 TOC \o 1-3 \h \z \u 1 引言 4 1.1 实验目的 4 1.2 参考文档 4 2 可变分区存储管理 5 2.1 实验原理分析 5 2.2 设计思路 5 2.3 源程序 6 2.4 重要结构体说明 10 2.5 重要变量说明 10 2.6 结果 11 2.7 测试方法对结果的分析 11 2.8 接口 12 2.8.1 接口设计说明 12 2.9 任务设计 12 2.9.1 流程图 12 引言 实验目的 通过首次适应算法、最佳适应算法和最坏适应算法实现主存空间的分配, 可以使开发人员更好地理解存储分配算法。 参考文档 操作系统2.3.1节 空闲存储区表 操作系统2.3.2节 首次适应法(1.分配算法,2.回收算法) 可变分区存储管理 实验原理分析 在可变分区模式下,在系统初启且用户作业尚未装入主存储器之前,整个用户区是一个大空闲分区,随着作业的装入和撤离,主存空间被分成许多分区,有的分区被占用,而有的分区时空闲的。为了方便主存空间的分配和去配,用于管理的数据结构可由两张表组成:“已分配区表”和“未分配区表”。在“未分配表中”将空闲区按长度递增顺序排列,当装入新作业时,从未分配区表中挑选一个能满足用户进程要求的最小分区进行分配。这时从已分配表中找出一个空栏目登记新作业的起始地址和占用长度,同时修改未分配区表中空闲区的长度和起始地址。当作业撤离时已分配区表中的相应状态变为“空”,而将收回的分区登记到未分配区表中,若有相邻空闲区再将其连接后登记。 设计思路 分配算法: 采用首次适应法为作来分配大小为size的内存空间时,总是从表的起始端的低地址部分开始查找,当第一次找到大于或等于申请大小的空闲区时,就按所需大小分配给作业。如果分配后原空闲区还有剩余空间,就修改原存储区表项的m_size和m_addr,使它记录余下的“零头”。如果作业所需空间正好等于该空闲区大小,那么该空闲区表项的m_size就成为0,接下来要删除表中这个“空洞”,即将随后的各非零表项依次上移一个位置。 回收算法: 当某一作业回收以前所分配到的内存时,就要将该内存区归还给系统,使其成为空闲区而可被其它作来使用。回收时如释放区与邻近的空闲区相衔接,要将它们合并成较大的空闲区,否则空闲区将被分割得超来越小,最终导致不能利用;另外,空闲区个数越来越多,也会使空闲区登记表溢出。 源程序 /* | 如不会使用文件输入/输出,也不会使用I/O转向做输入和输出结果文件, | 可以手再抄输出结果后后再输到文件中,实验报告的文字内容由自己掌握,能多能少。 */ #include stdio.h #include malloc.h /*表的定义*/ #define N 5 #define MEMSIZE 1000 typedef struct map { unsigned m_size; char *m_addr; }; struct map coremap[N]; /* coremap表的初始化程序*/ void initcoremap(char *addr, unsigned size) { unsigned i; printf(init coremap, first addr: %d\n, addr); coremap[0].m_size = size; coremap[0].m_addr = addr; for(i = 1; i N; i++) {
显示全部
相似文档