• LRU算法


    #include <stdio.h>
    #include <stdlib.h>
    #include <iostream.h>
    #include <time.h>
     
    
    #define Bsize 3
    #define Psize 20
    
    struct pageInfor
    {
    	int content;//页面号
    	int timer;//被访问标记
    };
    
    class LRU
    {
    	public:
    		LRU(int qstring[]);
    		int findSpace(void);//查找是否有空闲内存
    		int findExist(int curpage);//查找内存中是否有该页面
    		int findReplace(void);//查找应予置换的页面
    		void display(void);//显示
    		int  LRUpro(void);//LRU算法
    		void BlockClear(void);//BLOCK恢复
    		pageInfor * block;//物理块
    		pageInfor * page;//页面号串
    };
    
    LRU::LRU(int qstring[])
    {
    	int i;
    	block = new pageInfor[Bsize];
    	for(i=0; i<Bsize; i++)
    	{
    		block[i].content = -1;
    		block[i].timer = 0;
    	}
    
    	page = new pageInfor[Psize];
    	for(i=0; i<Psize; i++)
    	{
    		page[i].content = qstring[i];
    		page[i].timer = 0;
    	}
    }
    
    
    int LRU::findSpace(void)
    {
    	for(int i=0; i<Bsize; i++)
    		if(block[i].content == -1)
    			return i;//找到空闲内存,返回BLOCK中位置
    	return -1;
    }
    
    int LRU::findExist(int curpage)
    {
    
    	for(int i=0; i<Bsize; i++)
    		if(block[i].content == page[curpage].content)
    			return i;//找到内存中有该页面,返回BLOCK中位置
    	return -1;
    }
    
    int LRU::findReplace(void)
    {
    	int pos = 0;
    
    	for(int i=0; i<Bsize; i++)
    	if(block[i].timer >= block[pos].timer)
    		pos = i;//找到应予置换页面,返回BLOCK中位置
    	return pos;
    }
    
    void LRU::display(void)
    {
    	for(int i=0; i<Bsize; i++)
    	if(block[i].content != -1)
    		cout<<block[i].content<<" ";
    	cout<<endl;
    }
    
    void LRU::BlockClear(void)
    {
    	for(int i=0; i<Bsize; i++)
    	{
    		block[i].content = -1;
    		block[i].timer = 0;
    	}
    }
    
    
    int LRU::LRUpro(void)
    {
    	int exist,space,position ;
    	int noscarBsize=0;
    
    	for(int i=0; i<Psize; i++)
    	{
    		exist = findExist(i);
    		if(exist != -1)
    		{
    			noscarBsize++;
    			cout<<"不缺页"<<endl;
    			block[exist].timer = -1;//恢复存在的并刚访问过的BLOCK中页面TIMER为-1
    		}
      		else
      		{
       			space = findSpace();
       			if(space != -1)
       			{
        			block[space] = page[i];
        			display();
       			}
       			else
       			{
        			position = findReplace();
        			block[position] = page[i];  
        			display();
       			}
      		}
      		for(int j=0; j<Bsize; j++)
       			block[j].timer++;
     	}
    	return noscarBsize;
    }
    
    /*在linux下用gcc编译时,使用gcc lru3.cpp -lstdc++*/ 
    
    
    int main(void)
    {
    	cout<<"|----------页 面 置 换算法----------|"<<endl;
    	cout<<"|---please seect:---|"<<endl;
    	cout<<"|-----1:LRU--------|"<<endl;
    	cout<<"|-------0 :exit------|"<<endl;
     	cout<<"|-------------------------------------|"<<endl;
     
     	int select;
    	int i,scarBsize=0;
    	float f;
    	int qstring[20];
     
     	while(select)
     	{
      		cin>>select;
      		switch(select)
      		{
       			case 0:
        			break;
       			case 1:
       			{
    			   	
    				cout<<"the amount of page block is 3:"<<endl;
    				cout<<"produce the sequence of 20 length randomly:"<<endl ;
    				srand((unsigned)time(NULL));
    				for(i=0;i<Psize;i++)
    				{
    					if(!(i%10))
    		 				cout<<endl;
    						qstring[i]= rand() % 8;
    						cout<<"*"<<qstring[i];
    				}
        			cout<<endl;
    				LRU test(qstring);
    				cout<<"the result of LRU algorithm is"<<endl;
    				scarBsize=20-test.LRUpro();
    				cout<<"the amout of scarpage is"<<scarBsize<<endl;
    				f=scarBsize/20.0;
    				cout<<"the ratio of the  is"<<f<<endl;
        			test.BlockClear();
        			cout<<"----------------------"<<endl;
    				break;
      			}	
       			default:
        			cout<<"请输入正确功能号"<<endl;
        			break;
      		}
     	}
     	return 0;
    }
    

      

  • 相关阅读:
    盛最多水容器
    罗马数字和整数互相转化
    v-if和v-for
    扫描二维码登录
    使用Promise实现红绿灯交替重复亮
    利用promise实现间隔1s打印1,2,3
    原生js拖拽
    react项目引入使用element-react报错
    php实现类似淘宝最近浏览商品的功能模型代码
    教你如何把php项目打包成EXE文件发布
  • 原文地址:https://www.cnblogs.com/changweihua/p/2497903.html
Copyright © 2020-2023  润新知