📄 请求式页面存储管理.cpp
字号:
#include<iostream>
#include<stdio.h>
#include<conio.h>
#define M 4
#define N 17
#define Myprintf cout<<"|---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---|\n" //表格控制
typedef struct page
{
int num; //记录页面号
int time; //记录调入内存时间
}Page; //页面逻辑结构,结构为方便算法实现设计
Page b[M]; //内存单元数
int c[M][N]; //暂保存内存当前的状态:缓冲区
int queue[100]; //记录调入队列
int K; //调入队列计数变量
//初始化内存单元、缓冲区
void Init(Page *b,int c[M][N])
{
int i,j;
for(i=0;i<N;i++)
{
b[i].num=-1;+
b[i].time=N-i-1;
}
for(i=0;i<M;i++)
for(j=0;j<N;j++)
c[i][j]=-1;
}
//取得在内存中停留最久的页面,默认状态下为最早调入的页面
int GetMax(Page *b)
{
int i;
int max=-1;
int tag=0;
for(i=0;i<M;i++)
{
if(b[i].time>max)
{
max=b[i].time;
tag=i;
}
}
return tag;
}
//判断页面是否已在内存中
int Equation(int fold,Page *b)
{
int i;
for(i=0;i<M;i++)
{
if (fold==b[i].num)
return i;
}
return -1;
}
//LRU核心部分
void Lru(int fold,Page *b)
{ int i;
int val;
val=Equation(fold,b);
if (val>=0)
{
b[val].time=0;
for(i=0;i<M;i++)
if (i!=val)
b[i].time++;
}
else
{
queue[++K]=fold;//记录调入页面
val=GetMax(b);
b[val].num=fold;
b[val].time=0;
for(i=0;i<M;i++)
if (i!=val)
b[i].time++;
}
}
//主程序
#include<iostream>
#include <iomanip>
using namespace std;
void main()
{
int a[N];
int i,j,q;
cout<<"请输入17个元素的值"<<endl;
for(i=0;i<17;i++)
{
q=i;
q++;
cout<<"第"<<q<<"个元素的值\n";
cin>>a[i];
if(a[i]<0||a[i]>9)
{
cout<<"输入错误,请重新输入一个1位数!\n";
i--;
}
}
start: K=-1;
Init(b, c);
for(i=0;i<N;i++)
{
Lru(a[i],b);
c[0][i]=a[i];
//记录当前的内存单元中的页面
for(j=0;j<M;j++)
c[j][i]=b[j].num;
}
//结果输出
cout<<"内存状态为:\n";
Myprintf;
for(j=0;j<N;j++)
cout<<"|"<<setw(3)<<a[j];
cout<<"|\n";
Myprintf;
for(i=0;i<M;i++)
{ for(j=0;j<N;j++)
{
if(c[i][j]==-1)
cout<<"|"<<setw(4);
else
cout<<"|"<<setw(3)<<c[i][j];
}
cout<<"|\n";
}
Myprintf;
cout<<"\n调入队列为:";
for(i=0;i<K+1;i++)
cout<<setw(4)<<queue[i];
cout<<"\n缺页次数为:"<<K+1;
cout<<"\nAre you continuing!\ty?";
if(getche()=='y')
goto start;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -