存储器管理:页面置换算法模拟

1.代码:
(1)memswap.h 页面置换算法头文件

#ifndef _MEMSWAP_H
#define _MEMSWAP_H
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <curses.h>   
#define _CRT_SECURE_NO_WARNINGS
#define P 3 
#define RS_MAX_SIZE 50 
int rs[RS_MAX_SIZE];
int rs_size; 
int pf[P]; 
int call_loc[P]; 
int swap_loc; 
//页面置换
void Swap(int which);
//最佳置换算法,返回最佳置换淘汰物理页块号
int OPT(int begin);
//创建页面号引用串
void CreateRS();
//显示进程装在物理页框中的页面号
void printPF(int n);
int Contains(int rs_p); 
//标记清理
void cleanFlag();
#endif

(2)新建两个文件,一个用于存放头文件,一个用来写入主程序
(3)swapMain.c – 页面置换算法主程序

#include "memswap.h" 
 
int Page[pf]={
    
    0}; 
typedef struct{
    
    
	int block;
	int time;
}BLock;
typedef struct LNode{
    
    
	BLock B[3];
}Mem;
Mem M;
void CreatePage(){
    
    
	//初始化页面
	printf("页面走向:\n");
	for(int i=0;i<pf;i++){
    
    
		Page[i]=rand()%9+1;
		printf("%d ",Page[i]);
	} 
	printf("\n");
}
int max(int a,int b,int c){
    
    
	int x,z;
	if(a>=b)
	   x=a;
	else x=b;
	if(x>=c)
	  z=x;
	else
	  z=c;
	return z;
}
void InitM()
{
    
    
	for(int q=0;q<pf;q++){
    
    
		M.B[q].block=0;
	}
	for(int q=0;q<pf;q++){
    
    
		M.B[q].time=0;
	}
}
void LRU()   //最近最久未使用算法
{
    
    
	printf("具体实现过程:\n");
	InitM();
	int i=0,j=0;
	int a=-1,b=-1;
	int Max=-1;
	int MaxU=0;
	int count=0;
	for(i=0;i<pf;i++){
    
    
		for(j=0;j<RS_MAX_SIZE;j++)
	      if(M.B[j].block==0){
    
    
	    	 a=j;  
	    	 break; 
	    }
	    for(j=0;j<RS_MAX_SIZE;j++){
    
    
	    	if(M.B[j].block==Page[i])
	    	    b=j;  
	    }
	    for(j=0;j<RS_MAX_SIZE;j++){
    
    
	    	if(M.B[j].time>MaxU){
    
    
	    		MaxU=M.B[j].time;
	    		Max=j;
	    	} 
		}
	    if(b==-1){
    
     
	    	if(a!=-1){
    
     
	    		M.B[a].block=Page[i];
				M.B[a].time=0;
				for(j=0;j<=a;j++)
				  M.B[j].time++;
				a=-1;
	    	}
	    	else{
    
    
	    		M.B[Max].block=Page[i];
				M.B[Max].time=0;
				for(j=0;j<RS_MAX_SIZE;j++)
				  M.B[j].time++;
				Max=-1;
				MaxU=0;
				count++; 
	    	}
	    	
	    }
		else{
    
    
			M.B[b].block=Page[i];
			M.B[b].time=0;  
			if(a!=-1){
    
    
				 M.B[a].time=0;  
			}
			for(j=0;j<RS_MAX_SIZE;j++){
    
    
				M.B[j].time++;
			}
			Max=-1;
			MaxU=0;
			b=-1;
		} 
		for(j=0;j<RS_MAX_SIZE;j++){
    
    
			printf("%d ",M.B[j].block);
		}
		printf("\n");	  
	}
	
}


