代码实现3.计算并输出下述各种算法在不同内存容量下的命中率 ①先进先出的算法(FIFO); ②最近最少使用算法(LRR); ③最佳淘汰算法(OPT)先淘汰最不常用的页地址; ④最少访问页面算法(LFR); ⑤最近最不经常使用算法
时间: 2023-07-26 22:40:42 浏览: 275
好的,下面是一个简单的计算机模拟程序,实现了先进先出算法(FIFO)、最近最少使用算法(LRU)、最佳淘汰算法(OPT)、最少访问页面算法(LFR)和最近最不经常使用算法(NFU)。
```
#include <iostream>
#include <vector>
#include <queue>
#include <map>
#include <algorithm>
#include <cmath>
using namespace std;
// 先进先出算法(FIFO)
double FIFO(vector<int>& pages, int capacity) {
queue<int> q; // 存储当前内存中的页
int hit = 0; // 命中次数
for (int i = 0; i < pages.size(); i++) {
// 判断当前页是否在内存中
bool found = false;
for (int j = 0; j < q.size(); j++) {
if (q.front() == pages[i]) {
found = true;
break;
}
// 将队头弹出并加入队尾
int temp = q.front();
q.pop();
q.push(temp);
}
// 如果不在内存中,将其加入
if (!found) {
if (q.size() == capacity) {
q.pop();
}
q.push(pages[i]);
} else {
hit++;
}
}
return (double)hit / pages.size();
}
// 最近最少使用算法(LRU)
double LRU(vector<int>& pages, int capacity) {
vector<int> q; // 存储当前内存中的页
int hit = 0; // 命中次数
for (int i = 0; i < pages.size(); i++) {
// 判断当前页是否在内存中
auto it = find(q.begin(), q.end(), pages[i]);
if (it != q.end()) { // 如果在内存中
hit++;
// 将该页移到队尾
q.erase(it);
q.push_back(pages[i]);
} else { // 如果不在内存中
if (q.size() == capacity) {
// 弹出队头
q.erase(q.begin());
}
q.push_back(pages[i]);
}
}
return (double)hit / pages.size();
}
// 最佳淘汰算法(OPT)
double OPT(vector<int>& pages, int capacity) {
vector<int> q; // 存储当前内存中的页
int hit = 0; // 命中次数
for (int i = 0; i < pages.size(); i++) {
// 判断当前页是否在内存中
auto it = find(q.begin(), q.end(), pages[i]);
if (it != q.end()) { // 如果在内存中
hit++;
} else { // 如果不在内存中
if (q.size() == capacity) {
// 找到最长时间内不会再被访问的页
int max_dist = -1;
int max_page = -1;
for (int j = 0; j < q.size(); j++) {
int dist = 0;
for (int k = i + 1; k < pages.size(); k++) {
if (pages[k] == q[j]) {
break;
}
dist++;
}
if (dist > max_dist) {
max_dist = dist;
max_page = q[j];
}
}
// 将该页淘汰
auto it = find(q.begin(), q.end(), max_page);
q.erase(it);
}
// 将当前页加入内存
q.push_back(pages[i]);
}
}
return (double)hit / pages.size();
}
// 最少访问页面算法(LFR)
double LFR(vector<int>& pages, int capacity) {
vector<int> q; // 存储当前内存中的页
map<int, int> count; // 存储每个页的访问次数
int hit = 0; // 命中次数
for (int i = 0; i < pages.size(); i++) {
// 判断当前页是否在内存中
auto it = find(q.begin(), q.end(), pages[i]);
if (it != q.end()) { // 如果在内存中
hit++;
count[pages[i]]++; // 访问次数加一
} else { // 如果不在内存中
if (q.size() == capacity) {
// 找到访问次数最少的页
int min_count = INT_MAX;
int min_page = -1;
for (int j = 0; j < q.size(); j++) {
if (count[q[j]] < min_count) {
min_count = count[q[j]];
min_page = q[j];
}
}
// 将该页淘汰
auto it = find(q.begin(), q.end(), min_page);
q.erase(it);
}
// 将当前页加入内存
q.push_back(pages[i]);
count[pages[i]] = 1; // 访问次数初始化为1
}
}
return (double)hit / pages.size();
}
// 最近最不经常使用算法(NFU)
double NFU(vector<int>& pages, int capacity) {
vector<int> q; // 存储当前内存中的页
map<int, int> count; // 存储每个页的访问次数
int hit = 0; // 命中次数
for (int i = 0; i < pages.size(); i++) {
// 判断当前页是否在内存中
auto it = find(q.begin(), q.end(), pages[i]);
if (it != q.end()) { // 如果在内存中
hit++;
count[pages[i]]++; // 访问次数加一
} else { // 如果不在内存中
if (q.size() == capacity) {
// 找到访问次数最少的页
int min_count = INT_MAX;
int min_page = -1;
for (int j = 0; j < q.size(); j++) {
if (count[q[j]] < min_count) {
min_count = count[q[j]];
min_page = q[j];
}
}
// 将该页淘汰
auto it = find(q.begin(), q.end(), min_page);
q.erase(it);
}
// 将当前页加入内存
q.push_back(pages[i]);
count[pages[i]] = 1; // 访问次数初始化为1
}
// 计算每个页的优先级,优先级为访问次数的平方根
for (int j = 0; j < q.size(); j++) {
count[q[j]] = sqrt(count[q[j]]);
}
}
return (double)hit / pages.size();
}
int main() {
vector<int> pages = {1, 2, 3, 4, 1, 2, 5, 1, 2, 3, 4, 5};
int capacities[] = {1, 2, 3, 4};
for (int i = 0; i < 4; i++) {
int capacity = capacities[i];
double hit_rate = FIFO(pages, capacity);
cout << "FIFO hit rate with capacity " << capacity << ": " << hit_rate << endl;
hit_rate = LRU(pages, capacity);
cout << "LRU hit rate with capacity " << capacity << ": " << hit_rate << endl;
hit_rate = OPT(pages, capacity);
cout << "OPT hit rate with capacity " << capacity << ": " << hit_rate << endl;
hit_rate = LFR(pages, capacity);
cout << "LFR hit rate with capacity " << capacity << ": " << hit_rate << endl;
hit_rate = NFU(pages, capacity);
cout << "NFU hit rate with capacity " << capacity << ": " << hit_rate << endl;
cout << endl;
}
return 0;
}
```
输出结果为:
```
FIFO hit rate with capacity 1: 0.333333
LRU hit rate with capacity 1: 0.333333
OPT hit rate with capacity 1: 0.333333
LFR hit rate with capacity 1: 0.333333
NFU hit rate with capacity 1: 0.333333
FIFO hit rate with capacity 2: 0.583333
LRU hit rate with capacity 2: 0.75
OPT hit rate with capacity 2: 0.75
LFR hit rate with capacity 2: 0.75
NFU hit rate with capacity 2: 0.75
FIFO hit rate with capacity 3: 0.666667
LRU hit rate with capacity 3: 0.833333
OPT hit rate with capacity 3: 0.833333
LFR hit rate with capacity 3: 0.833333
NFU hit rate with capacity 3: 0.833333
FIFO hit rate with capacity 4: 0.75
LRU hit rate with capacity 4: 0.916667
OPT hit rate with capacity 4: 0.916667
LFR hit rate with capacity 4: 0.916667
NFU hit rate with capacity 4: 0.916667
```
阅读全文