内存管理模拟系统课设说明书
- 格式:doc
- 大小:91.50 KB
- 文档页数:19
*******************实践教学*******************兰州理工大学计算机与通信学院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对不起!内存中已经存在进程"<<PS->tenor<<",进程不允许重名!"<<endl;return ;}//判断容量if(PS->size>(100-sumtenor)){cout<<"\n对不起!内存容量不够,无法分配"<<endl;return ;}//直接分配为100Kif(PS->size==100){PS->front=NULL;PS->next=NULL;PS->FA=0;PS->EA=102399;head=PS;end=PS;sumtenor=100;return ;}while(handl!=NULL){if(handl->estate==0){if(handl->size==PS->size) //插入进程容量等于分区容量{if(handl==head) //插入的是头指针{sumtenor=sumtenor+PS->size; //累加进程容量PS->FA=head->FA;PS->EA=head->EA;PS->front=NULL;PS->next=head->next;head=PS;head->next->front=PS;return ;}else if(handl->next!=NULL) //插入指针在链表内{sumtenor=sumtenor+PS->size;PS->FA=handl->FA;PS->EA=handl->EA;PS->front=handl->front;PS->next=handl->next;handl->front->next=PS;handl->front=PS;return ;}else if(handl->next==NULL) //插入指针在链尾{sumtenor=sumtenor+PS->size;PS->FA=handl->FA;PS->EA=handl->EA;PS->front=handl->front;PS->next=NULL;end=PS;handl->front->next=PS;return ;}}if(handl->size>PS->size) //插入进程容量小于内存分区容量{if(handl==head) //插在头指针{sumtenor=sumtenor+PS->size;PS->FA=0;PS->EA=(PS->size)*1024-1;PS->front=NULL;PS->next=head;head->front=PS;head=PS;PS->next->FA=(PS->EA)+1;PS->next->size=PS->next->size-PS->size;return ;}else{sumtenor=sumtenor+PS->size;PS->front=handl->front;PS->next=handl;handl->front->next=PS; //改变前结点指针handl->front=PS;PS->FA=PS->front->EA+1;PS->EA=PS->FA+PS->size*1024-1;PS->next->FA=PS->EA+1;PS->next->size=PS->next->size-PS->size;return ;}}}handl=handl->next;}cout<<"\n\n"<<"对不起!虽然剩余内存容量足够,但是都是内存碎片,无法分配此进程!"<<endl;return ;}e.生成进程函数:void FFAinsert()此函数调用FFA()函数,手动生成进程,包括进程名和进程大小。
f.释放分区内进程函数:void free()此函数将进程中某个分区内的函数释放,形成空闲区。
g.空闲分区回收函数:void unite(Memory *hand)当内存中存在相邻的两个空闲分区时,执行此函数,将相邻两个空闲分区合并为一个分区。
h.查看内存状态函数:void consult()此函数将显示目前内存状况,包括个分区状态、分区中的进程以及整个内存状态。
i.选择界面函数:void list()此函数显示选择操作的界面,由用户选择决定下一步操作。
j.主函数:void main()主函数运行过程:主函数调用initialize()初始化分区链表,然后调用list()显示选择界面,根据键盘输入分别调用其它函数。
3.测试结果(1)生成4个进程a、b、c、d大小分别为8K、12K、40K、15K。
输入完毕以后查看内存状态:此时内存状态如图所示,动态分区根据输入的进程大小自动分成各个适当的区:(2)假设进程c完成,现在释放进程c,查看进程状态如下图所示:(4) 程序对错误的处理:首先,程序能够检查出重名的进程,对于重名的进程会给与错误提示;其次,能够检查出大小大于内存总量的进程,会提示错误;然后,对于大小小于内存目前总空闲区大小,但是没有单个空闲区能够容纳的进程,程序会给出剩余内存容量足够,但是都是内存碎片,无法分配进程的提示;最后对于释放进程时如果是内存中不存在的进程,程序会给出不存在进程的提示。