//创建页面号引用串
void CreateRS() 
{
    
    
int i;
printf("请输入进程逻辑空间的页面个数: ");
scanf("%d",&rs_size);
if(rs_size>RS_MAX_SIZE)
{
    
    
printf("非法!页面个数超出进程空间的最大范围\n");
return;
}
printf("请输入进程页面号引用串(空格隔开,<=%d 个页面号):\n",RS_MAX_SIZE);
for (i=0;i<rs_size;i++) scanf("%d",&rs[i]);
}
void printPF(int n)
{
    
    
int i;
for (i=0;i<n;i++) printf("%d ",pf[i]);
printf("\n");
}
int Contains(int rs_p) 
{
    
    
int i, result = 0;
for (i=0; i<P; i++)
{
    
    
if(rs_p == pf[i])
{
    
    
result = 1;
break;
} }
return result;
}
//页面置换
void Swap(int which)
{
    
    
int i,swap_loc=0,count=0;
char s[40];
int LackPage=0;
	int q=1,w=1;
	int flag=0;
for (i=0;i<rs_size;i++)
{
    
    
if(i<P) //有空页框
{
    
    
pf[i]=rs[i];
printf("当前内存页:");
printPF(i+1);
}
else //无空页框,可能需要换页
{
    
    

if(!Contains(rs[i])) 
{
    
    
count++; 
if(which==1) 
{
    
    
swap_loc = OPT(i); 
printf("第[%d]次页面置换:物理块号[%d]上的页[%d]被换出到虚存,逻辑页[%d]被调入内存。\n",count,swap_loc,pf[swap_loc],rs[i]);
pf[swap_loc]=rs[i];
} 
else if(which==2) 
{
    
    
printf("第[%d]次页面置换:物理块号[%d]上的页[%d]被换出到虚存,逻辑页[%d]被调入内存。\n",count,swap_loc,pf[swap_loc],rs[i]);
pf[swap_loc]=rs[i];
swap_loc++;
swap_loc%=P;
}
else if(which==3)
{
    
    
LRU();

}
printf("当前内存页:");
printPF(P);
}
else printf("访问页面[%d]未缺页\n",rs[i]);
} }
printf("进程执行完毕!\n");
if(which==1) strcpy(s,"最佳");
else if(which==2) strcpy(s,"先进先出");
else strcpy(s,"最近最久未使用");
printf("采用%s 置换算法,总共发生了%d 次页面置换。\n\n\n",s,count);
}
int main()
{
    
    
int choice, flag=1;
printf("本程序为页面置换算法模拟练习:\n");
printf("目前你的进程分配的物理内存页框个数为:%d\n", P);
CreateRS();
while(flag)
{
    
    
printf("请选择: \n");
printf("1.最佳(OPT)页面置换算法\n");
printf("2.先进先出(FIFO)页面置换算法\n");
printf("3.最近最久未使用(LRU)页面置换算法\n");
printf("4.退出程序\n");
scanf("%d",&choice);
switch(choice)
{
    
    
case 1:
printf("最佳(OPT)页面置换算法运行结果:\n");
Swap(1);
break;
case 2:
printf("先进先出(FIFO)页面置换算法运行结果:\n");
Swap(2);
break;
case 3:
printf("最近最久未使用(LRU)页面置换算法运行结果:\n");
Swap(3);
break;
default:
flag=0;
} }
return 0;
}
//标记清理
void cleanFlag()
{
    
    
int i;
for(i=0;i<P;i++) call_loc[i]=0;
}

//最佳置换算法
//计算最佳置换淘汰物理页块号
int OPT(int begin)
{
    
    
int i,j, swap_loc,count=0;
cleanFlag();
for (j=begin+1;j<rs_size;j++)
{
    
    
for (i=0; i<P; i++)
{
    
    
if(rs[j] == pf[i] && call_loc[i]==0)
{
    
    
call_loc[i]=-1;
count++;
break;
} }
if(P-count==1) break;
}
for (i=0;i<P;i++)
{
    
    
if(call_loc[i]!=-1) 
{
    
    
swap_loc=i;
break;
} }
return swap_loc;
}

2、运行结果:
(1)输入进程逻辑空间的页面个数和进程页面号引用串
在这里插入图片描述
在这里插入图片描述
(2)OPT页面置换算法
在这里插入图片描述
(3)FIFO页面置换算法
在这里插入图片描述
(4)LRU页面置换算法
在这里插入图片描述
(5)退出程序
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_55726741/article/details/129247614