内存的分配与回收.docx
- 文档编号:1953449
- 上传时间:2022-10-25
- 格式:DOCX
- 页数:11
- 大小:86.87KB
内存的分配与回收.docx
《内存的分配与回收.docx》由会员分享,可在线阅读,更多相关《内存的分配与回收.docx(11页珍藏版)》请在冰豆网上搜索。
内存的分配与回收
操作系统实验报告
实验名称:
模拟内存的分配与回收
文档编写者:
吴向阳
系班:
计算机科学系0501班
学号:
05150116
完成时间:
2007年12月23日
指导老师:
陈年生李光敏
模拟内存的分配与回收
班级:
计算机科学系0501班姓名:
吴向阳完成时间:
2007年12月13日
问题描述
本实验主要是模拟基于多道程序设计系统在可变分区式和分页式两种存储管理方式下的主存分配和回收。
在程序中采用链表方式来管理作业和页表项,采用队列来管理等待作业。
在模拟可变分区式存储管理时,采用最先适应算法实现主存的分配与回收,建立了已分配区表和未分配区表,等待队列。
在模拟分页式存储管理时,采用位示图来表示主存,建立了作业表和页表,在主存中的作业队列和等待队列。
需要说明的是,我们没有考虑系统可容纳作业的道数和作业对除主存以外的其它资源的要求,认为只要系统主存可以满足要求作业就加载到主存。
同时等待队列是采用先进先出的管理方式。
数据结构及符号说明
可变分区式存储管理的已分配区表和未分配区表的结构用记录描述如下:
structAssigntab{
intnumber;//分区号
intaddr;//起始地址
intlength;//长度
charsign[10];//标志
structAssigntab*next;//指向下一个分区号
};
分页式存储管理:
位示图记录描述:
intweitu[8][8];//位示图
intblank=64;//当前空闲的块号
作业表的结构用记录描述:
//作业表结构体
structjobtable{
charjobname[10];//作业的名字
intjobsize;//作业的大小
structpagetable*head;//指向作业的页表
structjobtable*next;//指向下一个作业
};
页表的结构用记录描述:
//作业的页表结构体
structpagetable{
intpagenum;//页号
intblocknum;//块号
structpagetable*next;//指向下一项
};
流程图
该可变分区式存储管理程序由主程序、初始化子程序、打印子程序、模拟内存分配子程序、模拟内存回收子程序等构成,下面给出这些模块的框图:
分页式存储管理程序由主程序、初始化子程序、打印位示图子程序、打印作业表子程序、打印页表子程序、打印等待作业表、模拟内存分配子程序、模拟内存回收子程序等构成。
内存分配算法:
内存回收算法:
部分源程序:
//可变分区式存储管理(最先适应算法)
#include""
#include""
#include<>
#defineNULL0
#defineLENsizeof(structAssigntab)
#defineDEBUG
//数据结构的定义
//已分配区表Assigtab,未分配区表Unassigntab,保存一栏的信息temp
//标志sign为NULL时表示该栏为空
//定义两个结构体指针Asshead(指向表Assigtab)和Unahead(指向表Unassigntab)
//用全局变量sucessed
structAssigntab{
intnumber;//分区号
intaddr;//起始地址
intlength;//长度
charsign[10];//标志
structAssigntab*next;//指向下一个分区号
};
structAssigntab*Asshead,*Unahead,*waithead;
structAssigntab*p,*q;
structAssigntab*r1,*s1;
intn=0;
intn1=0;
intn2=0;
intsuccess=0;
//主函数
intmain()
{
charch;
p=q=(structAssigntab*)malloc(LEN);
r1=s1=(structAssigntab*)malloc(LEN);
init();
cout<<"请选择操作码:
";
cin>>ch;
do{
if(ch=='0')break;
switch(ch)
{
case'1':
displayUna();break;//查询未分分配区表
case'2':
displayAss();break;//查询已分配区表
case'3':
displaywait();break;//查询等待作业队列
case'4':
fenpei();break;//装载一个作业
case'5':
huishou();break;//撤消一个作业
}
cout<<"请选择操作码:
";
cin>>ch;
if(ch=='0')break;
}while
(1);
return0;
}
//分页式存储管理
#include<>
#include<>
#include<>
#include""
#include""
#defineNULL0
#defineLENsizeof(structpagetable)
#defineLENJsizeof(structjobtable)
//作业的页表结构体
structpagetable{
intpagenum;//页号
intblocknum;//块号
structpagetable*next;//指向下一项
};
//作业表结构体
structjobtable{
charjobname[10];//作业的名字
intjobsize;//作业的大小
structpagetable*head;//指向作业的页表
structjobtable*next;//指向下一个作业
};
intweitu[8][8];//位示图
intweitusize=2;//内存每块为2K
intblank=64;//当前空闲的块号
intsign=0;//内存分配错误标志
intlist=0;//作业序列
intn=0;//内存作业队列标志
intn1=0;//等待作业队列标志
structjobtable*r,*s;
structjobtable*r1,*s1;
structjobtable*jobhead;//作业表
structjobtable*waithead;//等待作业表
//主函数
intmain()
{
charch;
//初始化工作
jobhead=NULL;
waithead=NULL;
initweitu();
r=s=(structjobtable*)malloc(LENJ);
r1=s1=(structjobtable*)malloc(LENJ);
//菜单功能
cout<<"**********分页式内存管理的模拟系统************"< cout<<"查询内存分配位示图,请按: 1\n" <<"查询等待作业队列,请按: 2\n" <<"查询内存中作业队列,请按: 3\n" <<"查询某作业的页表,请按: 4\n" <<"装载一个作业,请按: 5\n" <<"撤消一个作业,请按: 6\n" <<"退出系统,请按: 0\n"; cout<<"**********************************************"< cout<<"请选择操作码: "; cin>>ch; do{ if(ch=='0'){cout<<"你真的要退出系统吗? (Y/N): "; cin>>ch; if(ch=='Y')break; else{cout<<"请选择操作码: "; cin>>ch;} } //用switch语句实现任务选择功能 switch(ch) { case'1': display();break; case'2': displaywait();break; case'3': displayjob();break; case'4': yebiao();break; case'5': jiazai();break; case'6': cexiao();break; default: cout<<"您的输入有错误,请重新输入\n"; } cout<<"请选择操作码: "; cin>>ch; if(ch=='0'){cout<<"你真的要退出系统吗? (Y/N): "; cin>>ch; if(ch=='Y')break; else{cout<<"请选择操作码: "; cin>>ch;} } }while (1); cout<<"谢谢使用分页式内存管理的模拟系统"< return0; } 运行结果: 实验说明: 在可变分区管理中,采用最先适应分配算法,这种算法优先利用主存低地址空闲分区不断被分割,既可能将大的空间分割掉,也造成低地址部分有较多难以使用的“碎片“。 作为改进,可把空闲区按地址从小到大排列在未分配表或链表中。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 内存 分配 回收