#include <map>
#include <set>
#include <list>
#include <deque>
#include <stack>
#include <string>
#include <cstdio>
#include <math.h>
#include <iomanip>
#include <cstdlib>
#include <limits.h>
#include <string.h>
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
int address[322];//指令地址
int num[322];//访问串
int cnt;//合并后的访问串个数
//随机生成指令地址
void GenerateAddress(int page)
{
srand(unsigned(0));
int cur,tmp[322];
for(int i=0;i<320;i++)
{
if(i%3==0)
{
cur = rand() % 320;
cur = (cur+1) % 320;
address[i] = cur;//顺序执行一条指令,即执行地址为m+1的指令
} else
if(i%3==1)
{
cur = rand() % (cur+2);//在前地址[0,m+1]中随机选取一条指令并执行,该指令的地址为m'
cur = (cur+1) % 320;
address[i] = cur;//顺序执行一条指令,其地址为m'+1
} else
if(i%3==2)
{
cur = rand() % 320 + (cur + 2);
cur = cur%320;
address[i] = cur;
}
tmp[i] = address[i] / page;
}
num[cnt++] = tmp[0];
for(cnt = 0,i=1;i<320;i++)//相邻相同的合并
{
if(tmp[i]==tmp[i-1])continue;
num[cnt++] = tmp[i];
}
}
struct node{
int id;
int rec;
};
node block[322];
//FIFO算法:在所给的内存块中查找最早进入的页面号
double FIFO(int memory){
int sum = 0;
int k = 0;
for(int i=0;i<cnt;i++) {
bool find = false;
int minm = (1<<30);
int tag;
for(int j=0;j<k;j++){
if(block[j].id == num[i]){
find = true;
break;
}
if(block[j].rec < minm){
minm = block[j].rec;
tag = j;
}
}
if(!find){
if(k<memory){
block[k].id = num[i];
block[k++].rec = i;//每当更新就记录当前i下标值,查找的时候找出最小值就是最早的页面号
} else {
block[tag].id = num[i];
block[tag].rec = i;
}
sum++;//统计缺页数
}
}
return (sum*1.0)/(cnt*1.0);
}
//LRU算法:在所给的内存中查找最久没有使用过的页面号
double LRU(int memory){
int sum = 0;
int k = 0;
for(int i=0;i<cnt;i++){
bool find = false;
int maxm = -1;
int tag;
for(int j=0;j<k;j++){
if(block[j].id==num[i]){
find = true;
block[j].rec = 0;
break;
}
if(block[j].rec>maxm){
maxm = block[j].rec;
tag = j;
}
}
if(!find){
if(k<memory){
block[k].id = num[i];
block[k++].rec = 0;
} else {
block[tag].id = num[i];
block[tag].rec = 0;
}
sum++;//统计缺页数
}
for(j=0;j<k;j++){
block[j].rec++;
}
}
return (sum*1.0)/(cnt*1.0);
}
//OPT算法:在未来一段时间中查找最久不使用的页面号
double OPT(int memory){
int next[322];
int i,j,k = 0;
for(i=0;i<cnt;i++){//预处理,处理每个访问串的未来不使用的时长
for(j=0;j<cnt;j++){
if(num[i]==num[j])break;
}
if(j==cnt){
next[i] = (1<<30);//置为无穷大表示以后不再使用
} else next[i] = j-i;
}
int sum = 0;
for(i=0;i<cnt;i++){
bool find = false;
int maxm = -1;
int tag;
for(j=0;j<k;j++){
if(block[j].id==num[i]){
find = true;
break;
}
if(block[j].rec>maxm){
maxm = block[j].rec;
tag = j;
}
}
if(!find){
if(k<memory){
block[k].id = num[i];
block[k++].rec = next[i];
} else {
block[tag].id = num[i];
block[tag].rec = next[i];
}
sum++;//统计缺页数
}
}
return (sum*1.0)/(cnt*1.0);
}
int main()
{
cout<<"************************欢迎来到操作系统页面置换模拟系统************************"<<endl;
while(1){
int page, memory;
cout<<"请输入页面大小(以数字表示,退出请按0):1K,2K,4K,8K,16K"<<endl;
cin>>page;
if(page==0)break;
cout<<"请输入分配给程序的内存块数:"<<endl;
cin>>memory;
int res = 10*page;
page = 320/(10*page);//页数
if(page <= memory){
cout<<"缺页率:";
cout<<"0.00%"<<endl;
} else {
GenerateAddress(res);
cout<<"320个随机访问串:";
for(int i=0;i<cnt;i++){//输出320个随机访问串
cout<<"["<<num[i]<<"]"<<" ";
}cout<<endl<<endl;
cout<<"请选择算法(数字表示,以0 结束):1、FIFO;2、LRU;3、OPT"<<endl;
int choice;
while(cin>>choice && choice){
switch (choice){
case 1:printf("FIFO算法的缺页率:%.2lf%%\n\n",FIFO(memory)*100.0);
break;
case 2:printf("LRU算法的缺页率:%.2lf%%\n\n",LRU(memory)*100.0);
break;
case 3:printf("OPT算法的缺页率:%.2lf%%\n\n",OPT(memory)*100.0);
break;
case 0:break;
}
}
}
}
return 0;
}
操作系统页面置换模拟系统
最新推荐文章于 2022-05-14 23:44:12 发布