请求分页虚拟存储器方式

利用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;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值