C语言完成页面淘汰过程(FIFO)
程序员文章站
2024-03-18 11:56:22
...
利用C语言编写程序,完成虚拟存储管理的页面淘汰过程。要求:从键盘上输入允许进程占有的页数及一个访问串,输出淘汰过程,并给出共发生的缺页次数。
例如:从键盘上输入允许进程占有的页数为:3
从键盘上输入一个访问串为:
7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0
模拟“先进先出(FIFO)” 算法,输出:
7 | 0 | 1 | 2 | 0 | 3 | 0 | 4 | 2 | 3 | 0 | 3 | 2 | 1 | 2 | 0 | 1 | 7 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
7 | 0 | 1 | 2 | 2 | 3 | 0 | 4 | 2 | 3 | 0 | 0 | 0 | 1 | 2 | 2 | 2 | 7 | 0 |
7 | 0 | 1 | 1 | 2 | 3 | 0 | 4 | 2 | 3 | 3 | 3 | 0 | 1 | 1 | 1 | 2 | 7 | |
7 | 0 | 0 | 1 | 2 | 3 | 0 | 4 | 2 | 2 | 2 | 3 | 0 | 0 | 0 | 1 | 2 | ||
7 | 0 | 1 | 2 | 3 | 0 | 4 | 2 | 3 | 0 | 1 |
#include <stdio.h>
int main()
{
int i,j,k,k2,t; //i,j,k做循环变量用,k2是目前在内存中的页面中到达顺序最先的那个页面的下标,t输入值的时候用
int n1; //内存允许进入最大页面数
int n2; //实际需要进入内存的页面个数(排队等着进入内存的页面数)
int pageseq[100]; //记录页面号或者叫做页号
int mempages[10][2]; //mempages[i][0]代表页面号,mempages[i][1]代表这个页面到达的序号
int n3; //实际进入内存的页面数
int n4; //记录淘汰的页面的数量
int replacedPage; //记录被淘汰的那个页面的页面号
printf("Input memory page number for each progress:");
scanf("%d",&n1); //输入内存允许进入最大页面数
if(n1<1) //得大于0!
{
printf("Memory page number error!\n");
return 1;
}
//开始:输入页面号就像 7 8 6 5 4 3 5 6 7 8 这种的过程
printf("Now,input page access sequence.\n");
printf("Input requested page number firstly:"); //输入要进入内存的总的页面个数
scanf("%d",&n2);
printf("%d pages are waiting for access.\n",n2); //所以就还有n2个页面等待进入
//循环输入每个页面的页面号
for(i=0;i<n2;i++)
{
printf("%d-th page is:",i+1); //第i+1个页面号是:(等待用户输入)这里i+1是因为可能是方便用户理解,因为数组下标为0的页面,实际上是第一个页面
scanf("%d",&t);
pageseq[i]=t; //就把每一个页面对应的页面号记录下来了
//比如说7 8 6 5 4 3 5 6 7 8 第一个页面的页面号就是7,第二个8,第三个6.......
}
n3=0; //实际在内存中的页面数量
n4=0; //淘汰的页面数量
//淘汰的过程
for(i=0;i<n2;i++) //每一页进入内存的调度
{
for(j=0;j<n3;j++) //这里的循环是:遍历现在已经在内存中的页面号,对照现在要进入的那个页面号,如果现在要进入的页面号
{ //存在于现在在内存中的页面号,跳出循环
if(mempages[j][0]==pageseq[i]) //如果memgages[j][0](内存中的页面号)==pageseq[i](现在要进入内存的页面号)
break; //跳出循环
}
if(j==n3 && n3<n1) //就比如一开始没有页面进入内存的情况n3=0,j=0,直接就跳出上面那个循环的情况,此时还没有任何页面进入内存,可以直接放入
{ //还有种情况是:n3<n1,虽然在目前的内存中没有找到相等的页面号,但是内存还存在空余,可以直接放入
mempages[n3][0]=pageseq[i]; //则把现在要进入内存的这页,放在这个空闲的地方
mempages[n3][1]=i+1; //并把这页设置成第i+1个到达,也是因为,比如第0个到达有点怪,所以变成第0+1=1个到达
n3++; //此时进入内存的页面数+1
n4++; //此时淘汰的页面数+1,因为哪怕是空页,被占用也是淘汰的一种
}
else if(j ==n3) //如果只是j等于n3,但是n3并不小于n1,那么n3肯定>=n1,说明虽然此时内存已经进满了页面,
{ //但是并没有找到和目前要进入的页面的页面号匹配的页面,此时肯定要发生淘汰
//已知memgages[k][1]这个数组中存放的是每个页面进入内存的顺序。又按照先进的先淘汰的特点,最先进入的先淘汰,即顺序小的先淘汰
//所以就相当于找 目前在 内存中的 并且进入顺序最小的那个
int minv; //设置一个最小值
minv=mempages[0][1]; //先暂且认定第一个值最小
k2=0; //记录进入顺序最小值的那个页面在数组中的下标号
for(k=1;k<n3;k++) //从内存的第二个元素(因为第一个元素目前被设定成最小值了)开始寻找最小值
{
if(minv>mempages[k][1]) //如果有元素比minv还小
{
k2=k; //取这个元素的下标
minv=mempages[k][1]; //记录下最小值
}
}
replacedPage=mempages[k2][0]; //此时被淘汰的页面的页面号被记录在replacedPage中
mempages[k2][0]=pageseq[i]; //并且把这一页替换成要进入内存的新页
mempages[k2][1]=i+1; /这一步虽然老师算法里面没给,但是有这一步才是正确的,因为要把新加入这页的到达序号也写进去,(不然出现的错就是,因为新加入的这页的序号没给,
就会赋垃圾值,在下次比较中,得到的结果就是错误的)
n4++; //被淘汰的页数加1
printf("page %d in,page %d out.%d-th missing page.\n",pageseq[i],replacedPage,n4); //打印新页进入,旧页淘汰以及淘汰页数
}
else //此时虽然可能j不等于n3,但是是因为在循环中已经找到了相应页号,所以才直接退出
{
printf("page %d is in memory.\n",pageseq[i]); //说明这页已经在内存了
}
}
printf("Totally %d missing pages!\n",n4); //最后输出一共淘汰的页数
return 0;
}
上一篇: 07:机器翻译
下一篇: LeetCode232. 用栈实现队列