操作系统_存储管理_页面置换算法_最近最久未使用算法


当物理块满了以后,要将物理块中的某一个块替换出去,那么我们就要有考虑的选择要替换下去哪一个

那么最近最久未使用算法,简单来说就是要选取物理块中最久没有被使用的页块号

首先明确,我们要将页上的信息对应装入到物理块中

那么我们就要首先判断物理块是否有值,若没有,将信息装进去;若物理块满,则判断是否物理块中的值是否和页块号相同,如果有相同的,那么更新时间顺序,如果没有相同的,则找到最久没有被使用的,将其替换出来,同时更新时间

理清逻辑后,我们写代码

#include <iostream>  
#define N 200
using namespace std;

int page[N];//页面引用号 
struct block
{
	int block;     
	int bt;      //时间
}b1[N];

int n;//页面引用号个数 
int m;//物理块数目 

void lru()
{	
	int j = 0;
	memset(b1, -1, sizeof(b1));     //将物理块清零

	for (int i = 0; i < n; i++)
	{
		for (; j < m;)
		{
			if (b1[j].block == -1)      //判断是否满
				{
					b1[j].block = page[i];     //不满写进去
					b1[j].bt = j;
					cout<<endl<<"当前内存中页面情况wu:"<<endl;
					for(int x = 0; x < m; x++)
						cout<<b1[x].block<<" ";         //遍历
					cout<<endl<<endl;
					j++;
					cout<<j<<endl;
					j = j%m ;
					break;
				}
			bool flag=false;
			int MIN=0x3f3f3f3f,p=0;
			for(int w = 0; w < m; w++)
			{	if (b1[w].block == page[i])          //判断物理块中是否有与页块号相同的
					{	
						b1[w].bt = m-1;
						for(int a = m-1; a > w; a--)
							b1[a].bt--;
						cout<<endl<<"当前内存中页面情况chong:"<<endl;
						for(int x = 0; x < m; x++)
							cout<<b1[x].block<<" ";
						cout<<endl<<endl;
						flag=true;
						break;
					}
					if(MIN>b1[w].bt)         //找最小的,当然也可以用for循环跑
					{
						MIN=b1[w].bt;
						p=w;
					}
			}
			if(!flag)                           //物理块满,并且不相同
					{
						b1[p].block = page[i];     //替换最久没使用过的
						b1[p].bt = m-1;           //更新时间信息
						for(int a = m-1; a > p; a--)   //更新时间信息
							b1[a].bt--;			 
					}
			cout<<endl<<"当前内存中页面情况ti:"<<endl;
			for(int x = 0; x < m; x++)
				cout<<b1[x].block<<" ";
			cout<<endl<<endl;
			break;	
		}		
	}
}

int main()
{
    cin>>n>>m;
    for(int i=0; i < n; i++){ 
        cin>>page[i];
    } 
    lru();
     return 0;
} 




猜你喜欢

转载自blog.csdn.net/ljh_laura_li/article/details/80244580
今日推荐