操作系统实验3—实现请求页式存储管理模拟程序
实验描述
实验内容:
编写一个请求页式存储管理程序,模拟请求页式存储管理方式下的内存分配和页面置换。
实验目的:
内存管理是操作系统中的核心模块,能够合理利用内存,在很大程度上将影响到整个计算机系统的性能。内存的分配和回收与内存管理方式有关。本实验要求学生独立设计并实现请求页式存储管理方式下的内存分配与页面置换模拟程序,以加深对页面置换算法和请求页式存储管理方式的理解。
实验要求:
- 可以随机输入分配给一个进程的内存块数,以及该进程的页面访问序列,具体信息见测试用例格式输入部分说明。
- 分别采用最佳算法OPT(当有多个页面可置换时,按照先进先出原则进行置换)、先进先出算法FIFO和最近最少使用算法LRU进行页面置换,其中LRU算法采用栈式方法实现。
- 显示页面变化时内存块装入页面列表的详细情况,并显示是否产生页面置换,并计算缺页次数及缺页率。具体信息见测试用例格式输出部分说明。
测试用例格式如下:
输入:
算法(1--OPT,2--FIFO,3--LRU)
内存块数
页面序列(页面1,页面2,页面3,...)
输出:
页面变化时内存块装入页面列表1-是否命中/页面变化时内存块装入页面列表2-是否命中/...
缺页次数
其中:
页面变化时内存块装入页面列表:
(1) 内存块1装入页面,内存块2装入页面,内存块3装入页面...,未装入任何页面时由"-”表示
(2) 是否命中:1-命中,0-缺页
测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 | |
---|---|---|---|---|---|
测试用例 1 | 1 3 1,2,3,4,1,2,5,1,2,3,4,5 |
1,-,-,0/1,2,-,0/1,2,3,0/1,2,4,0/1,2,4,1/1,2,4,1/1,2,5,0/1,2,5,1/1,2,5,1/3,2,5,0/3,4,5,0/3,4,5,1 7 |
1秒 | 64M | 0 |
测试用例 2 | 2 4 1,2,3,4,1,2,5,1,2,3,4,5 |
1,-,-,-,0/1,2,-,-,0/1,2,3,-,0/1,2,3,4,0/1,2,3,4,1/1,2,3,4,1/5,2,3,4,0/5,1,3,4,0/5,1,2,4,0/5,1,2,3,0/4,1,2,3,0/4,5,2,3,0 10 |
1秒 | 64M | 0 |
测试用例 3 | 3 3 1,2,3,4,1,2,5,1,2,3,4,5 |
1,-,-,0/1,2,-,0/1,2,3,0/2,3,4,0/3,4,1,0/4,1,2,0/1,2,5,0/2,5,1,1/5,1,2,1/1,2,3,0/2,3,4,0/3,4,5,0 10 |
1秒 | 64M | 0 |
设计思路
虽然每次输入的页面数据只有页面序号,但是在算法中需要计算每个页面访问过之后的优先级变化,以及当前页面下一次访问所需要的距离信息,所以采用结构体数组的形式将需要用到的信息全部存储起来。
临时数组在 LRU 算法中起辅助输出的作用。
struct Memory
{
int id; //序号
int priority; //最前面的内存优先级为0,往后依次加1
int distance; //下次访问与当前距离
}memory[1010], memory2[1010];//内存序列,临时数组
程序概要设计如下图所示:
- main()函数是主程序的入口,控制程序流程,并按照输入的调度信号选择相应的算法模块进行运行
- input()函数是输入函数,接受程序输入
- output()函数是输出函数,将页面命中与缺页置换的信息进行输出
- OPT()函数是最佳置换算法,根据已知的页面序列和优先级顺序算出最佳的页面调度方案
- FIFO()函数是先进先出算法,根据页面的到来顺序进行页面置换
- LRU()函数是最近最久未使用算法,根据页面的使用情况进行页面调度,这里使用了临时数组来辅助信息输出
int main(); //主程序入口
void input(); //输入函数
void output(int k);//输出函数
void OPT(); //最佳置换算法
void FIFO(); //先进先出算法
void LRU(); //最近最久未使用算法
上机代码
代码使用 C++ 语言进行编写
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<string>
using namespace std;
struct Memory
{
int id;//序号
int priority;//最前面的内存优先级为0,往后依次加1
int distance;//下次访问与当前距离
}memory[1010], memory2[1010];//内存序列,临时数组
int que[1010];//页面序列
void input();//输入函数
void output(int k);//输出函数
void OPT();//最佳置换算法
void FIFO();//先进先出算法
void LRU();//最近最久未使用算法
int sig;//算法选择标志
int memoryk, num, total;//内存块数,页面数量,缺页次数
int pageFlag;//缺页标志
const int isPage = 1;//命中
const int noPage = 0;//缺页
int main()
{
//程序输入
input();
//选择算法
switch (sig)