1. 程式人生 > >最近最久未使用(LRU)演算法

最近最久未使用(LRU)演算法

演算法原理

#include <iostream>
#include <cstdio>//LRU
#include <windows.h>
using namespace std;

struct page{
  int time;//多久未使用 
  int value;//頁面號 
};

int find_(int x);//判斷物理塊中是否有該頁面有就返回該索引 
int findMaxTime_();//找到放在物理塊中最久未使用頁面 
void print_();//列印當前物理塊中的頁面 

const int memoryLength = 4;//物理塊個數 
int
memoryPosition = 0;// int findPosition; //標記找到的頁面的位置 struct page memory[memoryLength]; int page[25] = {0, 7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2, 1, 2, 0, 1, 7, 0, 1};//第一個不算(頁面號) int main() { //初始化開始時間為0 for (int i = 0; i < memoryLength; i++) { memory[i].time = 0; } //LRU演算法進行頁面置換過程
for (int i = 1; i <= 20; i++) { Sleep(500); printf("當前進入物理塊的頁面號:%d\n", page[i]); if (memoryPosition < memoryLength) { findPosition = find_(page[i]); for (int j = 0; j < memoryPosition; j++) memory[j].time++; if (findPosition != -1) memory[findPosition].time = 0
; else { memory[memoryPosition].value = page[i]; memory[memoryPosition].time = 0; memoryPosition++; } print_(); //memoryPosition等於memoryLength時表示物理塊已填滿 }else { for (int j = 0; j < memoryLength; j++) memory[j].time++; findPosition = find_(page[i]);//斷物理塊中是否有該頁面有就返回該索引 if (findPosition == -1) { findPosition = findMaxTime_();//找到最久未使用頁面的物理塊位置 memory[findPosition].value = page[i]; memory[findPosition].time = 0; }else { memory[findPosition].time = 0; } print_(); } } return 0; } int find_(int x) {//查詢物理塊中是否有該頁面 for (int i = 0; i < memoryPosition; i++) { if (x == memory[i].value) return i; } return -1; } void print_() { for (int i = 0; i < memoryPosition; i++) { printf("頁面號:%d 未使用時間%d\n", memory[i].value, memory[i].time); //printf("%d ", memory[i].value); } printf("\n"); } int findMaxTime_() { int max_ = -1; int maxPosition; for (int i = 0; i < memoryPosition; i++) { if (memory[i].time > max_) { max_ = memory[i].time; maxPosition = i; } } return maxPosition; }