赞
踩
【注】本代码数据及思路方法参考自《计算机操作系统(第四版)》汤小丹等 编著的教材。
#include <iostream> int accessPage[20] = { 7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1 }; int flagFIFO[3] = { -1, -1, -1 }; // 用来在FIFO算法中标记三个物理块装入页面的时间 int physicalBlock[3] = { -1,-1,-1 }; // 3个物理块,初始化物理块装入为空 // 先进先出置换算法 bool FIFO(int page) { int i; //标识物理块号 for (i = 0; i < 3; i++) { if (flagFIFO[i] == -1) //判断该物理块是否为空物理块 break; //如果当前物理块为空物理块,则证明后面的物理块都为空物理块,需要装入页面。 else flagFIFO[i]++; //该物理块不为空物理块,需将页面驻留时间+1 if (physicalBlock[i] == page) // 判断页面是否在内存中 { for (int j = i+1; j < 3; j++) // 将后面的有页面的物理块的驻留时间+1 { if (flagFIFO[j] != -1) flagFIFO[j]++; } return true; //true 代表不换页 } } if (i == 3) //没有空物理块 { int longestStay =flagFIFO[0]; //驻留时间最久 int longestStayNum = 0; //驻留时间最久页面的物理块编号 for (int i = 0; i < 3; i++) //找出驻留时间最久的页面及其所占物理块的编号 { if (flagFIFO[i] > longestStay) { longestStay = flagFIFO[i]; longestStayNum = i; } } physicalBlock[longestStayNum] = page; flagFIFO[longestStayNum] = 0; return false; } else //有空物理快,空物理块号为i { physicalBlock[i] = page; //第i个物理块中放入页面page flagFIFO[i] = 0; //修改页面的驻留时间 return false; } } void FIFOStart() { int RN = 0; //页面置换次数 for (int i = 0; i < 20; i++) { bool b = FIFO(accessPage[i]); printf("%d ", b); if (b==false) //页面发生了置换 { RN++; } } printf("\n缺页次数:%d", RN); double d = (double)RN / 20 * 100; // 计算缺页率 printf("\n缺页率:%.2f%%", d); } int main() { FIFOStart(); }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。