作業系統儲存管理實驗:最近最少使用LRU(Least Recently Used)

Pikachu~發表於2020-12-19

1. 設計思路

使用c++棧函式
最近使用的放在棧頂,最久未使用的處於棧底。

  1. 判斷棧內是否為空(判斷當前頁框中有沒有頁面)
  2. 為空->直接入棧
  3. 不為空->通過輔助棧對主棧內容進行遍歷
  4. 有相同的,將原棧中的頁面刪除,將新進的頁面放在棧頂,從而確保最近使用過的頁面處於棧頂
  5. 沒有相同的,將棧底元素刪除,將新進頁面放在棧頂,從而將最久未使用的刪除並確保最近使用過的頁面處於棧頂

2. 程式碼

/*最近最少使用LRU
* 將最近使用的放在棧頂
*/
#include <iostream>
#include<stack>
#include<vector>
using namespace std;

int main()
{
	int physical_block_num; // 物理塊數量
	int page_num; //頁面數
	int page_no;  //頁面號
	stack<int, vector<int>>s1;  //主棧
	stack<int, vector<int>>s2;  //輔助棧
	cout << "請輸入物理塊數量:";
	cin >> physical_block_num;
	cout << "請輸入頁面數量:";
	cin >> page_num;
	for (int i = 0; i < page_num; i++)
	{
		int state = 0;  //標記棧中有沒有相同的
		cin >> page_no;
		if (s1.empty())  //為空直接入棧
		{
			s1.push(page_no);
			cout << "*";
		}
		else {
			while (!s1.empty())
			{
				if (page_no == s1.top()) {   //有相同的
					cout << "-";
					s1.pop();  //把相同的丟掉
					while (!s2.empty())
					{
						s1.push(s2.top()); //把s2中的放回來
						s2.pop();
					}
					s1.push(page_no); //把最新加入的放到棧頂,保證最新使用過的在上面
					state = 1;
					break;
				}
				else {
					s2.push(s1.top());   //把s1中的元素放入s2中
					s1.pop();  //把換到s2中的,刪除
				}
			}
			if (state == 0) {  //如果沒有相同的,s1中的元素會被全部換到s2中
				if (s2.size() == physical_block_num)  //判斷需不需要把原來棧中的內容刪除
				{
					s2.pop();  //先把s2中的第一個刪除,第一個是最久未使用的
					while (!s2.empty()) {
						s1.push(s2.top());  //把s2中的其他元素放入s1中
						s2.pop();           //把s2中放入s1中的元素刪除
					}
					s1.push(page_no);  //把最新新增進來的放在最上面
					cout << "*";
				}
				else {
					while (!s2.empty()) {
						s1.push(s2.top());  //把s2中的其他元素放入s1中
						s2.pop();  //把s2中放入s1中的元素刪除
					}
					s1.push(page_no);  //把最新新增進來的放在最上面
					cout << "*";
				}
			}
			
		}
		while (!s1.empty())
		{
			cout << s1.top();
			s2.push(s1.top());
			s1.pop();
		}
		while (!s2.empty())
		{
			s1.push(s2.top());
			s2.pop();
		}
		cout << endl;
	}
}
/*test data
3
20
9 2 3 4 2 5 2 6 4 5 2 5 4 3 4 2 3 9 2 3
*/

3. 測試資料

3
20
9 2 3 4 2 5 2 6 4 5 2 5 4 3 4 2 3 9 2 3
在這裡插入圖片描述

相關文章