CPP/计算机组成原理实验代码/OPT2.cpp
2023-05-12 00:34:15 +08:00

125 lines
2.6 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include<stdio.h>
int block_num; //分配的物理块数
int page_num; //要访问的页面序列个数
int page[100]; //要访问的页面序列
int memory[10]; //物理块中的页号
int table[100][10]; //显示矩阵
int reg[10]; //寄存器--记录页面的访问时间
char Que[100]; //数组,记录是否缺页
int main()
{
int count=0; //记录缺页次数
int i,j,k;
while(1)
{
printf("请输入分配的物理块的个数(M<=10):\n");
scanf("%d",&block_num);
printf("\n");
break;
}
while(1)
{
printf("请输入要访问的页面序列个数(P<=100):\n");
scanf("%d",&page_num);
printf("\n");
break;
}
printf("请依次输入页面序列:\n");
for(i=0;i<page_num;i++)
{
scanf("%d",&page[i]);
Que[i] = 'N';
}
for(i=0;i<block_num;i++)
memory[i]=-1; //初始内存块中默认为空,用-1表示
//访问页面
for(i=0;i<page_num;i++)
{
if(i==0) //访问的第一个页面
{
memory[i]=page[i];
reg[i]=i;
for(j=0;j<block_num;j++)
table[i][j]=memory[j];
Que[i]='Y';
count++;
}
else
{ /*判断新页面号是否在物理块中*/
for(j=0,k=0;j<block_num;j++)
{
if(memory[j]!=page[i])
k++;
else
{ /*新页面在内存块中*/
reg[j]=i; //刷新该页面的访问时间
for(int n=0;n<block_num;n++)
table[i][n]=memory[n];
}
}
}
if(k==block_num) /*新页面不在物理块中,缺页*/
{
int q=0;
Que[i]='Y';
count++;
for(int j=0;j<block_num;j++)
{
if(memory[j]==-1) /*内存块未满*/
{
memory[j]=page[i];
reg[j]=i;
for(int n=0;n<block_num;n++)
table[i][n]=memory[n];
break;
}
else
q++;
}
if(q==block_num)/*内存块已满需采用LRU置换算法选择换出页*/
{
int min=0; //记录换出页
for(int m=1;m<block_num;m++)
if(reg[m]<reg[min])
min=m;
memory[min]=page[i];
reg[min]=i; /*记录该页的访问时间新到的页面进入之前min的位置需将min位置的访问时间更改*/
for(int n=0;n<block_num;n++)
table[i][n]=memory[n];
}
}
}
//输出运行过程及结果
printf("采用OPT页面置换算法结果如下: \n");
printf("\n");
printf("\n");
printf("页号:");
for(i=0;i<page_num;i++)
printf("%3d",page[i]);
printf("\n");
printf("-------------------------\n");
for(i=0;i<block_num;i++)
{
printf("%2d:",i);
for(j=0;j<page_num;j++)
printf("%3d",table[j][i]);
printf("\n");
}
printf("-------------------------\n");
printf("缺页:");
for(i=0;i<page_num;i++)
printf("%3c",Que[i]);
printf("\n");
printf("-------------------------\n");
printf("\t缺页次数:%d\n",count);
printf("\t缺页率:%d/%d\n",count,page_num);
printf("-------------------------\n");
}