#include<iostream>
#include<vector>
#include<list>
#include<deque>
#include<set>
#include<map>
#include<algorithm>
#include<ctime>
using std::cin;
using std::cout;
using std::endl;
using std::vector;
using std::list;
using std::deque;
using std::set;
using std::map;
using std::pair;
class Page
{
public:
bool visited;//访问位,false表示没有被访问过,true表示被访问过
bool changed;//修改位,false表示没有被修改过,true表示被修改过
bool valid;//表示该页面是否在内存,true表示在,false表示不在
Page()
{
visited = changed = valid = false;
}
};
#include"stdfax.h"
vector<int>order;
void create_order()
{
srand((unsigned)time(NULL));
while (order.size() <= 320)
{
auto m = rand() % 320;
//A:在[0,319]的指令地址之间随机选取一起点m;B:顺序执行一条指令,即执行地址为m+1的指令
order.push_back((m + 1)%320);
auto n = rand() % (m + 2);
//C:在前地址[0,m+1]中随机选取一条指令并执行,该指令的地址为m’
order.push_back(n);
//D:顺序执行一条指令,其地址为m’ + 1
order.push_back((n + 1) % 320);
//E:在后地址[m’+2,319]中随机选取一条指令并执行
order.push_back(n + 2 + rand()%(318-n));
}
order.resize(320);
}
void RAN();
void FIFO();
void LRU();
void OPT();
int page;//用户进程所能分配最多页面数
int main()
{
printf("Page\tRAN\tFIFO\tLRU\tOPT\n");
create_order();
for (page = 4;page<=32;page++)
{
printf("%2d\t", page);
RAN();
FIFO();
LRU();
OPT();
}
getchar();
return 0;
}
#include"stdfax.h"
extern void RAN();
extern vector<int>order;
extern int page;
void RAN()
{
vector<Page>page_table(32);//页表
vector<int>memory;//在内存中的页数
int count = 0;//指令所在页面在内存中的次数
for (int i = 0; i < 320; i++)//每次调入一条指令
{
//查看当前指令所在的页面是否在内存中
if (page_table[order[i]/10].valid)//如果指令所在页面在内存中
{
count++;
}
else
{
if (memory.size() < page)//如果用户进程页面还有剩余
{
count++;
memory.push_back(order[i] / 10);//把页面信息塞入内存
page_table[order[i] / 10].valid = true;//记录页面为已访问
}
else
{
//随机选择在内存中的一个页面
srand((unsigned)time(NULL));
auto tmp = rand() % page;//选择内存中被替换的页面
page_table[memory[tmp]].valid = false;//该页面标记为不在内存中
page_table[order[i] / 10].valid = true;//新加入的页面标记为已访问
memory[tmp] = order[i] / 10;//内存中的页面进行更新
}
}
}
printf("%.4lf\t",(double)count/320.0);
}