用最近最少用(LRU)页面调度算法处理缺页中断。
程序员文章站
2022-05-12 14:06:23
...
用最近最少用(LRU)页面调度算法处理缺页中断。
(1) 在分页式虚拟存储系统中,当硬件发出“缺页中断”后,引出操作系统来处理这个中断事件。如果主存中已经没有空闲块,则可用LRU页面调度算法把该作业中最先进入主存的一页调出,存放到磁盘上,然后再把当前要访问的页装入该块。调出和装入后都要修改页表中对应页的标志。
(2) LRU页面调度算法总是淘汰该作业中距现在最久没有访问过的那一页,因此可以用一个数组来表示该作业已在主存的页面。数组中的第一个元素总是指出当前刚访问的页号,因此最久没被访问的页总是由最后一个元素指出。如果主存中只有四块空闲块且执行第一题提示(4)假设的指令序列,采用LRU页面调度算法,那么在主存中的页面变化情况如下:
3 0 6 4 5 1 2 4 6
2 3 0 6 4 5 1 3 4
1 2 3 0 6 4 5 1 2
0 1 2 3 0 6 4 5 1
(3) 编制一个LRU页面调度程序,为了提高系统效率,如果应淘汰的页在执行中没有修改过,则可不必把该页调出伟哥。参看第二题中提示(3)。模拟调度算法不实际启动输出一页和装入一页的程序,而用输出调出的页号和装入的页号来代替。把第一题中的程序稍作改动,与本题集合起来,LRU页面调度模拟算法如图6-3。
(4) 按第一题中提示(4)的要求,建立一张初始页表,表中为每一页增加“修改标志”位(参考第二题中提示(4))。然后按依次执行的指令序列,运行你所设计的程序,显示或打印每次调出和装入的页号,以及执行了最后一条指令后的数组中的值。
(5) 为了检查程序的正确性,可再任意确定一组指令序列,运行设计的程序,核对执行的结果。
C语言源码
#include "stdio.h"
#define n 15
#define m 4
void main()
{
int a[n],i,j,q,b[m]={0},c[m][n],count=0;
char flag,f[n];
printf("请输入页面访问序列(输入十五个数后回车):\n");
for(i=0;i<n;i++)
scanf("%d",&a[i]);
printf("\n");
for(i=0;i<n;i++) //查页表,看是否缺页
{
q=0;
while((a[i]!=b[q])&&(q!=m)) q++;
if(q==m)
{
flag='*';
count++;
}//缺页,则置标志flag为'*'
else flag=' ';
for(j=q;j>0;j--)
b[j]=b[j-1];
b[0]=a[i];
for(j=0;j<m;j++)
c[j][i]=b[j];
f[i]=flag;
if(c[j][3]==0)
{
printf(" ");
}
else
{
printf("被淘汰的页面是:%3d\n",c[j][3]);
}
}
printf("输出结果为下表(0代表为空,*代表有缺页):\n");
printf("*********************************************************\n");
printf("页面走向:");
for(i=0;i<n;i++)
printf("%3d",a[i]);
printf("\n");
printf("*********************************************************\n");
for(i=0;i<m;i++)
{
printf(" %d号块:",i);
for(j=0;j<n;j++)
printf("%3d",c[i][j]);
printf("\n");
}
printf("*********************************************************\n");
printf("缺页情况:");
for(i=0;i<n;i++)
printf("%3c",f[i]);
printf("\n");
printf("*********************************************************\n");
printf("\n发生缺页的次数=%d\n",count);
printf("缺页中断率=%.2f%%%\n",(float)count/n*100);
}
运行结果
输入15个数后回车,每个数之间用空格隔开
下一篇: 大肠杆菌超标常见 注意预防