内存管理模拟系统课设说明书
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
*******************
实践教学
*******************
兰州理工大学
计算机与通信学院
2010秋季学期
操作系统原理课程设计
题目:内存管理模拟系统
专业班级:08级计算机二班
姓名:杨博
学号:08240217
指导教师:刘嘉
成绩:_________________
目录
摘要 (3)
正文 (4)
1.设计思想 (4)
2算法用到的主要数据结构 (5)
1)动态分区法: (5)
2.模块调试 (7)
3.测试结果 (13)
4.源程序 (15)
总结 (17)
参考文献 (18)
致谢 (19)
摘要
分区管理是把内存划分成若干个大小不等的区域,除操作系统占用一个区域之外,其余由多道环境下的各并发进程共享。分区管理是满足多道程序设计的一种最简单的存储管理方法。本实验过程都在Windows XP操作系统下完成,运用C++当中的链表结构比较容易实现本程序所要求功能,所以采用C++编程语言编写程序。
关键词:内存;分区;C++;
正文
1.设计思想
(1)分区存储管理:分区管理是把内存划分成若干个大小不等的区域,除操作
系统占用一个区域之外,其余由多道环境下的各并发进程共享。分区管理
是满足多道程序设计的一种最简单的存储管理方法。
(2) 动态分区法:动态分区法在作业执行前并不建立分区,分区的建立是在作
业的处理过程中进行的,且其大小可随作业或进程对内存的要求而改变。
改变了固定分区法中那种即使是小作业也要占据大分区的浪费现象,从而
提高了内存的利用率。
(3)动态分区时的分配与回收:动态分区时的分配与回收主要解决三个问题:
a.对于请求表中的要求内存长度,从可用表或自由链中寻找出合适的空闲
区分配程序。b.分配空闲区之后,更新可用表或自由链。c.进程或作业释
放内存资源时,和相邻的空闲区进行链接合并,更新可用表或自由链。
(4)最先适应法:最先适应法要求可用表或自由链按起始地址递增的次序排列。
该算法的最大特点是一旦找到大于或等于所要求内存长度的分区,则结束
探索。然后,该算法从所找到的分区中划出所要求的内存长度分配给用户,并把余下的部分进行合并后留在可用表中,但要修改其相应的表项。
2算法用到的主要数据结构
1)动态分区法:
动态分区法使用分区说明表等数据结构对内存进行管理。
分区说明表:分区说明表说明各分区号、分区大小、起始地址和是否是空闲区(分区状态)。内存的分配释放、存储保护以及地址变换等都通过分区说明表进行。
除了分区说明表之外,动态分区法还把内存中的可用分区单独构成可用分区表或可用分区自由链,已描述系统内的内存资源。与此相对应,请求内存资源的作业或进程也构成了一个内存资源请求表。
可用表
可用表的每个表目记录一个空闲区,主要参数包括区号、长度和起始地址。采用表格结构,管理过程比较简单,但表的大小难以确定,可用表要占用一部分内存。
上图为自由链,自由链是利用每个内存空闲区的头几个单元存放本空闲区的大小以及下个空闲区的起始地址,从而把所有的空闲区链接起来。然后,系统再设置一自由链首指针让其指向第一个空闲区,这样,管理程序可通过链首指针查到所有的空闲区。
请求表的每个表目描述请求内存资源的作业或进程号以及所请求的内存大小。
2.模块调试
a.struct Memory
{
int size; //分区容量
int estate; //分区状态
char tenor[10]; //装入的进程名
int FA; //内存首地址
int EA; //内存末地址
Memory *front;
Memory *next;
};
此模块定一个内存结构,由分区容量、分区状态、装入的进程名、内存首地址和内存末地址组成。
b.初始化分区链表函数
void initialize()
{
head=new Memory;
end=head;
head->next=NULL;
head->front=NULL;
head->size=100;
head->FA=0;
head->EA=102399;
head->estate=0;
sumtenor=0;
本程序中,事先定义一个大小为100KB的内存。
c.检测同名进程函数:int check(char *);在实验中,程序不允许重
名,如有重名则提示错误。
d.最先适应算法FFA的程序实现:
void FFA()
{
int ii=1;
Memory *handl=head;
Memory *PS;
Memory *PEnd;
PS=new Memory;
//输入进程信息
{
cout<<"请输入进程名: ";
cin>>PS->tenor;
cout<<"请输入进程大小(单位:KB): ";
cin>>PS->size;
PS->estate=1;
}
//判断进程
int vc;
vc=check(PS->tenor);
if(vc==0)
{
cout<<"\n对不起!内存中已经存在进程"< return ; } //判断容量 if(PS->size>(100-sumtenor)) { cout<<"\n对不起!内存容量不够,无法分配"<