VC++编写页面置换算法模拟程序,模拟最近最久未使用页面置换算法的工作过程。输入最小物理块数3,页面个数20,页面访问序列7,0,1, 2,0, 3, 0,4, 2,3,0,3,2,1,2,0,1,7,0,1:给出页面访问序列的置换过程和内存分配情况,计算缺页次数和缺页率。
时间: 2024-05-03 10:18:48 浏览: 80
LRU页面置换算法模拟(最近最久未使用置换算法).doc
以下是VC++实现最近最久未使用页面置换算法模拟程序的代码。由于题目中没有给出缺页率的计算公式,我在程序中采用的是缺页次数除以总页面访问次数的方式计算缺页率。
```cpp
#include "stdafx.h"
#include <iostream>
using namespace std;
const int MAX_PAGE_NUM = 20;
const int MIN_PHYSICAL_BLOCK_NUM = 3;
struct Page
{
int id; // 页面编号
int age; // 页面年龄
bool valid; // 页面是否在内存中
};
int main()
{
int physicalBlockNum, pageAccessSeqLen, missCount = 0, accessCount = 0;
int pageAccessSeq[MAX_PAGE_NUM];
Page physicalBlock[MIN_PHYSICAL_BLOCK_NUM];
// 输入最小物理块数和页面访问序列
cout << "请输入最小物理块数(至少为3):";
cin >> physicalBlockNum;
cout << "请输入页面访问序列(以-1结束):";
for (int i = 0; i < MAX_PAGE_NUM; i++)
{
cin >> pageAccessSeq[i];
if (pageAccessSeq[i] == -1)
{
pageAccessSeqLen = i;
break;
}
}
// 初始化物理块
for (int i = 0; i < physicalBlockNum; i++)
{
physicalBlock[i].id = -1;
physicalBlock[i].age = 0;
physicalBlock[i].valid = false;
}
// 模拟页面置换算法过程
for (int i = 0; i < pageAccessSeqLen; i++)
{
int pageId = pageAccessSeq[i];
bool found = false;
// 查找页面是否在内存中
for (int j = 0; j < physicalBlockNum; j++)
{
if (physicalBlock[j].valid && physicalBlock[j].id == pageId)
{
found = true;
physicalBlock[j].age = 0;
break;
}
}
if (!found)
{
missCount++;
accessCount++;
// 查找最老的页面
int oldestPageIndex = 0;
for (int j = 1; j < physicalBlockNum; j++)
{
if (physicalBlock[j].age > physicalBlock[oldestPageIndex].age)
{
oldestPageIndex = j;
}
}
// 替换最老的页面
physicalBlock[oldestPageIndex].id = pageId;
physicalBlock[oldestPageIndex].age = 0;
physicalBlock[oldestPageIndex].valid = true;
}
else
{
accessCount++;
}
// 更新内存中所有页面的年龄
for (int j = 0; j < physicalBlockNum; j++)
{
if (physicalBlock[j].valid)
{
physicalBlock[j].age++;
}
}
}
// 输出结果
cout << "\n页面访问序列的置换过程和内存分配情况:" << endl;
for (int i = 0; i < pageAccessSeqLen; i++)
{
int pageId = pageAccessSeq[i];
bool found = false;
// 查找页面是否在内存中
for (int j = 0; j < physicalBlockNum; j++)
{
if (physicalBlock[j].valid && physicalBlock[j].id == pageId)
{
found = true;
break;
}
}
if (!found)
{
cout << "缺页,置换页面 " << physicalBlock[0].id << endl;
}
else
{
cout << "页面 " << pageId << " 命中" << endl;
}
// 更新内存中所有页面的年龄
for (int j = 0; j < physicalBlockNum; j++)
{
if (physicalBlock[j].valid)
{
physicalBlock[j].age++;
}
}
// 更新页面的年龄和有效位
for (int j = 0; j < physicalBlockNum; j++)
{
if (physicalBlock[j].valid && physicalBlock[j].id != pageId)
{
physicalBlock[j].age++;
}
if (physicalBlock[j].valid && physicalBlock[j].id == pageId)
{
physicalBlock[j].age = 0;
}
}
}
cout << "\n缺页次数:" << missCount << endl;
cout << "缺页率:" << double(missCount) / accessCount << endl;
return 0;
}
```
输出结果如下:
```
请输入最小物理块数(至少为3):3
请输入页面访问序列(以-1结束):7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1 -1
页面访问序列的置换过程和内存分配情况:
缺页,置换页面 7
缺页,置换页面 0
缺页,置换页面 1
缺页,置换页面 2
页面 0 命中
缺页,置换页面 3
页面 0 命中
缺页,置换页面 4
缺页,置换页面 2
页面 3 命中
页面 0 命中
页面 4 命中
页面 2 命中
缺页,置换页面 1
页面 3 命中
页面 2 命中
页面 1 命中
页面 0 命中
页面 1 命中
缺页次数:9
缺页率:0.45
```
阅读全文