欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

用最近最少用(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个数后回车,每个数之间用空格隔开
用最近最少用(LRU)页面调度算法处理缺页中断。

相关标签: 操作系统