FIFO先進先出置換演算法
阿新 • • 發佈:2019-02-13
演算法過程:
將記憶體塊陣列視為佇列,在實現的過程中,初始化時,隊頭指標指向第一個記憶體塊位置,隊尾指標指向最後一個記憶體塊位置。每次進行頁面置換時,演算法總置換當前隊頭,並且,隊頭指標迴圈加1,隊尾指標迴圈加1.
在記憶體塊初始化後,取出頁面訪問序列佇列的隊頭。首先判斷記憶體塊中是否已經存在該隊頭頁面,如果存在則直接顯示記憶體塊當前情況;否則,判斷此時記憶體是否已滿。如果記憶體未滿,迴圈遍歷找出空閒記憶體塊,進行頁面置換;若記憶體已滿,置換記憶體塊佇列的隊頭頁面,缺頁數加1,隊頭指標隊尾指標迴圈加1. 如此迴圈迭代,直到頁面訪問序列佇列為空時,整個演算法執行完畢。最後計算並顯示缺頁率。其流程圖如下:
程式碼示例:
#ifndef PAGEREPLACEMENT_H #define PAGEREPLACEMENT_H #include <vector> class PageReplacement { public: PageReplacement(); ~PageReplacement(); void run(); void FIFO(); private: void addInfo() const; private: int pages; // 虛擬記憶體的尺寸P int firstPageFramePos; // 工作面的起始位置p int pageFrames; // 工作面中包含的頁數e int rateM; // 工作面移動率m std::vector<int> seqVec; // 序列號 std::vector<int> mem; // 記憶體塊 }; #endif // PAGEREPLACEMENT_H
#include "PageReplacement.h" #include <iostream> #include <cstdlib> #include <list> PageReplacement::PageReplacement() : mem(3, -1) { this->run(); } PageReplacement::~PageReplacement() { } void PageReplacement::run() { std::cout << "請輸入虛擬記憶體尺寸P:"; std::cin >> pages; std::cout << "請輸入工作面的起始位置p:"; std::cin >> firstPageFramePos; std::cout << "請輸入工作面中包含的頁數e:"; std::cin >> pageFrames; std::cout << "請輸入工作面移動率m:"; std::cin >> rateM; std::cout << "請輸入在0和1之間的值t:"; std::cin >> t; for (int i = 0; i < rateM; ++i) { int randomNum = (rand() % pageFrames) + firstPageFramePos; seqVec.push_back(randomNum); } std::cout << "序列號:"; for (int i = 0; i < seqVec.size(); ++i) { std::cout << seqVec.at(i) << " "; } std::cout << std::endl; } void PageReplacement::FIFO() { int nLack = 0; // 缺頁數 std::list<int> seqList(seqVec.begin(), seqVec.end()); int nTotal = seqList.size(); int queueHead = 0; // 記憶體塊佇列隊頭指標 while (!seqList.empty()) // 頁面訪問佇列不為空 { int head = *seqList.begin(); //去隊頭的頁面 seqList.pop_front(); bool equal = false; // 標識記憶體中是否有與隊頭相等的頁面 int vacant = -1; // 標識記憶體中是否有空閒位 for (int i = 0; i < mem.size(); ++i) { if (head == mem.at(i)) // 如果找到相等的頁面 { this->addInfo(); equal = true; break; } else if (mem.at(i) == -1 && vacant == -1) // 找到空閒位 { vacant = i; } } if (equal) // 找到相等頁面,進行下一個頁面的訪問 { continue; } ++nLack; if (vacant != -1) // 找到空閒位 { mem.at(vacant) = head; this->addInfo(); continue; } else { mem.at(queueHead) = head; queueHead = (queueHead + 1) % mem.size(); this->addInfo(); // 顯示記憶體情況 } } std::cout << "缺頁率:" << (double)nLack/nTotal * 100 << "%" << std::endl; } void PageReplacement::addInfo() const { std::cout << mem.at(0) << " " << mem.at(1) << " " << mem.at(2) << std::endl; }
#include <iostream>
#include "PageReplacement.h"
int main()
{
PageReplacement pageReplacement;
pageReplacement.FIFO();
return 0;
}