实验5虚拟存储器.docx
《实验5虚拟存储器.docx》由会员分享,可在线阅读,更多相关《实验5虚拟存储器.docx(13页珍藏版)》请在冰豆网上搜索。
实验5虚拟存储器
操作系统实验
实验五虚拟存储器管理
学号
姓名
班级
华侨大学电子工程系
实验目的
1、理解虚拟存储器概念。
2、掌握分页式存储管理地址转换盒缺页中断。
实验内容与基本要求
1、模拟分页式存储管理中硬件的地址转换和产生缺页中断。
2、用先进先出页面调度算法处理缺页中断。
实验报告内容
1、分页式存储管理和先进先出页面调度算法原理。
1.1分页式存储管理原理
采用分页存储器允许把一个作业存放到若干不相邻的分区中,既可免去移动信息的工作,又可尽量减少主存的碎片。
分页式存储管理的基本原理如下:
A、页框:
物理地址分成大小相等的许多区,每个区称为一块;
B、址分成大小相等的区,区的大小与块的大小相等,每个称一个页面。
C、逻辑地址形式:
与此对应,分页存储器的逻辑地址由两部分组成,页号和单元号。
逻辑地址格式为页号单元号(页内地址)采用分页式存储管理时,逻辑地址是连续的。
所以,用户在编制程序时仍只须使用顺序的地址,而不必考虑如何去分页。
D、页表和地址转换:
如何保证程序正确执行呢?
采用的办法是动态重定位技术,让程序的指令执行时作地址变换,由于程序段以页为单位,所以,我们给每个页设立一个重定位寄存器,这些重定位寄存器的集合便称页表。
页表是操作系统为每个用户作业建立的,用来记录程序页面和主存对应页框的对照表,页表中的每一栏指明了程序中的一个页面和分得的页框的对应关系。
绝对地址=块号*块长+单元号程序流程图。
1.2先进先出页面调度算法原理
先进先出调度算法根据页面进入内存的时间先后选择淘汰页面,先进入内存的页面先淘汰,后进入内存的后淘汰。
本算法实现时需要将页面按进入内存的时间先后组成一个队列,每次调度队首页面予以淘汰。
2程序流程图
a虚拟管理主流程图
b先进先出调度流程图
3程序及注释
#include"malloc.h"
#include"stdio.h"
#include"iostream.h"
#include"stdlib.h"
#definen10//假定系统允许的最大作业为,假定模拟实验中n值为10#definem10//假定系统允许的空闲区表最大为m,假定模拟实验中m值为10
#defineminisize100
typedefstruct
{
floataddress;//已分分区起始地址
floatlength;//已分分区长度,单位为字节
intflag;//已分配区表登记栏标志,用"0"表示空栏目,实验中只支持一个字符的作业名
}used_table[n];//已分配区表
typedefstruct
{
floataddress;//空闲区起始地址
floatlength;//空闲区长度,单位为字节
intflag;//空闲区表登记栏标志,用"0"表示空栏目,用"1"表示未分配}free_table[m];//空闲区表
//采用最优分配算法分配xk大小的空间
allocate(charJ,floatxk)
{
inti,k;
floatad;
k=-1;
for(i=0;i=xk&&free_table[i].flag==1)
if(k==-1||free_table[i].lengthk=i;
if(k==-1)//未找到可用空闲区,返回
{
printf("无可用空闲区\n");
return;
}
//找到可用空闲区,开始分配:
若空闲区大小与要求分配的空间差小于msize大小,则空闲区全部分配;若空闲区大小与要求分配的空间差大于minisize大小,则从空闲区划出一部分分配
if(free_table[k].length-xk<=minisize)
{
free_table[k].flag=0;//该空闲区被分配
ad=free_table[k].address;
xk=free_table[k].length;
}
else
{
free_table[k].length=free_table[k].length-xk;ad=free_table[k].address+free_table[k].length;}
//修改已分配区表
i=0;
//寻找空表目
while(used_table[i].flag!
=0&&iif(i>=n)
{
printf("无表目填写已分区,错误//修正空闲区表
if(free_table[k].flag==0)
free_table[k].flag=1;
//前面找到的是某个空闲分区的一部分else
{
free_table[k].length=free_table[k].length+xk;return;\n");
}
}
//修改已分配表
else
{
used_table[i].address=ad;
used_table[i].length=xk;
used_table[i].flag=J;
}
return;
}
//回收作业名为J的作业所占主存空间
reclaim(charJ)
{
inti,k,j,s,t;
floatS,L;
//寻找已分配表中对应登记项
s=0;
while((used_table[s].flag!
=J||used_table[s].flag==0)&&s//在已分配表中找不到名字为J的作业
if(s>=n)
{
{printf("找不到作业\n");
return;
}
//修改已分配表
used_table[s].flag=0;
//取得归还分区的起始地址S和长度L
S=used_table[s].address;
L=used_table[s].length;
j=-1;
k=-1;
//寻找回收分区的空闲上下邻,上邻表目k,下邻表目ji=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&&tt++;
if(t>=m)//空闲区表满,回收空间失败,将已分配表复原
{
out<<"主存空闲表没有空间,回收空间失败"<第7/11页
used_table[s].flag=J;
return;
}
free_table[t].address=S;
free_table[t].length=L;
free_table[t].flag=1;
}
return;
}
//主函数
voidmain()
{
inti,a;
floatxk;
chars;
ifstreamin("input.txt");
//空闲分区表初始化
free_table[0].address=10240;
free_table[0].length=102400;
free_table[0].flag=1;
for(i=1;i第8/11页
free_table[i].flag=0;
//已分配表初始化
for(i=0;iused_table[i].flag=0;
while
(1)
{
printf("选择功能象(0-退出,1-分配主存,2-回收主存,3-显示主存)\n");
printf("选择功能象(0~3):
\n");
scanf("%d",&a);
switch(a)
{
case0:
exit(0);
case1:
printf("输入作业名J和作业名所需长度xk\n");
scanf("%c%c%f",&J,&xk);allocate(J,xk);break;
case2:
printf("输入要回收分区的作业名");
scanf("%c%c",&J);
第9/11页
reclaim(J);break;
case3:
");
for(i=0;i\n起使地址分区长度标志
printf("%6.0f%9.0f%6d\n",free_table[i].address,free_table[i].length,free_
table[i].flag);
printf("按任意键,输出已分配区表\n");
getchar();printf("输出已分配表:
\n起使地址分区长度标志\n");
for(i=0;i=0)
printf("%6.0f%9.0f%6c\n",used_table[i].address,used_table[i].length,use
d_table[i].flag);
else
printf("%6.0f%9.0f%6d\n",used_table[i].address,used_table[i].length,use
第10/11页
d_table[i].flag);
break;
default:
defult:
printf("没有该选项\n");}
}
}
4.运行结果以及结论。
建立页表
指令执行