当物理块满了以后,要将物理块中的某一个块替换出去,那么我们就要有考虑的选择要替换下去哪一个
那么最近最久未使用算法,简单来说就是要选取物理块中最久没有被使用的页块号
首先明确,我们要将页上的信息对应装入到物理块中
那么我们就要首先判断物理块是否有值,若没有,将信息装进去;若物理块满,则判断是否物理块中的值是否和页块号相同,如果有相同的,那么更新时间顺序,如果没有相同的,则找到最久没有被使用的,将其替换出来,同时更新时间
理清逻辑后,我们写代码
#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; }