- 通过随机函数生成一个程序的指令序列,共包含320条指令;每条指令包含一个将要访问的随机虚拟内存地址。
- 将指令序列转换为页面访问序列,设:1)页面大小为1KB;2)用户物理内存容量为4~32页;3)用户虚拟存储容量为32KB。
- 在用户虚拟存储区中,按照每页存放10条指令排列虚拟内存地址。
- 计算并输出两种页面置换算法在不同内存容量下的访问命中率。访问命中率的计算公式为:访问命中率=1 - (页面失效次数/页面总数)。
#include <bits/stdc++.h>
using namespace std;
vector<int> createRand(int n)
{
vector<int> zhiLing;
for(int i=0;i<n;i++)
{
zhiLing.push_back(rand()%(32*10));
}
return zhiLing;
}
vector<int> memoryToPage(vector<int>& Memory)
{
vector<int> virtualPage;
for(int &x:Memory)
{
virtualPage.push_back(x/10);
}
return virtualPage;
}
int LRU(vector<int> virtualPage,int realSize)
{
int mingZhong=0;
vector<pair<int,int>> realMemory(realSize,{-1,-1});
for(int i=0;i<virtualPage.size();i++)
{
int flag=1;
for(int j=0;j<realSize;j++)
{
if(realMemory[j].first==virtualPage[i])//命中
{
realMemory[j].second=i;
mingZhong++;
flag=0;
break;
}
}
if(flag)//页面失效
{
int mn=i,mnb=-1;
for(int j=0;j<realSize;j++)
{
if(realMemory[j].second<mn)
{
mn=realMemory[j].second;
mnb=j;
}
}
realMemory[mnb]={virtualPage[i],i};
}
}
return mingZhong;
}
int OPT(vector<int> virtualPage,int realSize)
{
int mingZhong=0;
vector<pair<int,int>> realMemory(realSize,{-1,1e5});
for(int i=0;i<virtualPage.size();i++)
{
int flag=1;
for(int j=0;j<realSize;j++)
{
if(realMemory[j].first==virtualPage[i]) //命中
{
mingZhong++;
flag=0;
break;
}
realMemory[j].second=1e5;
}
if(flag)//页面失效
{
for(int j=0;j<realSize;j++) //更新之后第一次使用时间
{
for(int w=i+1;w<virtualPage.size();w++)
{
if(virtualPage[w]==realMemory[j].first)
{
realMemory[j].second=min(realMemory[j].second,w);
}
}
}
int mx=0,mxb=-1;
for(int j=0;j<realSize;j++)
{
if(realMemory[j].second>mx)
{
mx=realMemory[j].second;
mxb=j;
}
}
realMemory[mxb].first=virtualPage[i];
}
}
return mingZhong;
}
int main() {
srand(time(nullptr));
vector<int> zhiLing= createRand(320);
vector<int> virtualPage= memoryToPage(zhiLing);
printf(" 物理内存容量页数\tLRU访问命中率\tOPT访问命中率\n");
for(int i=4;i<=32;i++)
{
int LRUmingZhong=LRU(virtualPage,i);
int OPTmingZhong= OPT(virtualPage,i);
printf("\t%d\t\t %.2f%%\t %.2f%%\n",i,LRUmingZhong/320.0*100,OPTmingZhong/320.0*100);
}
return 0;
}