操作系统课程设计报告书
- 格式:doc
- 大小:567.00 KB
- 文档页数:57
课程设计报告书2014 / 2015 学年第 2 学期
课程名称:操作系统课程设计
专业班级:_计算机科学与技术1303班__ 学号:________ _________ 姓名:_________ ___________ 指导教师:_____ 邵虹崔文成 ______
题目1 连续动态内存管理模拟实现
1.1 题目的主要研究内容及预期达到的目标
(1)针对操作系统中内存管理相关理论进行设计,编写程序并进行测试,该程序管理一块虚拟内存。重点分析三种连续动态内存分配算法,即首次适应算法、循环首次适应算法和最佳适应算法。
(2)实现内存分配和回收功能。
1.2 题目研究的工作基础或实验条件
(1)硬件环境:PC机
(2)软件环境:Windows XP,Visual C++ 6.0
1.3 设计思想
首次适应算法的实现:从空闲分区表的第一个表目起查找该表,把最先能够满足要求的空闲区分配给作业,这种方法的目的在于减少查找时间。为适应这种算法,空闲分区表中的空闲分区要按地址由低到高进行排序。该算法优先使用低址部分空闲区,在低址空间造成许多小的空闲区,在高址空间保留大的空闲区。
循环首次适应算法的实现:在分配内存空间时,不再每次从表头开始查找,而是从上次找到空闲区的下一个空闲开始查找,直到找到第一个能满足要求的的空闲区为止,并从中划出一块与请求大小相等的内存空间分配给作业。该算法能使内存中的空闲区分布得较均匀。
最佳适应算法的实现:从全部空闲区中找到能满足作业要求的、且最小的空闲分区,这种方法能使碎片尽量小。为适应此算法,空闲分区表中的空闲分区要按从小到大进行排序,从表头开始查找第一个满足要求的自由分配。
1.4 流程图
内存分配流程图,如图1-1所示。
图1-1 内存分配流程图内存回收流程图,如1-2所示。
图1-2 内存回收流程图
1.5 主要程序代码
(1)分配内存
void allocate(char z,float l)
{
int i,k;
float ad;
k=-1;
for(i=0;i if(free_table[i].length >= l && free_table[i].flag == 1) if(k==-1 || free_table[i].length k=i; if(k==-1) printf("无可用空闲区\n"); return; } if(free_table[k].length-l <= minisize) { free_table[k].flag=0; ad=free_table[k].address; l=free_table[k].length; } else { free_table[k].length=free_table[k].length-l; ad=free_table[k].address+free_table[k].length; } i=0; while(used_table[i].flag!=0 && i i++; if(i>=n) { printf("无表目填写已分分区,错误\n"); if(free_table[k].flag==0) free_table[k].flag=1; else { free_table[k].length=free_table[k].length+l; return; } } else used_table[i].address=ad; used_table[i].length=l; used_table[i].flag=z; } return; } (2)回收内存 void reclaim(char z) { int i,k,j,s,t; float S,L; s=0; while((used_table[s].flag!=z || used_table[s].flag==0)&&s if(s>=n) { printf("找不到该作业\n"); return; } used_table[s].flag=0; S=used_table[s].address; L=used_table[s].length; j=-1; k=-1; i=0; while(i { if(free_table[i].flag==1) { if(free_table[i].address+free_table[i].length==S) k=i; if(free_table[i].address==S+L) j=i; } i++; } if(k!=-1) if(j!=-1) { free_table[k].length=free_table[j].length+free_table[k].length+L; free_table[j].flag=0; } else free_table[k].length=free_table[k].length+L; else if(j!=-1) { free_table[j].address=S; free_table[j].length=free_table[j].length+L; } else { t=0; while(free_table[t].flag==1&&t t++; if(t>=m) { printf("主存空闲表没有空间,回收空间失败\n"); used_table[s].flag=z; return;