计算机操作系统三种页面置换算法的实现
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
int page_trend[505];//页面走向
int page_sum=0;//页面个数
int physical_block;//物理块个数
int blockstate[505];//每个物理块状态
int ready_sum=0;//已经装入页面的个数
int num_break=0;//中断次数
int num_exchange=0;//置换次数
double break_rate=0;//缺页中断率
double exchange_rate=0;//页面置换率
void Optimal()
{
printf("\n页面置换情况为:\n/*\n");
for(int i=0; i<page_sum; i++)
{
int flag=0;
for(int j=0; j<physical_block; j++)
{
if(page_trend[i]==blockstate[j])
{
printf("命中!(%d)\n",page_trend[i]);
flag=1;
break;
}
}
if(flag==1) continue;
if(flag==0)
{
num_break++;
printf("发生缺页中断!");
if(ready_sum==physical_block)
{
int num,maxposition=-1;
for(int j=0; j<physical_block; j++)
{
int flagg=0;
for(int k=i+1; k<page_sum; k++)
{
if(blockstate[j]==page_trend[k])
{
flagg=1;
if(k>maxposition)
{
maxposition=k;
num=j;
}
break;
}
}
if(flagg==0) num=j,maxposition=9999;
}
num_exchange++;
printf("发生页面置换!将%d调出内存,将%d调入内存。 %d--->%d\n", blockstate[num],page_trend[i],page_trend[i],blockstate[num]);
blockstate[num]=page_trend[i];
}
else if(ready_sum<physical_block)
{
printf("页面调入!将%d页面调入内存。\n",page_trend[i]);
blockstate[ready_sum]=page_trend[i];
ready_sum++;
}
}
}
printf("*/\n");
break_rate=(double)num_break/(double)page_sum;
exchange_rate=(double)num_exchange/(double)page_sum;
printf("缺页中断次数为%d 缺页率为%lf\n页面置换次数为%d 页面置换率为%lf\n换页号在程序中给出。\n",num_break,break_rate,num_exchange,exchange_rate);
}
void FIFO()
{
printf("\n页面置换情况为:\n/*\n");
int num=0;
for(int i=0; i<page_sum; i++)
{
int flag=0;
for(int j=0; j<physical_block; j++)
{
if(page_trend[i]==blockstate[j])
{
printf("命中!(%d)\n",page_trend[i]);
flag=1;
break;
}
}
if(flag==1) continue;
if(flag==0)
{
num_break++;
printf("发生缺页中断!");
if(ready_sum==physical_block)
{
num_exchange++;
printf("发生页面置换!将%d调出内存,将%d调入内存。 %d--->%d\n", blockstate[num],page_trend[i],page_trend[i],blockstate[num]);
blockstate[num]=page_trend[i];
num=(num+1)%physical_block;
}
else if(ready_sum<physical_block)
{
printf("页面调入!将%d页面调入内存。\n",page_trend[i]);
blockstate[ready_sum]=page_trend[i];
ready_sum++;
}
}
}
printf("*/\n");
break_rate=(double)num_break/(double)page_sum;
exchange_rate=(double)num_exchange/(double)page_sum;
printf("缺页中断次数为%d 缺页率为%lf\n页面置换次数为%d 页面置换率为%lf\n换页号在程序中给出。\n",num_break,break_rate,num_exchange,exchange_rate);
}
void LRU()
{
printf("\n页面置换情况为:\n/*\n");
for(int i=0; i<page_sum; i++)
{
int flag=0;
for(int j=0; j<physical_block; j++)
{
if(page_trend[i]==blockstate[j])
{
printf("命中!(%d)\n",page_trend[i]);
flag=1;
break;
}
}
if(flag==1) continue;
if(flag==0)
{
num_break++;
printf("发生缺页中断!");
if(ready_sum==physical_block)
{
int num,minposition=999;
for(int j=0; j<physical_block; j++)
{
int flagg=0;
for(int k=i-1; k>=0; k--)
{
if(blockstate[j]==page_trend[k])
{
flagg=1;
if(k<minposition)
{
minposition=k;
num=j;
}
break;
}
}
if(flagg==0) num=j,minposition=-1;
}
num_exchange++;
printf("发生页面置换!将%d调出内存,将%d调入内存。 %d--->%d\n", blockstate[num],page_trend[i],page_trend[i],blockstate[num]);
blockstate[num]=page_trend[i];
}
else if(ready_sum<physical_block)
{
printf("页面调入!将%d页面调入内存。\n",page_trend[i]);
blockstate[ready_sum]=page_trend[i];
ready_sum++;
}
}
}
printf("*/\n");
break_rate=(double)num_break/(double)page_sum;
exchange_rate=(double)num_exchange/(double)page_sum;
printf("缺页中断次数为%d 缺页率为%lf\n页面置换次数为%d 页面置换率为%lf\n换页号在程序中给出。\n",num_break,break_rate,num_exchange,exchange_rate);
}
int main()
{
memset(page_trend,-1,sizeof(page_trend));
memset(blockstate,-1,sizeof(blockstate));
int a;
printf("请选择输入方式:\n输入页面走向和物理块大小(0)\n输入代码逻辑地址、页面和物理块大小(1)\n");
scanf("%d",&a);
if(a==0)
{
printf("输入页面走向(ctrl+z结束输入):\n");
while(~scanf("%d",&page_trend[page_sum]))
{
page_sum++;
}
printf("输入物理块个数:\n");
scanf("%d",&physical_block);
printf("物理块中是否已装入某些页面? 是(1) 否(0)\n");
scanf("%d",&a);
if(a==1)
{
printf("输入已经装入的页面,不得超过%d个页面(ctrl+z结束输入):\n",physical_block);
while(~scanf("%d",&blockstate[ready_sum]))
{
ready_sum++;
}
}
printf("选择页面置换算法: 最佳置换算法 (0) 先进先出算法(1) 最近最久未使用算法(2)\n");
scanf("%d",&a);
if(a==0) Optimal();
else if(a==1) FIFO();
else if(a==2) LRU();
}
else if(a==1)
{
int page_size,position,block_size;
printf("输入页面大小:\n");
scanf("%d",&page_size);
printf("输入物理块大小:\n");
scanf("%d",&block_size);
physical_block=block_size/page_size;
printf("输入代码的逻辑地址序列:\n");
while(~scanf("%d",&position))
{
page_trend[page_sum]=position/page_size;
page_sum++;
}
printf("物理块中是否已装入某些页面? 是(1) 否(0)\n");
scanf("%d",&a);
if(a==1)
{
int k;
printf("输入已经装入的程序的逻辑地址,不得超过%d个(ctrl+z结束输入)\n",physical_block);
while(~scanf("%d",&k))
{
blockstate[ready_sum]=k/page_size;
ready_sum++;
}
}
printf("选择页面置换算法:最佳置换算法 (0) 先进先出算法(1) 最近最久未使用算法(2)\n");
scanf("%d",&a);
if(a==0) Optimal();
else if(a==1) FIFO();
else if(a==2) LRU();
}
return 0;
}