利用C++编程语言,模拟请求分页虚拟存储器方式中,缺页、请求调页、页面置换的过程。
最佳置换Optimal
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// 最佳置换算法
int optimalReplace(vector<int>& pages, vector<int>& frames, int start) {
int farthest = start, replaceIdx = 0;
for (int i = 0; i < frames.size(); i++) {
int j;
for (j = start; j < pages.size(); j++) {
if (frames[i] == pages[j]) {
if (j > farthest) {
farthest = j;
replaceIdx = i;
}
break;
}
}
// 如果页面在后续不再被访问,直接替换
if (j == pages.size()) {
return i;
}
}
return replaceIdx;
}
void pageReplacement(vector<int>& pages, int frameCount) {
vector<int> frames; // 当前内存中的页面
int pageFaults = 0; // 缺页次数
for (int i = 0; i < pages.size(); i++) {
// 检查页面是否已在内存中
if (find(frames.begin(), frames.end(), pages[i]) == frames.end()) {
pageFaults++;
// 如果内存未满,直接加载
if (frames.size() < frameCount) {
frames.push_back(pages[i]);
}
// 否则进行页面置换
else {
int replaceIdx = optimalReplace(pages, frames, i + 1);
frames[replaceIdx] = pages[i];
}
}
// 输出当前内存状态
cout << "访问页面 " << pages[i] << " 后内存状态: ";
for (int f : frames) cout << f << " ";
cout << endl;
}
cout << "\n总缺页次数: " << pageFaults << endl;
}
int main() {
// 页面访问序列
vector<int> pages = {7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2, 1, 2, 0, 1, 7, 0, 1};
// 内存帧数
int frameCount = 3;
cout << "页面访问序列: ";
for (int p : pages) cout << p << " ";
cout << "\n\n";
pageReplacement(pages, frameCount);
return 0;
}
先进先出FIFO
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// 最佳置换算法
int optimalReplace(vector<int>& pages, vector<int>& frames, int start) {
int farthest = start, replaceIdx = 0;
for (int i = 0; i < frames.size(); i++) {
int j;
for (j = start; j < pages.size(); j++) {
if (frames[i] == pages[j]) {
if (j > farthest) {
farthest = j;
replaceIdx = i;
}
break;
}
}
// 如果页面在后续不再被访问,直接替换
if (j == pages.size()) {
return i;
}
}
return replaceIdx;
}
// FIFO置换算法
int fifoReplace(vector<int>& frames, int& replaceIndex) {
int idx = replaceIndex;
replaceIndex = (replaceIndex + 1) % frames.size(); // 更新替换索引
return idx;
}
void pageReplacement(vector<int>& pages, int frameCount) {
vector<int> frames; // 当前内存中的页面
int pageFaults = 0; // 缺页次数
int replaceIndex = 0; // FIFO替换索引
for (int i = 0; i < pages.size(); i++) {
// 检查页面是否已在内存中
if (find(frames.begin(), frames.end(), pages[i]) == frames.end()) {
pageFaults++;
// 如果内存未满,直接加载
if (frames.size() < frameCount) {
frames.push_back(pages[i]);
}
// 否则进行页面置换
else {
int replaceIdx = fifoReplace(frames, replaceIndex);
frames[replaceIdx] = pages[i];
}
}
// 输出当前内存状态
cout << "访问页面 " << pages[i] << " 后内存状态: ";
for (int f : frames) cout << f << " ";
cout << endl;
}
cout << "\n总缺页次数: " << pageFaults << endl;
}
int main() {
// 页面访问序列
vector<int> pages = {7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2, 1, 2, 0, 1, 7, 0, 1};
// 内存帧数
int frameCount = 3;
cout << "页面访问序列: ";
for (int p : pages) cout << p << " ";
cout << "\n\n";
pageReplacement(pages, frameCount);
return 0;
}
最近最久未使用LRU
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// 最佳置换算法
int optimalReplace(vector<int>& pages, vector<int>& frames, int start) {
int farthest = start, replaceIdx = 0;
for (int i = 0; i < frames.size(); i++) {
int j;
for (j = start; j < pages.size(); j++) {
if (frames[i] == pages[j]) {
if (j > farthest) {
farthest = j;
replaceIdx = i;
}
break;
}
}
// 如果页面在后续不再被访问,直接替换
if (j == pages.size()) {
return i;
}
}
return replaceIdx;
}
// FIFO置换算法
int fifoReplace(vector<int>& frames, int& replaceIndex) {
int idx = replaceIndex;
replaceIndex = (replaceIndex + 1) % frames.size(); // 更新替换索引
return idx;
}
// LRU置换算法
int lruReplace(vector<int>& frames, vector<int>& lastUsed) {
int idx = 0;
for (int i = 1; i < frames.size(); i++) {
if (lastUsed[i] < lastUsed[idx]) {
idx = i;
}
}
return idx;
}
void pageReplacement(vector<int>& pages, int frameCount) {
vector<int> frames; // 当前内存中的页面
vector<int> lastUsed(frameCount, -1); // 记录每个页面最后使用时间
int pageFaults = 0; // 缺页次数
int time = 0; // 时间戳
for (int i = 0; i < pages.size(); i++) {
// 检查页面是否已在内存中
auto it = find(frames.begin(), frames.end(), pages[i]);
if (it == frames.end()) {
pageFaults++;
// 如果内存未满,直接加载
if (frames.size() < frameCount) {
frames.push_back(pages[i]);
lastUsed[frames.size() - 1] = time++;
}
// 否则进行页面置换
else {
int replaceIdx = lruReplace(frames, lastUsed);
frames[replaceIdx] = pages[i];
lastUsed[replaceIdx] = time++;
}
}
else {
// 更新页面最后使用时间
lastUsed[it - frames.begin()] = time++;
}
// 输出当前内存状态
cout << "访问页面 " << pages[i] << " 后内存状态: ";
for (int f : frames) cout << f << " ";
cout << endl;
}
cout << "\n总缺页次数: " << pageFaults << endl;
}
int main() {
// 页面访问序列
vector<int> pages = {7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2, 1, 2, 0, 1, 7, 0, 1};
// 内存帧数
int frameCount = 3;
cout << "页面访问序列: ";
for (int p : pages) cout << p << " ";
cout << "\n\n";
pageReplacement(pages, frameCount);
return 0;
}