⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 neicun.cpp

📁 页面淘汰算法采用LRU页面淘汰算法
💻 CPP
字号:
// neicun.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"


#include<stdio.h> 
  #include<conio.h> 
#define M 3 
 
#define Myprintf printf("|---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---|\n")	/*表格控制*/ 
typedef struct page 
{	int num;	/*记录页面号*/ 
	int time;	/*记录调入内存时间*/ 
}Page;			/* 页面逻辑结构,结构为方便算法实现设计*/ 
Page b[M];		/*内存单元数*/ 
int zhiling[100];         //指令流
int N;         //所调度的页面总数

int c[M][100];	/*暂保存内存当前的状态:缓冲区*/
 	
int I;         //一个进程的最大页面数

int queue[100];	/*记录调入队列*/ 
int K;		/*调入队列计数变量*/ 

void Yebiao()//输出页表结构
{
  float byte,byte1;
  int i;
  printf("请输入进程大小:");
	  scanf("%f",&byte);
  getchar();

  I=int(byte/1000);
  byte1=float(I*1000);
  if(byte>byte1)
	  I++;
  printf("此进程共%d个页面,初始状态为:\n",I);
  for(i=0;i<I;i++)
	  printf("%d\tFalse\n",i);
  

}
bool zhilingliu()   //确定页表调用流
{
  float dizhi;
  char c;
  printf("请输入指令地址流:(以回车分开,以#号结束)\n");
	  for(N=0;N<100;N++)
	  { scanf("%f",&dizhi);
	                                                               //printf("%f\n",dizhi);
	                                                               // printf("%c",c);
	    c=getchar();
                                                                //printf("%c",c);
		                                                        //printf("%f\n",dizhi);
		zhiling[N]=int(dizhi/1000);
		if(zhiling[N]>=I)
		{
		  printf("页失效!产生中断!\n");
			  return false;
		}
		if(c=='#')
			return true;
        
}
}
void Init(Page *b,int c[][100]) /*初始化内存单元、缓冲区*/ 
{    
	int i,j; 
	for(i=0;i<M;i++) 
	{ 
		b[i].num=-1; 
		b[i].time=N-i-1; 
	} 
	for(i=0;i<M;i++) 
		for(j=0;j<100;j++) 
			c[i][j]=-1; 
} 
/*取得在内存中停留最久的页面,默认状态下为最早调入的页面*/ 
int GetMax(Page *b) 
{	int i; 
	int max=-1; 
	int tag=0; 
	for(i=0;i<M;i++) 
	{		if(b[i].time>max) 

		{			max=b[i].time; 
			tag=i; 
		} 
	} 
	return tag; 
} 
/*判断页面是否已在内存中*/ 
int	Equation(int fold,Page *b) 
{	int i; 
	for(i=0;i<M;i++) 
	{		if (fold==b[i].num) 
			return i; } 
	return -1; } 
/*LRU核心部分*/ 
void Lru(int fold,Page *b) 
{	int i; 
	int val; 
	val=Equation(fold,b); 
	if (val>=0) 
	{ 
		b[val].time=0; 
		for(i=0;i<M;i++) 
			if (i!=val) 
				b[i].time++;	} 
	else 
	{		queue[++K]=fold;/*记录调入页面*/ 
		val=GetMax(b); 
		b[val].num=fold; 
		b[val].time=0; 
		for(i=0;i<M;i++) 
			if (i!=val) 
				b[i].time++; 
	} 
} 
/*主程序*/ 


int main(int argc, char* argv[])
{


	int i,j; 
	
	
	
start: 
	K=-1; 
	Yebiao();
	if(zhilingliu()==false)
		return 0;
	Init(b, c); 
	for(i=0;i<N;i++) 
	{ 
		Lru(zhiling[i],b); 
		// c[0][i]=zhiling[i]; 
		/*记录当前的内存单元中的页面*/ 
		for(j=0;j<M;j++) 
			c[j][i]=b[j].num; 
	} 
/*结果输出*/ 
	printf("运行过程中内存状态为:\n"); 
	Myprintf; 
	for(j=0;j<N;j++) 
		printf("|%2d ",zhiling[j]); 
	printf("|\n"); 
	Myprintf; 
	for(i=0;i<M;i++) 
	{	
		for(j=0;j<N;j++) 
		{ 
		if(c[i][j]==-1) 
			printf("|%2c ",32); 
		else 
			printf("|%2d ",c[i][j]); 
		} 
		printf("|\n"); 
	} 
	Myprintf; 
	printf("\n调入队列为:"); 
	for(i=0;i<K+1;i++) 
		printf("%3d",queue[i]); 
	printf("\n缺页次数为:%6d\n缺页率:%16.6f",K+1,(float)(K+1)/N); 
	printf("\nAre you continuing!\ty?"); 
	if(getche()=='y') 
	{
		printf("\n"); 
		goto start; }
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -