• 虚存管理页面置换算法 — FIFO和RUL算法模拟实现


    本篇博文为追忆以前写过的算法系列第一篇(20081021)

    温故知新


    目的: 为了解决内存容量有限与多作业执行的冲突。运用了虚拟存储技术。能从逻辑上对内存进行扩充,达到扩充内存的效果。分页存储管理是实现虚拟存储的一种方案。通过模拟算法的实验。加深理解,虚拟存储器的基本原理和方法。


    要求: 1.请求分页的置换算法(FIFO && RUL算法实现);2.按给定的顺序列,输出页面调度过程包含命中 / 缺页,调入/调出;3.计算缺页率,频率。


    说明

    vp_list[N]        //訪问序列
    bs[M]             //内存块表,M为内存块大小
    struct pt{
    	int pno;       //页号
    	int bno;       //块号
    	int flag;       //状态位,为0时在不内存。为1时在内存
        int order;      //优先序号
    };
    


    算法流程:

    程序:

    /* gujinjin 08/10/20 */
    /* 程序名称:fifo &&LRU */
    /* 程序目的:页面置换算法的FIFO编程实现 */
    
    #include<iostream>
    using namespace std;
    
    #define N 20 //訪问序列数组大小
    #define M 10  //内存块表数组大小
    
    struct pt{
    	int pno;	//页号
    	int bno;	//块号
    	int flag;	//状态位,为0时在不内存,为1时在内存
    	int order;	//优先序列
    };
    
    /*------------------------------------------*/
    /*输入函数*/
    /*------------------------------------------*/
    void input(int *a,int n)
    {
    	for(int i=0;i<n;i++){cin>>*a;a++;}
    }
    
    /*------------------------------------------*/
    /*输出函数*/
    /*------------------------------------------*/
    void output(int *a,int n)
    {
    	for(int i=0;i<n;i++){cout<<*a<<'	';a++;}
    	cout<<'
    ';
    }
    
    /*------------------------------------------*/
    /*算法fifo && LRU函数*/
    /*------------------------------------------*/
    void fifo(int*vp_list,int*bs,int n,int m)
    {
    	pt ptlist[N];//定义结构数组
    	
    
    	int k=0,flag,cn=0,i,j;//cn——统计缺页数
    	for(j=0;j<m;j++)//赋初值
    	{
    		bs[j]=0;
    	}
    
    	for(i=0;i<n;i++)// 訪问序列循环
    	{
    		flag=0;
    		for(j=0;j<m;j++)
    			if(vp_list[i]==bs[j]){flag=1;break;}
    		if(flag==1)//命中
    		{
    			ptlist[i].bno =j+1;
    			ptlist[i].flag =1;
    			ptlist[i].pno =vp_list[i];
    		}
    		else{
    			ptlist[i].flag =0;
    			ptlist[i].pno =vp_list[i];
    
    			bs[k]=vp_list[i];
    			ptlist[i].bno =k+1;
    			k=(k+1)%m;//取模——循环队列
    			cn++;
    		}
    	}
    	cout<<"FIFO算法:
    ";
    	cout<<"----------------------------------**
    ";
    	cout<<"缺页率为:"<<'	'<<(float)cn/n<<'
    ';
    	cout<<"-------------------------------------------------------------------**
    ";
    	cout<<"序列号
    ";
    	cout<<"-------------------------------------------------------------------**
    ";
    	for(i=0;i<m;i++)
    	{
    		cout<<vp_list[i]<<"	缺页!	"<<"直接存入内存块!
    ";
    	    cout<<"-------------------------------------------------------------------**
    ";
    	}
    	for(i=m;i<n;i++)
    	{
    		if(ptlist[i].flag ==0)
    			cout<<vp_list[i]<<"	缺页!	"<<"调出------块号为"<<ptlist[i].bno <<"--页号为"<<ptlist[i].pno <<'
    ';
    		else cout<<vp_list[i]<<"	命中!"<<"	位置------块号为"<<ptlist[i].bno <<"--页号为"<<ptlist[i].pno <<'
    ';;
    		cout<<"-------------------------------------------------------------------**
    ";
    	}
    }
    void LRU(int*vp_list,int*bs,int n,int m)
    {  
    	//----------------------------------------------------------------------------------------------**
        pt ptlist_LRU[N];
    	int k=0,flag,cn=0,i,j;//cn——统计缺页数
    	int com;
    	for(j=0;j<m;j++)//赋初值
    	{
    		bs[j]=0;
    	}
    	for(j=0;j<n;j++)ptlist_LRU[j].order =0;
    
    	for(i=0;i<n;i++)// 訪问序列循环
    	{
    		flag=0;
    		for(j=0;j<m;j++)
    			if(vp_list[i]==bs[j]){flag=1;break;}
    		if(flag==1)//命中
    		{
    			ptlist_LRU[i].bno =j+1;
    			ptlist_LRU[i].flag =1;
    			ptlist_LRU[i].pno =vp_list[i];
    			ptlist_LRU[i].order--;
    			com=ptlist_LRU[i].order;
    			for(j=0;j<m;j++)
    				if(ptlist_LRU[j].order <com)
    				{com=ptlist_LRU[j].order;k=ptlist_LRU[j].bno ;}
    		}
    
    		else{
    			ptlist_LRU[i].flag =0;
    			ptlist_LRU[i].pno =vp_list[i];
    
    			bs[k]=vp_list[i];
    			ptlist_LRU[i].bno =k+1;
    
    			if(i<m)k=(k+1)%m;
    			cn++;
    		}
    	}
    	cout<<"LRU*算法:
    ";
        cout<<"----------------------------------**
    ";
    	cout<<"缺页率为:"<<'	'<<(float)cn/n<<'
    ';
    	cout<<"-------------------------------------------------------------------**
    ";
    	cout<<"序列号
    ";
    	cout<<"-------------------------------------------------------------------**
    ";
    	for(i=0;i<m;i++)
    	{
    		cout<<vp_list[i]<<"	缺页!	"<<"直接存入内存块!
    ";
    	    cout<<"-------------------------------------------------------------------**
    ";
    	}
    	for(i=m;i<n;i++)
    	{
    		if(ptlist_LRU[i].flag ==0)
    			cout<<vp_list[i]<<"	缺页!	"<<"调出------块号为"<<ptlist_LRU[i].bno <<"--页号为"<<ptlist_LRU[i].pno <<'
    ';
    		else cout<<vp_list[i]<<"	命中!"<<"	位置------块号为"<<ptlist_LRU[i].bno <<"--页号为"<<ptlist_LRU[i].pno <<'
    ';;
    		cout<<"-------------------------------------------------------------------**
    ";
    	}
    }
    	
    /*------------------------------------------*/
    /*主函数*/
    /*------------------------------------------*/
    void main()
    {
    	int vp_list[N],bs[M];//定义訪问序列数组和内存块表数组
    	int n,m,choose;
    	cout<<"输入序列个数:
    ";
    	cin>>n;
    	cout<<"输入内存块大小:
    ";
    	cin>>m;
    	cout<<"请输入訪问序列:
    ";
    	input(vp_list,n);
    	cout<<"选FIFO算法输入1,选LRU*算法输入2:";
    	cin>>choose;
    
    	cout<<"訪问序列:"<<endl;
    	output(vp_list,n);
    	cout<<"**----------------------------------------**";
    	cout<<'
    ';
    	if(choose==1)
    	fifo(vp_list,bs,n,m);//调用fifo函数
    	if(choose==2)
    	LRU(vp_list,bs,n,m);
    }

    结果演示:




    
  • 相关阅读:
    java利用透明的图片轮廓抠图
    java单例之enum实现方式
    spring之ControllerAdvice注解
    memcached命令
    2016年开源巨献:来自百度的71款开源项目
    dubbo通信协议之对比
    Elasticsearch权威指南(中文版)
    Apache shiro之权限校验流程
    简单的freemarker解析测试
    Apache shiro之身份验证(登陆)流程
  • 原文地址:https://www.cnblogs.com/ldxsuanfa/p/10770079.html
  • Copyright © 2020-2023  润新知