📄 acm.cpp
字号:
#include <stdio.h>
void Fifo()
{
int p = 0; //物理块的数量
int physical[7] = {-1,-1,-1,-1,-1,-1,-1}; //存入物理块中的页号
int num = 0; //页面数
int page[20] = {0}; //要运行的进程的页号
int i,j,k; //循环变量
int countt = 0; //缺页次数
int a = 0; //最近访问标志
int c = 0; //缺页标志
printf ("您选择了先进先出(FIFO)算法!\n");
printf ("请输入物理块的数目:");
scanf ("%d",&p);
printf ("请输入页面数:");
scanf ("%d",&num);
printf ("请输入页号(以空格隔开):");
for (i = 0 ; i < num ; i++)
scanf("%d",&page[i]);
for (k = 0 ; k < num ; k++)
{///
for (i = 0 ; i < p ; i++)
{//
if (physical[i] == page[k])
{
break;
}
else if (physical[i] == -1) //物理块有空位
{
physical[i] = page[k];
countt ++;
c += 1;
break;
}
else if (physical[i] != -1 && i == p - 1) //物理块已满
{
for (j = 0 ; j < p ; j++)
{
if (page[k] != physical[j] && j == p - 1) //该页面不在当前物理块中
{
physical[a] = page[k];
a ++;
if (a == p) a = 0 ; //将最先进的置换后 初始化其标志
countt ++;
c += 1;
}
}
}
}//
printf ("置换过程第%d步:",k + 1);
for (i = 0 ; i < p ; i++)
{
if (physical[i] == -1)
printf (" ");
else
printf ("%d ",physical[i]);
}
if (c == 1)
{
printf ("发生缺页");
c = 0;
}
printf ("\n");
}///
printf ("缺页次数为:%d\n",countt);
printf ("缺页率为:%d%%\n\n",countt*100/num);
//printf("Fifo\n");
}
void Lru()
{
int p = 0; //物理块的数量
int physical[7] = {-1,-1,-1,-1,-1,-1,-1}; //存入物理块中的页号
int num = 0; //页面数
int page[20] = {0}; //要运行的进程的页号
int i,j,k,t; //循环变量
int countt = 0; //缺页次数
int c = 0; //缺页标志
int once[7] = {0}; //最近访问标志数组
printf ("您选择了最近最久未使用(LRU)算法!\n");
printf ("请输入物理块的数目:");
scanf ("%d",&p);
printf ("请输入页面数:");
scanf ("%d",&num);
printf ("请输入页号(以空格隔开):");
for (i = 0 ; i < num ; i++)
scanf("%d",&page[i]);
for (k = 0 ; k < num ; k++)
{
for (i = 0 ; i < p ; i++)
{
if (physical[i] == page[k])
{
for (j = 0 ; j <= p ; j++)
{
if (once[j] != 0 && j != i && once[j] < once[i]) //?????? //不缺页的 但相同页号 算进行了一次访问 其他未访问的+1
once[j] += 1;
}
once[i] = 1;
break;
}
else if (physical[i] == -1) //物理块有空位
{
physical[i] = page[k];
countt ++;
c += 1;
once[i] = 1;
for(j = 0 ; j < i ; j++)
{
if (once[j] != 0)
once[j] += 1;
}
break;
}
else if(physical[i] != -1 && i == p - 1) //物理块已满
{
for (j = 0 ; j < p ; j++)
{
if (once[j] == p)
{
physical[j] = page[k];
once[j] = 1; //置换掉
for (t = 0 ; t < p ; t++)
{
if(t != j)
once[t] += 1; //将其他未被访问的+1,达到三的就替掉
}
countt++;
c += 1;
break;
}
}
}
}
printf ("置换过程第%d步:",k+1);
for (i = 0 ; i < p ; i++)
{
if (physical[i] == -1)
printf (" ");
else
printf ("%d ",physical[i]);
}
if (c == 1)
{
printf ("发生缺页");
c = 0;
}
printf ("\n");
}
printf ("缺页次数为:%d\n",countt);
printf ("缺页率为:%d%%\n\n",countt*100/num);
}
void Optimal()
{
int p = 0; //物理块的数量
int physical[7] = {-1,-1,-1,-1,-1,-1,-1}; //存入物理块中的页号
int num = 0; //页面数
int page[20] = {0}; //要运行的进程的页号
int i,j,k,t; //循环变量
int countt = 0; //缺页次数
int a[7] = {0}; //各物理块中的页面下一次的访问时间
int b = 0; //排序算法的中间变量
int c = 0; //缺页标志
printf("您选择了最佳(OPTIMAL)置换算法!\n");
printf ("请输入物理块的数目:");
scanf ("%d",&p);
printf ("请输入页面数:");
scanf ("%d",&num);
printf ("请输入页号(以空格隔开):");
for (i = 0 ; i < num ; i++)
scanf("%d",&page[i]);
for (k = 0 ; k < num ; k++)
{
for (i = 0 ; i < p ; i++)
{
if (physical[i] == page[k])
{
break;
}
else if (physical[i] == -1) //物理块有空位
{
physical[i] = page[k];
countt ++;
c += 1;
break;
}
else if(physical[i] != -1 && i == p - 1) //物理块已满
{
//获得各物理快中内容下一次的访问时间
for (j = 0 ; j < p ; j++)
{
for (t = k ; t < num ; t++)
{
if(physical[j] == page[t])
{
a[j] = t - k; //时间间隔
break;
}
else if(physical[j] != page[t] && t == num - 1)
a[j] = num; //如果以后此页面永远用不到,则设定为最大值
}
}
//比较各时间的大小
for (j = 1 ; j < p ; j++)
{
if (a[j] > a[b])
{
b = j;
}
}
physical[b] = page[k];
b = 0;
countt++;
c += 1;
}
}
printf ("置换过程第%d步:",k+1);
for (i = 0 ; i < p ; i++)
{
if (physical[i] == -1)
printf (" ");
else
printf ("%d ",physical[i]);
}
if (c == 1)
{
printf ("发生缺页");
c = 0;
}
printf ("\n");
}
printf ("缺页次数为:%d\n",countt);
printf ("缺页率为:%d%%\n\n",countt*100/num);
//printf("Optimal\n");
}
int main()
{
int n;
do
{
printf ("请选择要使用的置换算法:\n1.FIFO算法\n2.LRU算法\n3.OPTIMAL算法\n0.退出系统\n");
scanf ("%d",&n);
switch(n)
{
case 1:
Fifo();
break;
case 2:
Lru();
break;
case 3:
Optimal();
break;
case 0:
return 0;
default:
printf ("输入有误,请重试!\n");
}
}
while(n != 0);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -