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; }