操作系统第5次实验报告:内存管理
------------恢复内容开始------------
- 姓名:黄财泽
- 学号:201821121014
- 班级:计算1811
一、实验目的
通过编程进一步了解内存管理。
二、实验内容
- 在服务器上用Vim编写一个程序:仿真实现某个内存管理算法,测试给出结果,并对解释运行结果。
三、实验报告
1. 记录内存空间使用情况
解释你是如何记录内存空间使用情况,给出关键代码。
2. 记录空闲分区
用什么样的方法记录内存空闲区,给出关键代码。
- 空闲分区表
- 空闲分区链表
- 位图
- ...
3. 内存分配算法
首次适应算法
void* FirstFit() //首次适应算法 { void *res_addr; //返回申请到的空间的首地址 int job_length = 0; int pos = findSpace(job_length); if(pos == -1) { cout<<"没有可用空间"<<endl; return NULL; } res_addr = (void*)frees.data[pos].addr; //没有在if判断时return 说明确实存在可用空间 //已用分区表已满需扩容 if(occupys.cursize == occupys.capacity) { increCapacity(occupys, 2); } //模拟进行进行分配的过程,注意已用空间数量+1 occupys.data[occupys.cursize].addr = frees.data[pos].addr; occupys.data[occupys.cursize].size = job_length; occupys.data[occupys.cursize].tag = 1; occupys.cursize++; if(frees.data[pos].size > job_length) //可用分区大小超过申请的大小 { frees.data[pos].addr += job_length; //修改该可用分区始址 frees.data[pos].size -= job_length; //修改该可用分区大小 }else //可用分区的大小恰好等于申请的大小 { for(int j = pos; j < frees.cursize-1; ++j) frees.data[j] = frees.data[j+1]; frees.cursize--; //可用分区数减1 } cout<<"空间申请成功\n"; return res_addr; }
4. 内存释放算法
void cancel() //撤销作业 { cout<<"请输入回收区的编号"<<endl; int num; cin>>num; if(num < 0 || num >= occupys.capacity) { cout<<"输入错误,返回"<<endl; return; } //取出待回收的区块 Item finish = occupys.data[num]; int i; for(i = num; i < occupys.cursize-1;++i) occupys.data[i] = occupys.data[i+1]; occupys.cursize -= 1; if(frees.cursize == frees.capacity) //对空闲分区表2倍扩容 increCapacity(frees,2); int pos; //pos记录插入点前一个 for(int i = 0; i < frees.capacity; ++i) { if(frees.data[i].addr+frees.data[i].size <= finish.addr || frees.data[i].size == 0) { pos = i; break; } } if(frees.data[pos].size == 0) //如果空闲分区表该项未使用直接放入 { frees.data[pos].addr = finish.addr; frees.data[pos].size = finish.size; frees.data[pos].tag = 0; return; } if(frees.data[pos].addr+frees.data[pos].size == finish.addr) //满足上邻接 { frees.data[pos].size += finish.size; //和上空闲区域合并 if(frees.data[pos+1].addr == finish.addr+finish.size) //满足同时还满足下邻接 表项数会改变 { frees.data[pos].size += frees.data[pos+1].size; for(int i = pos+1; i < frees.cursize-1; ++i) { frees.data[i] = frees.data[i+1]; } frees.cursize--; } }else //不满足上邻接 { if(frees.data[pos+1].addr == finish.addr+finish.size) //满足下邻接 { frees.data[pos+1].addr = finish.addr; frees.data[pos+1].size += finish.size; }else //不满足下邻接 表项数改变 { for(int i = frees.cursize-1; i >= pos+1 ; --i) { frees.data[i+1] = frees.data[i]; } frees.data[pos+1].addr = finish.addr; frees.data[pos+1].size = finish.size; frees.data[pos+1].tag = 0; frees.cursize++; } } }
5. 运行结果
(1)产生测试数据
(2)解释结果
撤消标号为1的空间
此时显示大小为100的空间已经被释放
释放空间大小为15的
该空间已经变为空闲
释放内存空间大小为200的