目錄
1.上代碼
2.實現思路?
1.上代碼
#include<iostream>
using namespace std;
//內存塊類
class memory
{
public:void init();void alter(int a, int b);int check_full();int check_old();int check_exist(int a);void run();void refresh();friend int manage(memory *My_Memory, int ans, int a);friend void show(memory *My_Memory, int ans);
private:int page;int time;
};
//為了多次初始化
void memory::init()
{page = 0;time = 0;
}
//修改內存塊保存的頁和時間
void memory::alter(int a, int b)
{page = a;time = b;
}
//檢查該塊是否已被占用
int memory::check_full()
{if (page == 0 && time == 0){return 1;}else{return 0;}
}
//檢查該塊的駐留時間
int memory::check_old()
{return time;
}
//檢查該塊中是否保存了頁a
int memory::check_exist(int a)
{if (page == a){return 1;}else{return 0;}
}
//時間++
void memory::run()
{if (page != 0){time++;}
}
//時間置0
void memory::refresh()
{time = 0;
}
//調度作業
int manage(memory *My_Memory, int ans, int a)
{//檢查內存塊是否已經保存了頁面afor (int i = 0; i < ans; i++){if (My_Memory[i].check_exist(a)){cout << "不發生中斷,頁面" << a << "已在內存塊" << i << "中" << endl;My_Memory[i].refresh();return 1;}}//檢查內存塊是否有空閑頁面for (int i = 0; i < ans; i++){if (My_Memory[i].check_full()){cout << "發生中斷," << "內存塊" << i << "空閑中,頁面" << a << "裝入" << endl;My_Memory[i].alter(a, 0);return 0;}}//找到駐留時間最大的塊,進行替換int max_time = 0;int num = -1;for (int i = 0; i < ans; i++){if (My_Memory[i].check_old()>max_time){max_time = My_Memory[i].check_old();num = i;}}cout << "發生中斷," << "內存塊" << num << "中頁面" << My_Memory[num].page << "被替換,頁面" << a << "裝入" << endl;My_Memory[num].alter(a, 0);return 0;
}
//顯示內存塊當前狀態
void show(memory *My_Memory, int ans)
{cout << "...................................." << endl;cout << "內存塊號";for (int i = 0; i < ans; i++){cout << " |" << i;}cout << "\n頁面號 ";for (int i = 0; i < ans; i++){cout << " |" << My_Memory[i].page;}cout << "\n駐留時間";for (int i = 0; i < ans; i++){cout << " |" << My_Memory[i].time;}cout << "\n....................................\n" << endl;
}
int main()
{cout << "***************************" << endl;cout << "*** 頁面置換算法LRU ***" << endl;cout << "*** 1.設置存儲區塊數 ***" << endl;cout << "*** 2.頁面調度模擬 ***" << endl;cout << "*** 3.缺頁率統計 ***" << endl;cout << "*** 4.退出模擬器 ***" << endl;cout << "***************************" << endl;int ans, aans = 0, nohit = 0;memory My_Memory[100];int flag;while (true){cout << "\n請選擇功能:";cin >> flag;if (flag == 1){//設置存儲區塊數cout << "請輸入存儲區塊數:";cin >> ans;for (int i = 0; i < ans; i++){My_Memory[i].init(); }nohit = 0;aans = 0;}else if (flag == 2){//頁面調度模擬while (true){for (int i = 0; i < ans; i++){My_Memory[i].run();}cout << "請輸入要調入的頁面(輸入0結束):";int a;cin >> a;if (a == 0){break;}aans++;if (!manage(My_Memory, ans, a)){nohit++;}show(My_Memory, ans);}}else if (flag == 3){//缺頁率統計cout << "*****************" << endl;cout << "調度作業 " << aans << "次\n中斷 " << nohit << "次\n缺頁率 " << double(nohit) / aans * 100.00 << "%" << endl;cout << "*****************" << endl;}else if (flag == 4){//退出cout << "成功退出!\n" << endl;break;}}return 0;
}
運行ok的放心 =w=
2.實現思路?
LRU頁面調度算法的代碼實現思路
1. 定義了一個memory類,表示內存塊,包含了一些成員函數和變量用于處理內存塊的操作。
- init():初始化內存塊的頁和時間。
- alter(int a, int b):修改內存塊保存的頁和時間。
- check_full():檢查內存塊是否已被占用。
- check_old():返回內存塊的駐留時間。
- check_exist(int a):檢查內存塊中是否保存了特定頁。
- run():時間增加1。
- refresh():將時間置為0。
- manage()函數:用于調度作業,實現LRU頁面置換算法的核心邏輯。
- 檢查內存塊是否已保存了頁面a,如果是則不發生中斷。
- 檢查是否有空閑內存塊,若有則將頁面a裝入,否則找到駐留時間最長的內存塊進行替換。
- 返回0表示發生中斷,返回1表示不發生中斷。
3. show()函數:用于顯示內存塊的當前狀態,包括內存塊號、頁面號和駐留時間。
4. main()函數:主程序,包含了整個模擬器的交互邏輯。
- 提供了四個功能選項:設置存儲區塊數、頁面調度模擬、缺頁統計以及退出模擬器。
- 用戶選擇不同功能并輸入相應數據,程序會執行相應的操作并顯示結果。
5. 模擬過程:
- 用戶可以設置存儲區塊數,然后模擬頁面調度過程,輸入要調入的頁面來模擬LRU頁面置換算法。
設置存儲區塊數為4,依次調入1、2、3、4號頁面:
調入第五塊時,最久未被使用的頁面1被替換掉:
- 可以統計調度作業次數、中斷次數和缺頁率。
接著,依次訪問頁面3、頁面4、頁面3后,計算缺頁率:
訪問8次,中斷5次,缺頁率計算為62.5%:
6. 代碼通過類的方式封裝了內存塊的操作,提高了代碼的可讀性和可維護性。用戶可以交互式地進行頁面置換算法的模擬和統計。
- 小總結與進一步改進設想
小總結:
以上代碼實現了LRU頁面置換算法的模擬器,可以幫助用戶理解LRU算法的工作原理和在操作系統中的應用。代碼結構清晰,邏輯比較簡單,可以通過用戶輸入進行模擬頁面調度,并統計缺頁率等信息。
進一步改進設想:
1. 引入更多的頁面置換算法:除了LRU算法,可以考慮實現其他常用的頁面置換算法,如FIFO算法、LFU算法等。這樣用戶可以選擇不同的算法進行比較和分析。
2. 添加可視化界面:可以考慮將模擬器的操作界面進行可視化設計,包括圖形化展示內存狀態、頁面調度過程等,讓用戶更直觀地了解算法的工作過程。
3. 支持更復雜的內存管理方案:目前代碼只實現了簡單的內存塊分配和頁面替換,可以考慮添加更復雜的內存管理機制,如頁表、地址轉換等,使模擬器更貼近實際操作系統的內存管理情景。
4. 增加性能優化:優化代碼邏輯、數據結構和算法,提高模擬器的性能和穩定性,使其能夠處理更大規模的頁面調度模擬。