1.实验目的
1)了解虚拟存储技术的特点。
2)掌握请求页式存储管理的页面置换算法,如最佳(Optimal)置换算法、先进先出(Fisrt In First Out)置换算法和最近最久未使用(LeastRecently Used)置换算法。
2.实验要求
1)设计模拟实现OPT、FIFO和LRU页面置换算法中的任意一种。
OPT算法:需要发生页面置换时,算法总是选择在将来最不可能访问的页面进行置换。
FIFO算法:算法总是选择在队列中等待时间最长的页面进行置换。
LRU算法:如果某一个页面被访问了,它很可能还要被访问;相反,如果它长时间不被访问,那么,在最近未来是不大可能被访问的。
2)完成算法代码。
3)运行程序,算出结果。
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
#define MAX_L 1000
#define MAX_M 1000
int m,k;//可用内存块和作业的页面数分别为m和k
int ReqPage[MAX_L],L;//页面走向长度为L
double random() {
static double Seed = 233; //随机种子,在此处可改变初值
Seed = 125.0 * (Seed + 1.0);
Seed = Seed - 8192.0 * (int)(Seed/8192);
return (Seed+0.5)/8192;
}
void CALC_FIFO() {
cout << "FIFO算法\n";
static int PageTable[MAX_M];
int missNum = 0;
for (int i = 0; i<m && i<L; i++) {
PageTable[i] = ReqPage[i];
missNum++;
}
int lastId = 0;
if (L > m) {
for (int i = m; i < L; i++) {
int *pageIt = find(PageTable, PageTable+m, ReqPage[i]);
if (pageIt != PageTable+m) continue;
missNum++;
printf("第%d次缺页,%d换入,%d换出\n",missNum,ReqPage[i],PageTable[lastId]);
PageTable[lastId] = ReqPage[i];
lastId = lastId+1;
if (lastId == m) lastId = 0;
}
}
printf("缺页率%g\n", 1.0*missNum/L);
}
void CALC_LRU() {
cout << "LRU算法\n";
int PageTable[MAX_M];
int LastVisitTime[MAX_M]; //记录最近访问时间
int missNum = 0;
for (int i = 0; i<m && i<L; i++) {
PageTable[i] = ReqPage[i];
LastVisitTime[i] = i;
missNum++;
}
if (L > m) {
for (int i = m; i < L; i++) {
int *pageIt = find(PageTable, PageTable+m, ReqPage[i]);
if (pageIt != PageTable+m) {
LastVisitTime[pageIt - PageTable] = i;
continue;
}
missNum++;
int *minLastVisitIt = min_element(LastVisitTime, LastVisitTime + m);
int pageOutId = minLastVisitIt - LastVisitTime;
printf("第%d次缺页,%d换入,%d换出\n",missNum,ReqPage[i],PageTable[pageOutId]);
PageTable[pageOutId] = ReqPage[i];
LastVisitTime[pageOutId] = i;
}
}
printf("\n缺页率%g\n", 1.0*missNum/L);
}
int main() {
cout << "请分别输入可用内存块m,作业的页面数k,页面走向长度为L\n";
cin >> m >> k >> L;
cout << "随机生成的页面走向为:\n";
for (int i = 0; i < L; i++) {
ReqPage[i] = static_cast<int>(random() * k);
// random()生成0~1, random()*k 向零取整为0~k-1
cout << ReqPage[i]<< " ";
}
puts("");
CALC_FIFO();
CALC_LRU();
return 0;
}
运行之后:
记得关注打赏。