动态分页缺页率分析一、实验名称动态分页缺页率分析二、实验目标在地址映射过程中,若在也表中发现所要访问的页面不在内存中,就会发生缺页中断,当发生缺页中断时,如果操作系统内存中没有空闲页面,则操作系统必须在内存选择一个页面将其移出内存,以便为即将调入的页面让出空间。
而用来选择淘汰哪一页的规则叫做页面置换算法。
使用不同的页面置换算法,会影响虚拟系统的性能。
通过实现常用的页面置换算法,理解不同的页面置换算法的含义和实现过程。
三、实验环境要求:1.PC机。
2.Windows。
3.Visual Studio 2017。
四、实验基本原理1.本实验设计一个可执行三种缺页次数计算算法的系统,分别是先进先出页面置换算法,理想页面置换算法、最近最少使用页面置换算法。
2.程序首先给用户提供一个菜单,可选择需要的算法,选择算法后可以输入访问页面序列和内存分配页数,直到输入退出指令后退出当前程序。
3.每种算法选择后都会输出缺页次数。
4.理想页面置换算法,将最远将被访问的页面置换掉,在这里根据页面访问序列确定哪个页面是最远的。
先进先出置换算法,选择置换掉在主存中停留时间最长也就是最先进入内存的页面,在这里用队列实现。
最近最久未被使用,选择在之前一段时间内最久没有被使用的页面进行置换,在这里使用栈的思想来实现,栈顶放目前使用最多,占底放目前最少使用。
五、数据结构设计1.理想页面置换算法中用vector<int>pagetemp用来记录已访问在内存中的页面2.先进先出页面置换算法中,用queue<int>re记录内存中置换后的页面序列,queue<int>pagetemp记录当前已经访问的内存中的页面。
3.最近最少使用页面置换算法,用queue<int>re记录内存中置换后的页面序列,queue<int>pagetemp记录当前已经访问的内存中的页面。
4.用vactor<int>pagewalk 存储要访问的页面序列。
六、流程图七、源代码// 缺页计算系统.cpp: 定义控制台应用程序的入口点。
//#include"stdafx.h"int pages;int suspend;vector <int> pagewalk;void menu() {cout <<"-------------------------------------------------"<< endl;cout <<"| 欢迎来到缺页计算系统 "<< endl;cout <<"| MENU "<< endl;cout <<"| 1.理想页面置换算法 "<< endl;cout <<"| 2.先进先出置换算法 "<< endl;cout <<"| 3.最近最少使用置换算法 "<< endl;cout <<"| 4. 退出 "<< endl;cout <<" -------------------------------------------------"<< endl; }void OPT() {int a[3];suspend = 0;vector<int>pagetemp;for (int sizes = 0; sizes < pagewalk.size(); sizes++) {if (sizes < pages) {pagetemp.push_back(pagewalk[sizes]);suspend++;continue;}int flag = 0;for (int j = 0; j <pagetemp.size(); j++) {if( pagetemp[j] == pagewalk[sizes]){flag = 1;}}if (flag == 0) {a[0] = a[1] = a[2] = -1;suspend++;int flag1 = 0;for (int k = pagewalk.size() - 1; k >sizes; k--) {for (int m = 0; m < pagetemp.size(); m++) {if (pagewalk[k] == pagetemp[m]) {a[m] = k;}}}int temp = 0;if (a[0] == -1) {temp = 0;}else if (a[1] == -1) {temp = 1;}else if (a[2] == -1) {temp = 2;}else {for (int i = 0; i < 3; i++) {if (a[i] >a[temp]) {temp = i;}}}for (int i = temp; i < 2; i++) {pagetemp[i] = pagetemp[i + 1];}pagetemp[2] = pagewalk[sizes];}}cout <<"缺页次数:"<< suspend << endl;}void FIFO() {suspend = 0;queue <int> re;queue <int>pagetemp;suspend = 0;for (int size = 0; size < pagewalk.size(); size++) { if(size < pages) {pagetemp.push(pagewalk[size]);re.push(pagewalk[size]);suspend++;continue;}int falg = 0;for (int j = 0; j < pagetemp.size(); j++) {if (pagetemp.front() == pagewalk[size]) {falg = 1;}pagetemp.pop();}if (falg != 1) {suspend ++;re.pop();re.push(pagewalk[size]);}pagetemp = re;}cout <<"缺页次数:"<< suspend << endl;}void LRU() {suspend = 0;queue <int> re;queue <int>pagetemp;for (int sizes = 0; sizes < pagewalk.size(); sizes++) { if(sizes < pages) {pagetemp.push(pagewalk[sizes]);re.push(pagewalk[sizes]);suspend++;continue;}int falg = 0;re.pop();re.push(pagewalk[sizes]);for (int j = 0; j < pagetemp.size(); j++) {if (pagetemp.front() == pagewalk[sizes]) {falg = 1;}pagetemp.pop();}if (falg != 1) {suspend++;}pagetemp = re;}cout <<"缺页次数:"<< suspend << endl;}int main(){while (1) {menu();int choice, i=0;string str;void menu();pagewalk.clear();cout <<"please input your choice:";cin >> choice;if (choice == 4) {cout <<"Good bye!"<< endl;break;}//cout << choice << endl;cout <<"please input pages queue(\"#\"结束):";getline(cin, str,'#');cout <<"please input pages:";cin >> pages;while (i<str.length()) {if (str.at(i) >= '0'&&str.at(i) <= '9'){int temp = str.at(i) - '0';//cout << temp << endl;pagewalk.push_back(temp);}i++;}switch (choice) {case 1: OPT(); break;case 2: FIFO(); break;case 3: LRU(); break;}}return 0;}八、运行结果九、结果分析针对不同的页面置换算法给出的页面访问序列都可以得出正确的缺页次数,但是可以使用更加长的页面访问序列进行测试。
十、本次实验体会熟悉了不同的页面置换算法,加强了不同的页面置换算法的优劣会影响虚拟系统的性能的理解。