操作系统实验3—实现请求页式存储管理模拟程序

操作系统实验3—实现请求页式存储管理模拟程序

实验描述

实验内容:

编写一个请求页式存储管理程序,模拟请求页式存储管理方式下的内存分配和页面置换。

实验目的:

内存管理是操作系统中的核心模块,能够合理利用内存,在很大程度上将影响到整个计算机系统的性能。内存的分配和回收与内存管理方式有关。本实验要求学生独立设计并实现请求页式存储管理方式下的内存分配与页面置换模拟程序,以加深对页面置换算法和请求页式存储管理方式的理解。

实验要求:

  1. 可以随机输入分配给一个进程的内存块数,以及该进程的页面访问序列,具体信息见测试用例格式输入部分说明。
  2. 分别采用最佳算法OPT(当有多个页面可置换时,按照先进先出原则进行置换)、先进先出算法FIFO和最近最少使用算法LRU进行页面置换,其中LRU算法采用栈式方法实现。
  3. 显示页面变化时内存块装入页面列表的详细情况,并显示是否产生页面置换,并计算缺页次数及缺页率。具体信息见测试用例格式输出部分说明。

测试用例格式如下:

输入:

算法(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];//内存序列,临时数组

程序概要设计如下图所示:
概要设计

  1. main()函数是主程序的入口,控制程序流程,并按照输入的调度信号选择相应的算法模块进行运行
  2. input()函数是输入函数,接受程序输入
  3. output()函数是输出函数,将页面命中与缺页置换的信息进行输出
  4. OPT()函数是最佳置换算法,根据已知的页面序列和优先级顺序算出最佳的页面调度方案
  5. FIFO()函数是先进先出算法,根据页面的到来顺序进行页面置换
  6. 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)
	
假设每个页面中可存放10条指令,分配给作业的内存块数为4。 用C语言语言模拟一个作业的执行过程,该作业共有320条指令, 即它的地址空间为32,目前它的所有都还未调入内存。在模拟过程中,如果所访问的指令已在内存,则显示其物理地址,并转下一条指令。如果所访问的指令还未装入内存,则发生缺,此时需要记录缺的次数,并将相应调入内存。如果4个内存块均已装入该作业,则需要进行页面置换,最后显示其物理地址,并转向下一条指令。在所有320条指令执行完毕后,请计算并显示作业运行过程中发生的缺率。 置换算法:请分别考虑最佳置换算法(OPT)、先进先出(FIFO)算法和最近最久未使用算法(LRU)。 作业中指令的访问次序按下述原则生成: 50%的指令是顺序执行的; 25%的指令是均匀分布在前地址部分; 25%的指令是均匀分布在后地址部分; 具体的实施方法是:    在[0,319]的指令地址之间随机选取一起点m;    顺序执行下一条指令,即执行地址序号为m+1的指令;    通过随机数,跳转到前地址部分[0,m+1]中的某条指令处,其序号为m1;    顺序执行下一条指令,其地址序号为m1+1的指令;    通过随机数,跳转到后地址部分[m1+2,319]中的某条指令处,其序号为m2;    顺序执行下一条指令,其地址序号为m2+1的指令; 重复跳转到前地址部分,顺序执行,跳转到后地址部分,顺序执行的过程直至执行320条指令。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值