实验五虚拟内存页面置换算法.docx

上传人:b****2 文档编号:94210 上传时间:2023-04-28 格式:DOCX 页数:46 大小:20.38KB
下载 相关 举报
实验五虚拟内存页面置换算法.docx_第1页
第1页 / 共46页
实验五虚拟内存页面置换算法.docx_第2页
第2页 / 共46页
实验五虚拟内存页面置换算法.docx_第3页
第3页 / 共46页
实验五虚拟内存页面置换算法.docx_第4页
第4页 / 共46页
实验五虚拟内存页面置换算法.docx_第5页
第5页 / 共46页
实验五虚拟内存页面置换算法.docx_第6页
第6页 / 共46页
实验五虚拟内存页面置换算法.docx_第7页
第7页 / 共46页
实验五虚拟内存页面置换算法.docx_第8页
第8页 / 共46页
实验五虚拟内存页面置换算法.docx_第9页
第9页 / 共46页
实验五虚拟内存页面置换算法.docx_第10页
第10页 / 共46页
实验五虚拟内存页面置换算法.docx_第11页
第11页 / 共46页
实验五虚拟内存页面置换算法.docx_第12页
第12页 / 共46页
实验五虚拟内存页面置换算法.docx_第13页
第13页 / 共46页
实验五虚拟内存页面置换算法.docx_第14页
第14页 / 共46页
实验五虚拟内存页面置换算法.docx_第15页
第15页 / 共46页
实验五虚拟内存页面置换算法.docx_第16页
第16页 / 共46页
实验五虚拟内存页面置换算法.docx_第17页
第17页 / 共46页
实验五虚拟内存页面置换算法.docx_第18页
第18页 / 共46页
实验五虚拟内存页面置换算法.docx_第19页
第19页 / 共46页
实验五虚拟内存页面置换算法.docx_第20页
第20页 / 共46页
亲,该文档总共46页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

实验五虚拟内存页面置换算法.docx

《实验五虚拟内存页面置换算法.docx》由会员分享,可在线阅读,更多相关《实验五虚拟内存页面置换算法.docx(46页珍藏版)》请在冰点文库上搜索。

实验五虚拟内存页面置换算法.docx

实验五虚拟内存页面置换算法

.

 

实验五虚假内存页面置换算法

 

一、需求解析2

 

1.输入的形式和输入值的范围3

 

2.输出的形式4

 

3.程序所能达到的功能4

 

4.测试数据5

 

二、大纲设计6

 

1.抽象数据种类的定义6

 

2.主程序的流程7

 

3.程序各模块之间的层次(调用)关系8

 

三、详细设计8

 

1.voidFIFO()8

 

2.voidOPI()10

 

3.voidLRU()13

 

四、调试解析16

 

1.发现的问题16

 

2.算法的性能解析(包括基本操作和其他算法的时间复杂度和空间复杂度的解析)及其改

 

进设想;16

 

3.解决方法16

 

4.经验和领悟..............................................................................................................................17

.

 

五、用使用明17

 

六、果17

 

七.附19

 

一、需求解析

 

需求

 

在程运行程中,若其所的面不在内存而需把它入内存,但内存已无

 

空空,了保程能正常运行,系必从内存出一程序或数据送

 

磁的区中。

但将哪个面出,需依照必然的算法来确定。

平时,把

 

出面的算法称面置算法。

置算法的利害,将直接影响到系的性能。

 

一个好的面置算法,拥有低的更好率。

从理上,将那些今后不再

 

的面出,或把那些在内不再的面出。

 

目的

 

通次,加深虚内存面置看法的理解,

 

一步掌握先先出

 

FIFO、

 

最正确置

 

OPI

 

和近来最久未使用

 

LRU

 

面置算法的方法

 

内容

 

程序模先先出FIFO、最正确置OPI和近来最久未使用LRU面置算

 

法的工作程。

假内存中分配每个程的最小物理数m,在程运行

 

程中要的面个数n,面序列P1,⋯,Pn,分利用不相同的面置

 

算法度程的面序列,出面序列的置程,算每种算法缺

.

 

次数和缺率。

 

程序要求

 

1)利用先先出FIFO、最正确置OPI和近来最久未使用LRU三种面置算法

 

模面程。

 

2)模三种算法的面置程,出每个面的内存分配情况。

 

3)入:

最小物理数m,面个数n,面序列P1,⋯,Pn,算法1-FIFO,

 

