1.目的和要求
存储管理的主要功能之一是合理的分配空间。请求页式管理是一种常用的虚拟存储管理技术。本实验的目的是:通过编写和调试请求页式存储管理中页面置换算法的模拟程序以加深对存储管理方案的理解,了解虚拟存储技术的特点,掌握请求页式存储管理的页面置换方法。
2.实验内容
阅读教材《计算机操作系统》第四章,掌握存储器管理相关概念和原理。
编写程序模拟实现页式虚拟存储管理的最佳页面置换算法。
前提:
(1)页面分配采用固定分配局部置换。
(2)作业的页面走向和分得的物理块数预先指定。可以从键盘输入也可以从文件读入。
(3)置换算法的置换过程输出可以在显示器上也可以存放在文件中,但必须清晰可读,便于检验。
3.设计思想
(1)数据结构
要模拟实现某一个置换算法,有如下一些对象需要用相关的数据结构来描述:
作业的页面走向(执行过程中对页面的访问顺序)。使用对象数组,页面走向的长度用全局变量pagenumber限制。
页框(作业分得的物理块)。由于作业分得的物理块数在置换算法执行之前已经确定故可以利用函数加以实现。在置换算法的实现中,可以灵活采用相应的数据结构(如对象数组),尽可能使程序的时间复杂度最低。同时采用对象指针来配合对象数组使用。
(2)功能模块划分
大体上可以将整个程序的模块划分成如下几个部分:
1)主模块:主要是初始化、界面和模块调用。
2)页面走向输入模块。
(从键盘读入数据结构或将页面走向写入文件或随机生成数据)
3)置换算法模块。
* 判断模块。决定换出哪一块。每一种置换算法对应一种判断算法。
* 置换过程输出模块(在显示器上显示或写入文件)。该模块每发生一次置换,由置换算法模块调用一次。
(3)详细设计
Pageinformation类包括以下字段:
- pid(页号)
- count(统计驻留在物理块中的次数)
Pageinformation类包括以下方法:
- void setpid(PageInformation *headptrblock,int pid) 修改物理块对象数组成员pid
- void setpidrand(PageInformation *headptr,int pid) 修改页面对象数组成员pid
- void display() 显示页面号
- void setpid() 选择从键盘输入时设置对象数组成员pid
- void counter() 访问页面次数+1
- void resetcount() 访问页面次数置0
- int getpid() 返回页面号
- int getcount() 返回访问次数
主函数int main(int argc,char **argv)中包括以下全局变量:
- pagenum 页框数-物理块数
- pagenumber 页面数量
- pagecounter 不缺页页面数量
主函数int main(int argc,char **argv)中包括以下函数:
- void Directloading(PageInformation *&headptr,PageInformation *&headptrblock,int pagenum)
直接将前三个页面装入物理块中 - void OPT(PageInformation *headptr,PageInformation *headptrblock,int pagenum,int pagenumber,int &pagecounter)
最佳置换算法 - void LRUandFIFO(PageInformation *headptr,PageInformation *headptrblock,int pagenum,int pagenumber,int &pagecounter)
最近最久未使用算法和先进先出算法
本程序实现了3中方式来读取数据:
- 从键盘读取数据
- 从文件读取数据
- 随机生成数据
同时还包括以下内容:
- 运用了对象指针链表作为主要的数据结构。
- 运用#include 头文件中的time_t Time; time(&Time);操作实现时间实时显示。
- 利用do-while循环与switch选择实现了菜单式界面
- 利用#include <windows.h>中system(“cls”);函数实现清屏操作,增加界面演示效果。
- 利用#include 格式化控制输出流
- 利用srand((unsigned) time (&Time));//srand((unsigned) time (NULL));生成随机种子,通过rand()函数生成随机数。
5.源代码
/* F:\debug\c++debug\OperatingSystem\PageReplacementAlgorithm.cpp */
// author:1045263694@qq.com
#include <iostream>
#include <iomanip>
#include <string>
#include <ctime>
#include <windows.h>
#include <fstream>
using namespace std;
//以下是页面信息类的定义
class PageInformation
{
protected:
int pid; //页号
int count; //统计驻留在物理块中的次数(时间),初始为0
public:
PageInformation(){
count=0;} //默认构造函数,驻留在页面的时间初始化为0
PageInformation(PageInformation &p)
{
p.pid=pid;
p.count=count;
}
virtual ~PageInformation(){
}
void setpid(PageInformation *headptrblock,int pid)//修改物理块对象数组成员pid
{
headptrblock->pid=pid;
}
void setpidrand(PageInformation *headptr,int pid)//修改页面对象数组成员pid
{
headptr->pid=pid;cout<<pid<<" ";
}
void display()
{
cout<<pid<<" ";
//cout<<pid;
}
void setpid()//选择从键盘输入时设置对象数组成员pid
{
int pidtemp;
cout<<"请输入您的页号(范围1-9):";
cin>>pidtemp;
this->pid=pidtemp;
}
void counter()
{
count++;
}
void resetcount()
{
count=0;
}
int getpid()
{
return pid;
}
int getcount()
{
return count;
}
};//PageInformation
void Directloading(PageInformation *&headptr,PageInformation *&headptrblock,int pagenum)//直接将前三个页面装入物理块中
{
int temp;
for(int i=0;i < pagenum;i++)//直接将符合物理块数大小的页面装入物理块中
{
(headptrblock+i)->setpid((headptrblock+i),(headptr+i)->getpid());
temp=i+1;
for(int j=0;j < temp;j++)
(headptrblock+j)->counter();//对应物理块驻留时间++
}
cout<<"原始各物理块页号为:"<<"\t\t";
for(i = 0;i <