前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >操作系统页面置换模拟算法实现(C语言版)

操作系统页面置换模拟算法实现(C语言版)

作者头像
荣仔_最靓的仔
发布2021-02-02 17:50:08
2.4K0
发布2021-02-02 17:50:08
举报

目录

一、实验内容

二、LRU算法

三、代码实现

四、运行结果


一、实验内容

熟悉页面置换的算法,编写LRU置换算法

  • 假定一个能够存放M个页面的内存,当发生缺页时,调入一个页面,通过LRU算法求出应该置换出的页面号。输入一连串的页面号,程序自动选择调出的页面并计算缺页率。
  • LRU算法的实现要归功于一个寄存器。

二、LRU算法

思想:利用局部性原理,根据一个进程在执行过程中过去的页面访问踪迹来推测未来的行为。认为过去一段时间里不曾被访问过的页面,在最近的将来可能也不会再被访问。即利用“最近的过去”预测“最近的将来”。

选择最近一段时间内最久不用的页面予以淘汰。性能接近最佳算法。

三、代码实现

代码语言:javascript
复制
#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;

	printf("━━━━━━━━━━━━━━━━━━━━━━━━━\n");
	printf("|               实验四:LRU页面置换算法          |\n");
	printf("|                                                |\n");
    printf("|                 学号:***********              |\n");
	printf("|                 姓名:******                   |\n");
	printf("━━━━━━━━━━━━━━━━━━━━━━━━━\n");
	
	while(1) 
	{
		printf("请输入分配的物理块的个数(M<=10):\n");
		scanf("%d",&block_num);
		if(block_num>10)
			printf("输入不合法,请重新输入"); 
		printf("\n");
		break;
	}
		
	while(1)
	{
		printf("请输入要访问的页面序列个数(P<=100):\n");
		scanf("%d",&page_num);			
		if(page_num>100)
			printf("输入不合法,请重新输入");
		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("采用LRU页面置换算法结果如下: \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");
}

四、运行结果

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-06-18 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、实验内容
  • 二、LRU算法
  • 三、代码实现
  • 四、运行结果
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档