操作系统实验(四)实验报告 虚拟内存 下载本文

内容发布更新时间 : 2024/4/30 15:57:12星期一 下面是文章的全部内容请认真阅读。

操作系统实验(四) 虚拟内存

1、实验题目

页面置换算法模拟——OPT、FIFO和LRU算法

2、实验目的

了解虚拟存储技术的特点,掌握请求页式存储管理的页面置换算法,如最佳

(Optimal)置换算法、先进先出(Fisrt In First Out)置换算法和最近最久未使用(Least Recently Used)置换算法

3、实验内容

1)OPT算法:需要发生页面置换时,算法总是选择在将来最不可能访问的

页面进行置换。

2)FIFO算法:算法总是选择在队列中等待时间最长的页面进行置换。

3)LRU算法:如果某一个页面被访问了,它很可能还要被访问;相反,如果它长时间不被访问,那么,在最近未来是不大可能被访问的。

4、程序代码

#include #include #include #include

#define L 30///页面走向长度最大为30 using namespace std;

int M=4; ///内存块 struct P///定义一个结构体 {

int num,time; }p[30];

int Input(int m,P p[L])///打印页面走向状态 {

m=30; int i,j;

j=time(NULL);///取时钟时间

srand(j);///以时钟时间x为种子,初始化随机数发生器 cout<<\页面走向: \ for(i=0; i

p[i].num=rand( );///产生1到10之间的随即数放到数组p中

p[i].time=0;

cout<

cout<

void print(P *page1)///打印当前的页面 {

P *page=new P[M]; page=page1;

for(int i=0; i

cout<

int Search(int e,P *page1 )///寻找内存块中与e相同的块号 {

P *page=new P[M]; page=page1;

for(int i=0; i

int Max(P *page1)///寻找最近最长未使用的页面 用于OPT算法 {

P *page=new P[M]; page=page1;

int e=page[0].time,i=0;

while(i

if(e

for( i=0; i

int Count(P *page1,int i,int t,P p[L])///记录当前内存块中页面离下次使用间隔长度 用于OPT算法 {

P *page=new P[M]; page=page1; int count=0;

for(int j=i; j

if(page[t].num==p[j].num )break;///当前页面再次被访问时循环结束 else count++;///否则count+1 }

return count;///返回count的值 }

int main() {

int c=1; int m=0,t=0;

float n=0;///缺页次数

m=Input(m,p);///调用input函数,返回m值 M=4;

P *page=new P[M];

///do

while(c==1||c==2||c==3) {

int i=0;

for(i=0; i

page[i].num=0; page[i].time=m-1-i; }

cout<<\页面置换\ cout<<\页面置换\ cout<<\页面置换\

cout<<\按其它键结束程序;\ cin>>c;

if(c==1)///FIFO页面置换 ///FIFO(); {

n=0;

cout<<\算法页面置换情况如下: cout<

if(Search(p[i].num,page)>=0) 存中

{

cout<

\ ///当前页面在内 ///输出当前页 cout<<\ \ i++; ///i加1 }

else ///当前页不在内存中

{

if(t==M)t=0; else {

n++; ///缺页次数加1

page[t].num=p[i].num; ///把当前页面放入内存中

cout<

print(page); ///打印当前页面 t++; //下一个内存块

i++; ///指向下一个页面

} } }

cout<<\缺页次数:\ 缺页率:\= \ }

if(c==2)///LRU页面置换,最近最久未使用 {

n=0;

cout<<\ LRU算法页面置换情况如下: \

cout<

int a;

t=Search(p[i].num,page);

if(t>=0)///如果已在内存块中

{

page[t].time=0;///把与它相同的内存块的时间置0 for(a=0; a

if(a!=t)page[a].time++;///其它的时间加1 cout<

else ///如果不在内存块中 {

n++; ///缺页次数加1

t=Max(page); ///返回最近最久未使用的块号赋值给t

page[t].num=p[i].num; ///进行替换

page[t].time=0; ///替换后时间置为0 cout<

for(a=0; a

if(a!=t)page[a].time++; ///其它的时间加1

} i++; }

cout<<\缺页次数:\ 缺页率:\= \ }

if(c==3)///OPT页面置换 {

n=0;

cout<<\ OPT算法置换情况如下:\ cout<

if(Search(p[i].num,page)>=0)///如果已在内存块中 {

cout<

else///如果不在内存块中 {

int a=0;

for(t=0; t

if(page[t].num==0)a++;///记录空的内存块数 if(a!=0) ///有空内存块 {

int q=M;

for(t=0; t

if(page[t].num==0&&q>t)q=t;///把空内存块中