目录
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. 增加性能优化:优化代码逻辑、数据结构和算法,提高模拟器的性能和稳定性,使其能够处理更大规模的页面调度模拟。