赞
踩
LRU页面置换算法是虚拟存储器中使用的算法,通过选取最近最少使用的页面换出
LRU(最近最少使用)页面置换算法是根据过去使用次数来预测将来的页面使用情况,具体过程如下:
当发生缺页而分配给进程的物理块耗尽时,需要将所需页面置换入内存,被换出的页面是最近最少被使用的页面。具体的实现方法为为每个内存中的页面配置一个移位寄存器,每过一段时间(如10ms)将其中的数字右移。当该页面被访问时,将最高位置一,这样,最近被访问的页面寄存器中的数字是最大的,需要换出页面时,只需选取数值最小的页面换出;另一种方法是为每个进程配置一个栈,页面进入内存时将其压入栈中,当访问内存中的页面时,将其重新压入栈顶,如此最近被访问的页面就在栈顶,需要置换页面时,只需将栈底的页面置换出即可。下面代码使用的是第一种方法。
#include <iostream> #include <vector> using namespace std; typedef struct { unsigned visit; ///int block = ; int state; int pageId; }PageItem,*itemp; itemp initItem(int pageId) { itemp aItemp = new PageItem; aItemp->visit = 0b0; aItemp->state = 0; aItemp->pageId = pageId; return aItemp; } void moveright(itemp items[],int num) { for(int i=0;i<num;i++) items[i]->visit = (items[i]->visit)>>1; } void LRU(itemp items[],int num,int pageId,vector<int>& blocks) { int id = 0; unsigned visit = 0xFFFFFFFF; for(int i=0;i<num;i++) { if(visit>items[i]->visit && items[i]->state==1) { visit = items[i]->visit; id = items[i]->pageId; } } for(int i=0;i<num;i++) { if(items[i]->pageId==id) { items[i]->visit = 0b0; items[i]->state = 0; } if(items[i]->pageId==pageId) items[i]->state = 1; } for(vector<int>::iterator i=blocks.begin();i!=blocks.end();i++) { if(*i==id) { *i = pageId; break; } } } int main() { int invoke = 0; int blocknum = 0; int next = 0; int blockTaken = 0; vector<int> blocks(0); itemp items[8] = {}; for(int i=0;i<8;i++) items[i] = initItem(i); ///PageTable table(5,items); cout << "为此进程分配的物理块个数:"; cin >> blocknum; cout << "调用页面的次数:"; cin >> invoke; for(int i=0;i<invoke;i++) { cout << "下次要调用的页面是:"; cin >> next; bool in = false; for(vector<int>::iterator i=blocks.begin();i!=blocks.end();i++) { if(next == *i) { in = true; break; } } if(in) { cout << "页面在内存中\n"; } else if(blockTaken<blocknum) { //页面不在内存中并且物理块还未耗尽 blocks.push_back(next); cout << "页面载入内存,当前物理块:"; for(vector<int>::iterator i=blocks.begin();i!=blocks.end();i++) cout << *i << '\t'; cout << endl; items[next]->state = 1; blockTaken++; } else if(blockTaken>=blocknum) { cout << "物理块满,调用LRU页面置换算法\n"; cout << "当前物理块分配为:"; for(vector<int>::iterator i=blocks.begin();i!=blocks.end();i++) cout << *i << '\t'; LRU(items,5,next,blocks); //物理块耗尽,使用LRU算法置换页面 cout << endl << "置换后物理块分为:"; for(vector<int>::iterator i=blocks.begin();i!=blocks.end();i++) cout << *i << '\t'; cout << endl; } items[next]->visit+=0b10000000000000000000000000000000; moveright(items,8); } return 0; }
以上是我对LRU算法的理解,如有谬误,欢迎斧正。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。