2-OPI,3-LRU。

 

4)出:

每种算法的缺次数和缺率。

 

1.输入的形式和输入值的范围

 

从dos控制台界面依照入提示入数据(色的数字即入的内容)

物理(LackNum)

3

号数(PageNum

):

20

面序列(PageOrder):

701203042303

212

0

1

7

0

1

 

程的最大号数100,物理、面序列的int型的范。

.

 

2.输出的形式

 

入数据后,按出程序模先先出

 

ENTER即可在FIFO、最正确置

 

dosOPI

 

控制台界面获取果。

依照要求分

 

和近来最久未使用LRU面置算法的

工作程。

果以下:

 

首行是算法的名称,第二行是号序列,接下来的3行数字是模拟物理的情况,

 

着看才是正确的果,此示的是3物理内存占用情况。

此后示缺次

 

数和缺率。

 

3.程序所能达到的功能

 

程序模先先出FIFO、最正确置OPI和近来最久未使用LRU面置算法的工作

 

程。

假内存中分配每个程的最小物理数m,在程运行程中要的

 

面个数n,面序列P1,⋯,Pn,分利用不相同的面置算法度程的

 

面序列,出面序列的置程,算每种算法缺次数和缺率。

.

 

4.测试数据

.

 

二、大纲设计

 

1.抽象数据种类的定义

 

程序中进度调换时间变量描述以下:

 

constintMaxNumber=100;

 

intPageOrder[MaxNumber];

 

intSimulate[MaxNumber][MaxNumber];

 

intPageCount[MaxNumber];

 

intPageNum,LackNum;

 

doubleLackPageRate;

 

boolfound;

 

主要函数:

 

voidprint();

 

voidinit();

 

voidoriginal();

 

voidFIFO();

 

voidOPI();

 

voidLRU();

 

2.主程序的流程

 

Init()

 

输入a

.

 

初始化全局变量:

最小物理块数,页面个数,页

面接见序列

 

输出缺页次数和缺页

率及模拟过程

 

a=1

FIFO()

 

 

a=2

OPI()

 

 

a=3

LRU()

 

 

a=4

 

 

结束

.

 

3.程序各模块之间的层次(调用)关系

 

FIFO()Print()

 

1

 

main()调用Init()2OPI()Print()

3

 

LRU()Print()

 

三、详细设计

 

1.voidFIFO()

 

original();

 

Simulate[0][0]=PageOrder[0];

 

inttemp=0,flag=0;

 

