#include <bits/stdc++.h>
#define Maxm 2000000
#define Maxn 10000
using namespace std;
const int maxm = 2e6+10;//本程序可容纳的最大地址流长度
const int maxn = 1e4+10;//本程序可容纳最大内存块数量
int n, m;//n为虚页的个数,m为地址流的长度
int EmpBlock;//内存块的数量
int VPAccess[maxm];//虚页访问
void FIFO();
void OPT();
void LRU();
bool Find(int, int[]);
int Find(int, int);
int Find(int, int, int);
void Display(int[]);
int main()
{
puts("温馨提示:\n1. 本程序最大可申请内存块为10000\n2. 最大可容纳地址流长度为2000000");
puts("请输入现有内存块数量");
scanf("%d", &EmpBlock);
while (EmpBlock>Maxn)
{
puts("请重新输入现有内存块数量");
scanf("%d", &EmpBlock);
}
puts("请输入虚页的数量和地址流的长度");
scanf("%d %d", &n, &m);
while (m>Maxm)
{
puts("请重新输入地址流长度");
scanf("%d", &m);
}
puts("请输入本次页面走向");
for(int i=0; i<m; ++i) scanf("%d", &VPAccess[i]);
FIFO();
OPT();
LRU();
return 0;
}
void FIFO()
{
puts("正在调用FIFO算法");
int cntS = 0;//计录成功次数
int cnt = 0;//记录现在有多少已经在内存
int Re[maxn];
int Point = 0;//寻找在缺页情况下该被替换的页面
for(int i=0; i<EmpBlock; ++i) Re[i] = -1;
for(int i=0; i<m; ++i){
int now = VPAccess[i];//代表现在要访问的页面
if(now>=n){
puts("Error visit");
return;
}
if(Find(now, Re) == true){
++cntS;
puts("success");
}
else{
puts("failed");
if(cnt<EmpBlock) Re[cnt++] = now;
else{
Re[Point] = now;
Point = (Point+1) % EmpBlock;
}
}
}
puts("命中率为:");
printf("%.6f\n", (cntS*1.0)/(m*1.0));
}
void OPT()
{
puts("正在调用OPT算法");
int cntS = 0;//计录成功次数
int cnt = 0;//记录现在有多少已经在内存
int Re[maxn];
int Point = 0;//寻找在缺页情况下该被替换的页面
for(int i=0; i<EmpBlock; ++i) Re[i] = -1;
for(int i=0; i<m; ++i){
int now = VPAccess[i];//代表现在要访问的页面
if(now>=n){
puts("Error visit");
return;
}
if(Find(now, Re)){
cntS++;
puts("success");
}
else{
if(cnt<EmpBlock) Re[cnt++] = now;
else{
int Max = -1;
for(int j=0; j<EmpBlock; ++j){
int nexpos = Find(Re[j], j);
if(nexpos>Max){
Max = nexpos;
Point = j;
}
}
Re[Point] = now;
}
puts("failed");
}
}
puts("命中率为:");
printf("%.6f\n", (cntS*1.0)/(m*1.0));
}
void LRU()
{
puts("正在调用LRU算法");
int cntS = 0;//计录成功次数
int cnt = 0;//记录现在有多少已经在内存
int Re[maxn];
int Point = 0;//寻找在缺页情况下该被替换的页面
for(int i=0; i<EmpBlock; ++i) Re[i] = -1;
for(int i=0; i<m; ++i){
int now = VPAccess[i];//代表现在要访问的页面
if(now>=n){
puts("Error visit");
return;
}
if(Find(now, Re)){
cntS++;
puts("success");
}
else{
if(cnt<EmpBlock) Re[cnt++] = now;
else{
int Min = m;
for(int j=0; j<EmpBlock; ++j){
int prepos = Find(Re[j], 0, i-1);
if(prepos<Min){
Min = prepos;
Point = j;
}
}
Re[Point] = now;
}
puts("failed");
}
}
puts("命中率为:");
printf("%f\n", (cntS*1.0)/(m*1.0));
}
bool Find(int t, int Re[])
{
for(int i=0; i<EmpBlock; ++i)
if(Re[i] == t) return true;
return false;
}
int Find(int x, int st)
{
for(int i=st; i<m; ++i){
if(VPAccess[i] == x) return i;
}
return m;
}
int Find(int x, int en, int st)
{
for(int i=st; i>=en; --i) if(VPAccess[i] == x) return i;
return -1;
}
void Display(int Re[])
{
puts("现阶段储存情况");
for(int i=0; i<EmpBlock; ++i){
if(Re[i] == -1) puts("Empty");
else printf("%d\n", Re[i]);
}
}
实验4 虚拟存储管理
于 2022-06-14 16:51:19 首次发布
本文实现了一个程序,用于演示和比较三种经典的页面替换算法:FIFO(先进先出)、OPT(最佳页面替换)和LRU(最近最久未使用)。程序中定义了最大内存块数量和地址流长度,并通过用户输入获取实际的内存块数量、虚页数量和地址流。在每种算法下,程序会输出页面访问的命中率,以评估其效率。
摘要由CSDN通过智能技术生成