#include<iomanip>
#include <iostream>
using namespace std;
int tins = 320;//total instructions总指令数
int ins[320] = { -1 };//指令序列
int page[320] = { -1 };//页号
int men[33] = { -1 };//内存块
//指令序列用i
//页面序列用p
//内存块用m
//double hit = 0;//记录击中次数
//double miss = 0;//缺页次数
//int flag=0;//0 :hit;1:miss
//int mflag = 0;//是否写入空闲块
void init()
{
srand((unsigned int)time(NULL));
/*cout << "指令序列如下:" << endl;
cout << "序号:指令地址" << endl;*/
for (int i = 0; i < tins; i++)//F.重复步骤A-E,直到320次指令 while(i<320)
{
int m = rand() % tins;//A.随机选取起点m
ins[i] = m + 1;//B.顺序执行m+1的指令 //写进指令序列
// cout <<setw(3)<<i<<":"<< setw(6) << ins[i] << endl;
int m1 = rand() % (m + 1);//C.前地址[0,m+1]中随机选取一条指令并执行
ins[++i] = m1;//写进指令序列
// cout << setw(3)<< i << ":" << setw(6) << ins[i] << endl;
ins[++i] = m1 + 1; //D.顺序执行一条指令,其地址为m0+1,写进序列
// cout << setw(3) << i << ":" << setw(6) << ins[i] << endl;
int m2 = rand() % (tins - m1 - 2) + (m1 + 2);//E.后地址[m’+2,319]中随机选取一条指令并执行
ins[++i] = m2;//写进序列
// cout << setw(3) << i << ":" << setw(6) << ins[i] << endl;
}
//指令对应页面号
for (int i = 0; i < tins; i++)
{
page[i] = ins[i] / 10;
cout << page[i] << endl;
}
}
void FIFO()
{
double h1 = 0;//记录击中次数
double m1 = 0;//缺页次数
int flag = 0;//0 :hit;1:miss
int mflag = 0;//是否写入空闲块
int count = 0;
//每次使用新算法 都要将内存块置空
for (int m = 3; m < 32; m++)
{
men[m] = -1;//不能为0,如果为0,代表第0页已经被写入内存
}
//如果men[5]=1,说明,第6内存块放入了第一页
//大循环 执行320条指令
for(int i=0;i<tins;i++)
{
flag = 0;
//假设hit
for (int m = 3; m < 32; m++)
{
if (men[m] == page[i])
{
h1++;
//给一个标志,方便后续是否需要将该页写入内存
flag = 1;//在内存中
break;
}
}
if (flag == 0)//不在内存中
{
m1++;
//缺页中断
//扫描内存块,如果有空闲块,就写入该页
for (int m = 3; m < 32; m++)
{
if (men[m] == -1)//如果是空闲的,就把它写进去
{
men[m] = page[i];
//写完就可以退出扫描
mflag = 1;//虽然缺页,但是有空闲块,标志已写入内存
//怎么退呢?
break;
//感觉这里可以做一个输出,看看内存块存了哪页
}
}
//如果没有空闲块,采用先进先出置换法,置换某页
if(mflag==0)
{//第一次置换第4块,下一次置换要加1 ;直到置换到32块,再重新从第四块开始置换
men[3+count] = page[i];
count++;
if (count == 28)
{
count = 0;
}
}
}
}
//输出命中次数和缺页次数
cout << "命中次数:"<< h1 << endl;
cout << "缺页次数:"<<m1 << endl;
//计算缺页率和命中率
double ph1 = h1 / tins;
double pm1 = m1 / tins;
cout << "命中率:" << ph1 << endl;
cout << "缺页率:" << pm1 << endl;
}
void OPT()
{
double hit = 0;//记录击中次数
double miss = 0;//缺页次数
int flag = 0;//0 :hit;1:miss
int mflag = 0;//是否写入空闲块
//每次使用新算法 都要将内存块置空
for (int m = 3; m < 32; m++)
{
men[m] = -1;
}
for (int i = 0; i < tins; i++)
{
for (int m = 3; m < 32; m++)
{
if (men[m] == page[i])
{
hit++;
flag = 1;
break;
}
else { flag = 0; }
}
if (flag == 0)
{
miss++;
for (int m = 3; m < 32; m++)
{
if (men[m] == -1)
{
men[m] = page[i];
mflag = 1;//找到空闲块
break;
}
}
if (mflag == 0)//没有空闲块 采用最佳置换算法:置换未来一段时间用不到的内存块
{
int record[33] = { -1 };
bool re[320] = { false };
for (int m = 3; m < 32; m++)//从第四块开始扫描到32块
{
for (int str = i; str < tins; str++)//从当前执行的指令开始扫描
{//从当前指令开始扫描到最后一条指令
if (men[m] == page[str])//扫描到某页在内存块
{
if(re[m]==false)
{
record[m] = str - i;// 记录距离下次再用到这块的时间值
re[m] = true;//,扫到一个相同的就行
}
}
else {
record[m] = INT_MAX;
}
}
}
//扫描结束 每个块距离后面再用到的时间值已经计算结束
//从中找一个时间值最大的置换
int max = record[3];
int k=3;
for (int m = 3; m <32; m++)
{
if (record[m] > max)
{
max = record[m];
k = m;
}
}
men[k] = page[i];
//找到时间值最大的内存块,把这块换出去
}
}
}
//输出命中次数和缺页次数
cout << "命中次数:" << hit << endl;
cout << "缺页次数:" << miss << endl;
//计算缺页率和命中率
double ph = hit / tins;
double pm = miss / tins;
cout << "命中率:" << ph << endl;
cout << "缺页率:" << pm << endl;
}
检查代码,循环结构是否有问题
你换个数据再测试呢,可能正好巧合了