for(i=1;i

 

{

 

//判断该页面可否存在内存中

 

for(j=0;j

 

{

 

if(PageOrder[i]==Simulate[flag][j])

.

 

break;

 

}

 

if(j==BlockNum)

 

{//该页面不在内存中

 

for(k=0;k

 

{//模拟置换过程

 

if(Simulate[flag][k]==NULL)

 

break;

 

else

 

Simulate[i][k]=Simulate[flag][k];

 

}

 

//裁汰最先进入内存的页面

 

temp++;

 

temp=temp%BlockNum;

 

Simulate[i][temp]=PageOrder[i];

 

LackNum++;

 

flag=i;

 

}//该页面在内存中

 

else

.

 

continue;

 

}

 

2.voidOPI()

 

original();

 

Simulate[0][0]=PageOrder[0];

 

inttemp,flag=0;//flag表示上一个模拟内存的下标

 

for(i=1;i

 

{

 

//判断该页面可否存在内存中

 

for(j=0;j

 

{

 

if(PageOrder[i]==Simulate[flag][j])

 

break;

 

}

 

//j!

=BlockNum表示该页面已经在内存中

 

if(j!

=BlockNum)

 

continue;

.

 

//模拟置换过程

 

for(k=0;k

 

{

 

if(Simulate[flag][k]==NULL)

 

break;

 

else

 

Simulate[i][k]=Simulate[flag][k];

 

}

 

//内存中页面进行选择

 

//两种情况:

内存已满和内存未满

 

for(j=0;j

 

{

 

if(Simulate[i][j]==NULL)

 

{

 

Simulate[i][j]=PageOrder[i];

 

LackNum++;

 

flag=i;

 

break;

 

}

 

}

.

 

if(j!

=BlockNum)//内存未满

 

continue;

 

//内存已满

 

temp=0;//temp表示要置换的页面内存下标

 

for(j=0;j

 

{//采用要置换的页面内存下标

 

for(k=i+1;k

 

{//最长时间内不被接见的页面

 

if(Simulate[i][j]==PageOrder[k])

 

{

 

PageCount[j]=k;

 

break;

 

}

 

}

 

if(k==PageNum)//此后没有进行对该页面的接见

 

PageCount[j]=PageNum;

 

if(PageCount[temp]

 

{

.

 

temp=j;

 

}

 

}

 

Simulate[i][temp]=PageOrder[i];

 

LackNum++;

 

flag=i;

 

}

 

3.voidLRU()

 

original();

 

Simulate[0][0]=PageOrder[0];

 

inttemp,flag=0;//flag表示上一个模拟内存的下标

 

PageCount[0]=0;//近来的页面下标

 

for(i=1;i

 

{

 

//判断该页面可否存在内存中

 

for(j=0;j

.

 

{

 

if(PageOrder[i]==Simulate[flag][j])

 

{

 

PageCount[j]=i;

 

break;

 

}

 

}

 

//j!

=BlockNum表示该页面已经在内存中

 

if(j!

=BlockNum)

 

continue;

 

//模拟置换过程

 

for(k=0;k

 

{

 

if(Simulate[flag][k]==NULL)

 

break;

 

else

 

Simulate[i][k]=Simulate[flag][k];

 

}

 

//内存中页面进行选择

.

 

//两种情况:

内存已满和内存未满

 

for(j=0;j

 

{

 

if(Simulate[i][j]==NULL)

 

{//内存未满

 

Simulate[i][j]=PageOrder[i];

 

PageCount[j]=i;

 

LackNum++;

 

flag=i;

 

break;

 

}

 

}

 

if(j!

=BlockNum)

 

continue;

 

//内存已满

 

temp=0;//temp表示要置换的页面内存下标

 

for(j=0;j

 

{//近来最久时间内不被接见的页面

 

if(PageCount[temp]>PageCount[j])

 

temp=j;

 

}

.

 

Simulate[i][temp]=PageOrder[i];

 

PageCount[temp]=i;

 

LackNum++;

 

flag=i;

 

}

 

}

 

四、调试解析

 

1.发现的问题

 

在编写程序的最先,界面不是很好,看着很乱。

最后求的缺页率也不是

 

用百分数表示。

 

2.算法的性能解析(包括基本操作和其他算法的时间复杂度和空间复杂度的解析)及其改进设想;

 

该程序的的时间复杂度还算理想,是O(m*n),空间复杂度也是相同,复杂

 

度为O(m*n),均不需要再改进了。

 

3.解决方法

 

界面使用空格填充,使各行各列对齐。

.

 

对于输出百分数,将缺页率乘以100,后加%输出。

 

4.经验和领悟

 

经过二次编程,又一次加深了对先进先出(FIFO)页面置换算法,最正确

 

(OPI)置换算法,近来最久未使用(LRU)置换算法的理解。

 

同时,也掌握了一些使界面输出看起来更工整的方法。

 

还有,在平时做作业的时候,总是默认为物理块数是3,其实可是比较

 

常用而已,其实不是每次都是3.这个在编程中有表现,在今后做题中会更注意。

 

五、用户使用说明

 

(1)用户依照提示输入物理块数

 

(2)输入页面个数

 

(3)依次输入页面接见个数

 

(4)依照提示选择算法,输入对应的数字。

 

六、测试结果

 

列出测试结果,包括输入和输出。

.

.

 

七.附录

 

#include

 

#include

 

usingnamespacestd;

 

constintMaxNumber=100;

 

int

 

PageOrder[MaxNumber];//

 

面序列

 

P1,

 

⋯,Pn,

int

 

int

Simulate[MaxNumber][MaxNumber];//PageCount[MaxNumber];//

模面置程

int

PageNum,LackNum;//

面数,缺数

doubleLackPageRate;//boolfound;

 

缺率

.

 

intBlockNum;

 

inti,j,k;

 

voidprint();

 

voidinit();

 

voidoriginal();

 

voidFIFO();

 

voidOPI();

 

voidLRU();

 

voidmain(){

 

//cout<

(2)<<"";

 

init();

 

boold=true;

 

while(d)

 

{

 

cout<<"

 

算法选择\nFIFO:

输入'1'\n

 

OPI:

 

输入

 

'2'\n

 

LRU:

 

输入

'3'\nexit:

输入'4'\n";

 

intc;

 

cin>>c;

 

switch(c){

.

 

case1:

 

cout<

\n";

 

FIFO();

 

print();

 

break;

 

case2:

 

cout<

\n";

 

OPI();

 

print();

 

break;

 

case3:

 

cout<

\n";

 

LRU();

 

print();

 

break;

 

case4:

 

d=false;

 

break;

 

default:

 

cout<<"你的输入有问题请重新输入!

\n";

 

break;

 

}

.

 

}

 

}

 

voidinit(){

 

cout<<"物理数m:

";

 

cin>>BlockNum;

 

cout<<"面个数n:

";

 

cin>>PageNum;

 

cout<<"面序列P1,⋯,Pn\n";

 

for(i=0;i

 

cin>>PageOrder[i];

 

}

 

voidoriginal(){

 

for(i=0;i

 

for(j=0;j

 

Simulate[i][j]=NULL;

 

LackNum=1;

 

}

.

 

voidprint(){

 

//模拟三种算法的页面置换过程,

 

//给出每个页面接见时的内存分配情况

 

//每种算法的缺页次数和缺页率。

 

LackPageRate=(double)LackNum/PageNum;

 

for(i=0;i

 

cout<

 

for(i=0;i

 

cout<

 

for(i=0;i

 

cout<

 

for(j=0;j

 

{

 

//for(i=0;i

 

//cout<

 

for(i=0;i

 

if(Simulate[i][j]==NULL)

 

cout<

 

else

 

cout<

 

cout<

.

 

}

 

//cout<

 

cout<<"缺页次数:

"<

 

率:

"<

 

}

 

voidFIFO(){

 

//先进先出:

最早出现的置换算法,总是裁汰最先进入内存的页面。

 

original();

 

Simulate[0][0]=PageOrder[0];

 

inttemp=0,flag=0;

 

for(i=1;i

 

{

 

//判断该页面可否存在内存中

 

for(j=0;j

 

{

 

if(PageOrder[i]==Simulate[flag][j])

 

break;

 

}

.

 

if(j==BlockNum)

 

{//该页面不在内存中

 

for(k=0;k

 

{//模拟置换过程

 

if(Simulate[flag][k]==NULL)

 

break;

 

else

 

Simulate[i][k]=Simulate[flag][k];

 

}

 

//裁汰最先进入内存的页面

 

temp++;

 

temp=temp%BlockNum;

 

Simulate[i][temp]=PageOrder[i];

 

LackNum++;

 

flag=i;

 

}//该页面在内存中

 

else

 

continue;

 

}

 

}

 

voidOPI(){

.

 

//最正确置换:

选择的被裁汰的页面都是今后永不使用也许在最长(未来)时间内不被接见的页面。

 

original();

 

Simulate[0][0]=PageOrder[0];

 

inttemp,flag=0;//flag表示上一个模拟内存的下标

 

for(i=1;i

 

{

 

//判断该页面可否存在内存中

 

for(j=0;j

 

{

 

if(PageOrder[i]==Simulate[flag][j])

 

break;

 

}

 

//j!

=BlockNum表示该页面已经在内存中

 

if(j!

=BlockNum)

 

continue;

 

//模拟置换过程

 

for(k=0;k

.

 

{

 

if(Simulate[flag][k]==NULL)

 

break;

 

else

 

Simulate[i][k]=Simulate[flag][k];

 

}

 

//内存中页面进行选择

 

//两种情况:

内存已满和内存未满

 

for(j=0;j

 

{

 

if(Simulate[i][j]==NULL)

 

{

 

Simulate[i][j]=PageOrder[i];

 

LackNum++;

 

flag=i;

 

break;

 

}

 

}

 

if(j!

=BlockNum)//内存未满

 

continue;

.

 

//内存已满

 

temp=0;//temp表示要置换的页面内存下标

 

for(j=0;j

 

{//采用要置换的页面内存下标

 

for(k=i+1;k

 

{//最长时间内不被接见的页面

 

if(Simulate[i][j]==PageOrder[k])

 

{

 

PageCount[j]=k;

 

break;

 

}

 

}

 

if(k==PageNum)//此后没有进行对该页面的接见

 

PageCount[j]=PageNum;

 

if(PageCount[temp]

 

{

 

temp=j;

 

}

 

}

.

 

Simulate[i][temp]=PageOrder[i];

 

LackN

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

当前位置:首页 > 人文社科

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2