#include <stdio.h> #include <conio.h> #include <stdlib.h> #define MAINMEM 3 //主存可存储的页面个数 #define QUEUEMAXLEN 30 //队列最大长度 struct LRUQueue //定义一个特殊的队列 { int number; int data[MAINMEM]; }lru; void Init(); //初始化操作 void Add(int pageID); //加入队列 int Find(int pageID); //查找页面是否在主存中 void Update(int pos); //更新页所在的地址 void PrintQueue(); //输出主存内容 int main() { int i; int queuelength; int queue[QUEUEMAXLEN]; Init(); //初始化操作 printf("请输入队列的长度:"); scanf("%d",&queuelength); printf("请以此输入队列的页号:"); for(i=0;i<queuelength;i++) { scanf("%d",&queue[i]); Add(queue[i]); PrintQueue(); } system("pause"); return 0; } void Init() { lru.number = 0; int i; for(i = 0;i<MAINMEM;i++) { lru.data[i] = -1; } } int Find(int pageID) { int i; for (i=0;i<MAINMEM;i++) { if(lru.data[i] == pageID) { return i; } } return 0; } void Update(int pos) { int tmp = lru.data[pos]; int i; for(i = pos;i<lru.number;++i) { lru.data[i] = lru.data[i+1]; } lru.data[lru.number-1] = tmp; //将被访问的页放在最后一位,其他的页前移,因为置换时删掉的是主存中第一块放置的页面 } void PrintQueue() { printf("当前内存中的页号:\n"); int i; putch('|'); for(i = 0;i<MAINMEM;i++) { if(lru.data[i] == -1) printf(" |"); else printf("%d |",lru.data[i]); } putch('\n'); } void Add(int pageID) { printf("当前访问的页面:%d\n",pageID); if(lru.number<MAINMEM) //如果主存没有填满 { int pos = Find(pageID); if(pos) { Update(pos); } else { lru.data[lru.number++]=pageID; } } else { int pos = Find(pageID); if(pos) { Update(pos); } else { int i; for(i=0;i<MAINMEM-1;i++) { lru.data[i]=lru.data[i+1]; //数据左移一个单位 } lru.data[i]=pageID; //加入新数据 } } }
LRU算法
最新推荐文章于 2022-09-08 00:23:39 发布