1. 程式人生 > >FIFO先進先出置換演算法

FIFO先進先出置換演算法

演算法過程:

將記憶體塊陣列視為佇列,在實現的過程中,初始化時,隊頭指標指向第一個記憶體塊位置,隊尾指標指向最後一個記憶體塊位置。每次進行頁面置換時,演算法總置換當前隊頭,並且,隊頭指標迴圈加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;
}