最近最久未使用(LRU)演算法
阿新 • • 發佈:2019-01-30
#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;
}