实验5虚拟存储器.docx

上传人:b****8 文档编号:10766794 上传时间:2023-02-22 格式:DOCX 页数:13 大小:531.79KB
下载 相关 举报
实验5虚拟存储器.docx_第1页
第1页 / 共13页
实验5虚拟存储器.docx_第2页
第2页 / 共13页
实验5虚拟存储器.docx_第3页
第3页 / 共13页
实验5虚拟存储器.docx_第4页
第4页 / 共13页
实验5虚拟存储器.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

实验5虚拟存储器.docx

《实验5虚拟存储器.docx》由会员分享,可在线阅读,更多相关《实验5虚拟存储器.docx(13页珍藏版)》请在冰豆网上搜索。

实验5虚拟存储器.docx

实验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].length

k=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&&i

if(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&&t

t++;

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;i

used_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.运行结果以及结论。

建立页表

指令执行

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1