LRU最近最久未使用演算法

2021-07-31 04:15:00 字數 2955 閱讀 7966

標籤: 演算法

作業系統 舉報

作業系統知識庫

c++(21)

作者同類文章x

作業系統學習(11)

作者同類文章x

最近最久未使用演算法需要引入記憶體塊時鐘,即為每個記憶體塊設定乙個計時器,用於記錄相應記憶體塊中的頁面已經存在的時間。每次置換選出所有記憶體塊時鐘中最大者作為被置換頁面,當頁面發生置換時,將其對應的計時器清零,並且其他計時器加1.可用等長的整型陣列來表示每個記憶體塊的計時器。

在記憶體塊初始化後,取出頁面訪問序列佇列的隊頭。首先判斷記憶體塊中是否已經存在該隊頭頁面,如果存在則直接顯示記憶體塊當前情況;否則,判斷此時記憶體是否已滿。如果記憶體未滿,迴圈遍歷找出空閒記憶體塊,進行頁面置換;若記憶體已滿,選出所有記憶體塊時鐘中最大者,並置換之,缺頁數加1. 每發生一次置換,被置換頁面記憶體所對應的計時器清零,其他計時器加1. 如此迴圈迭代,直到頁面訪問序列隊列為空時,整個演算法執行完畢。最後計算並顯示缺頁率。其流程圖如圖所示:

**示例:

[cpp]view plain

copy

print?

#ifndef pagereplacement_h  

#define pagereplacement_h  

#include 

class pagereplacement  

;  #endif  // pagereplacement_h  

#ifndef pagereplacement_h

#define pagereplacement_h

#include class pagereplacement

;#endif // pagereplacement_h

[cpp]view plain

copy

print?

#include "pagereplacement.h"  

#include 

#include 

#include 

pagereplacement::pagereplacement()  

: mem(3, -1)  

pagereplacement::~pagereplacement()  

void pagereplacement::run()  

std::cout <

for (int i = 0; i 

std::cout <

}  void pagereplacement::lru()  

break;  

}  else if (mem.at(i) == -1 && vacant == -1)       // 如果找到空閒位  

}  if (equal)                  // 如果找到相等的頁面,則進行下乙個查詢  

++nlack;  

if (vacant !=  -1)  

continue;  

}  else  

}  mem[subindex] = head;           // 把隊頭的放入到最近最久未被使用的記憶體塊中  

this->addinfo();  

timer[subindex] = -1;  

for (int j = 0; j 

}  }  std::cout <

}  void pagereplacement::addinfo() const  

#include "pagereplacement.h"

#include #include #include pagereplacement::pagereplacement()

: mem(3, -1)

pagereplacement::~pagereplacement()

void pagereplacement::run()

std::cout << "序列號:";

for (int i = 0; i < seqvec.size(); ++i)

std::cout << std::endl;

}void pagereplacement::lru()

break;

}else if (mem.at(i) == -1 && vacant == -1) // 如果找到空閒位

}if (equal) // 如果找到相等的頁面,則進行下乙個查詢

++nlack;

if (vacant != -1)

continue;

} else

}mem[subindex] = head; // 把隊頭的放入到最近最久未被使用的記憶體塊中

this->addinfo();

timer[subindex] = -1;

for (int j = 0; j < timer.size(); ++j)

}} std::cout << "缺頁率: " << (double)nlack/ntotal * 100 << "%" << std::endl;

}void pagereplacement::addinfo() const

[cpp]view plain

copy

print?

#include 

#include "pagereplacement.h"  

int main()  

#include #include "pagereplacement.h"

int main()

頂踩

我的同類文章

c++(21) 作業系統學習(11)

最近最久未使用

最近最久未使用 lru 的頁面置換演算法是根據頁面調入記憶體後的使用情況做出決策的。由於無法 各頁面將來的使用情況,只能利用 最近的過去 作為 最近的將來 的近似,因此,lru置換演算法是選擇最近最久未使用的頁面予以淘汰。該演算法賦予每個頁面乙個訪問字段,用來記錄乙個頁面自上次被訪問以來所經歷的時間...

LRU最久未使用淘汰演算法實現

lru 缺頁置換演算法中的一種,當容量滿的時候,新增新的一頁,就會置換淘汰掉最久未使用的一頁。實現 可以採用鍊錶實現 主要是因為該演算法體現在頭部和尾部的操作居多。因此採用雙向鍊錶為佳。介於c stl容器的list實現為乙個方式。由於牽扯到判斷是否存在的問題,因此需要遍歷查詢。該演算法實現時間複雜度...

快取淘汰策略 最近最久未使用策略(LRU)

快取位於記憶體中,而記憶體的空間很有限,所以快取也有乙個能使用的最大空間,當快取中的資料超過這個最大空間時,就要使用快取淘汰策略淘汰一些資料,空出空間給其他資料使用。最近最久未使用策略,優先淘汰最久未使用的資料,也就是上次被訪問時間距離現在最久的資料。該策略可以保證記憶體中的資料都是熱點資料,也就是...