计算机操作系统:实验三存储管理程序设计

news2025/7/22 23:31:12

一、目的和要求

  • 目的

存储管理的主要功能之一是合理地分配主存空间。请求页式管理是一种常用的虚拟存储管理技术。

本实验的目的是通过请求页式存储管理中页面置换算法的模拟设计,来了解虚拟存储技术的特点,掌握请求页式存储管理的页面置换算法。

  • 要求

模拟页式虚拟存储管理中硬件的地址转换和缺页中断的处理过程,并用先进先出调度算法(FIFO)处理缺页中断。

二、提示

  1. 为了装入一个页面而必须调出一页时,如果被选中调出的页面在执行中没有修改过,则不必把该页重新写到磁盘上(因磁盘上已有副本)。因此,在页表中可以增加是否修改过的标志,当执行“存”指令、“写”指令时把对应页的修改标志置成“1”,表示该页修改过,否则为“0”,表示该页未修改过。页表格式如表3-1所示。

表3-1   页表格式

  页  号

  标  志

   主存块号

   修改标志

   磁盘上的位置

  1. 设计一个地址转换程序来模拟硬件的地址转换和缺页中断处理过程。当访问的页在主存时则形成绝对地址,但不去模拟指令的执行,可用输出转换后的绝对地址来表示一条指令已完成。当访问的页不在主存时则输出“*该页页号”来表示硬件产生了一次缺页中断。模拟地址转换的程序流程如图3-1所示。
  2. 编制一个FIFO页面调度程序。FIFO页面调度算法总是先调出作业中最先进入主存的那一页,因此,可以用一个数组来构成页号队列。数组中每个元素是该作业已在主存的页面号,假定分配给作业的主存块数为m,且该作业开始的m页已装入主存,则数组可由m个元素组成:

P[0],P[1],…,P[m-1]

它们的初值为

P[0]∶=0,P[1]∶=1,…,P[m-1]∶= m-1

用一指针k指示当要装入新页时应调出的页在数组的位置,k的初值为“0”。

当产生缺页中断后,操作系统总是选择P[k]所指出的页面调出,然后执行

P[k]∶=要装入的新页页号

k∶=(k+1)mod m

在实验中不必实际地启动磁盘执行调出一页和装入一页的工作,而用输出“OUT调出的页号”和“IN要装入的新页页号”来模拟一次调出和装入的过程。模拟程序的流程见图3-1。

  1. 假定主存的每块长度为1024个字节,现有一个共7页的作业,其副本已在磁盘上。系统为该作业分配了4块主存块,且该作业的第0页至第3页已经装入主存,其余3页尚未装入主存,该作业的页表见表3-2所示。

表3-2    作业的页表

   页号

   标志

   主存块号

   修改标志

   在磁盘上的位置

    0

    1

      5

      0

         011

    1

    1

      8

      0

         012

    2

    1

      9

      0

         013

    3

    1

      1

      0

         021

    4

    0

      0

         022

    5

    0

      0

         023

    6

    0

      0

         121

如果该作业依次执行的指令序列如表3-3所示。 

表3-3   作业依次执行的指令序列

   操作

   页号

  页内地址

   操作

   页号

  页内地址

    +

     0

    070

   移位

     4

    053

    +

     1

    050

    +

     5

    023

    ×

     2

    015

    存

     1

    037

    存

     3

    021

    取

     2

    078

    取

     0

    056

    +

     4

    001

    -

     6

    040

    存

     6

    084

依次执行上述的指令序列来调试你所设计的程序(仅模拟指令的执行,不必考虑指令序列中具体操作的执行)

  1. 为了检查程序的正确性,可自行确定若干组指令序列,运行设计的程序,核对执行结果。
#include<iostream>
#include<queue>
#include<map>
using namespace std;
#define PAGE_NUM 7
#define BLOCK_NUM 4
struct PageTable{
	int id;
	int flag;
	int mainMemory;
	int isModefy;
	int diskPos; 
}pageTable[PAGE_NUM];
int mainBlock[BLOCK_NUM]={5,8,9,1};
int order[BLOCK_NUM];
int page[BLOCK_NUM];
void printInfo()
{
	cout<<"页号\t\t\t标志\t\t\t主存块号\t\t修改标志\t\t磁盘位置"<<endl;
	for(int i=0;i<PAGE_NUM;i++){
		cout<<pageTable[i].id<<"\t\t\t"<<pageTable[i].flag
		<<"\t\t\t"<<pageTable[i].mainMemory<<"\t\t\t"<<pageTable[i].isModefy<<"\t\t\t"<<pageTable[i].diskPos<<endl;
	}
}

void init(){
	for(int i=0;i<BLOCK_NUM;i++){
		order[i] = i;
		page[i] = i;
	}
	for(int i=0;i<PAGE_NUM;i++){
//		freopen("in.txt","r",stdin);
		cin>>pageTable[i].id>>pageTable[i].flag>>pageTable[i].mainMemory>>pageTable[i].isModefy>>pageTable[i].diskPos;
	}
}



int isHit(int pageId){
	for(int i=0;i<BLOCK_NUM;i++){
		if(pageTable[i].flag == 1){
			cout<<"命中"<<endl;
			return i;
		}
	}
	return -1;
}
void fifo(int pageId){
	cout<<"调出页"<<pageTable[page[order[0]]].id<<"释放主存块"<<mainBlock[page[order[0]]]<<endl;
	pageTable[page[order[0]]].flag = 0; 
	pageTable[page[order[0]]].isModefy = 0;
	pageTable[page[order[0]]].flag = 0;
	pageTable[page[order[0]]].mainMemory = -1;
	if(pageTable[page[order[0]]].isModefy == 1){
	
		cout<<"该调出页已经被修改,需要重新写出"<<endl;
		
	}
	int t = order[0];
	for(int i=1;i<BLOCK_NUM;i++){
		order[i-1] = order[i];
	}
	order[BLOCK_NUM-1] = t;
//	调入
	page[order[BLOCK_NUM-1]] = pageId;
	pageTable[pageId].flag = 1;
	pageTable[pageId].mainMemory = mainBlock[order[BLOCK_NUM-1]];
}
void execute(){
	char op;
	while(cin>>op&&op!='#'){
		int pageId;
		int pageAddress;
		cin>>pageId>>pageAddress;
		if(pageId >= PAGE_NUM){
			cout<<"页号大于页数,请重新输入"<<endl;
			continue;
		}
		
		if(pageTable[pageId].flag == 1){
			cout<<"经地址变换后,该指令的形式为"<<endl<<endl;
			cout<<"操作数"<<"\t"<<"页号"<<"\t"<<"绝对地址"<<endl;
			cout<<op<<"\t"<<pageId<<"\t"<<pageAddress+pageTable[pageId].diskPos<<endl<<endl;
			if(op == 'd' || op == 'w'){
				pageTable[pageId].isModefy = 1;
			}
		}else{
			fifo(pageId);
		}
		printInfo();
	}
}
int main()
{
	init();
	execute();
	
	return 0;
 } 

For this problem ,just simulate the process of page managament.The requirement of this experiment is FIFO,which means that the page will be transfered out is which is transfered in fristly.

The datastructure is a page table ,which comprise some kinds of information.

struct PageTable{
    int id;
    int flag;
    int mainMemory;
    int isModefy;
    int diskPos; 
}pageTable[PAGE_NUM];

id -->the id of page.

flag -->identify wether the page is in mainMemory

mainMemory -->if flag == 1,then mainMemory show the block number,else display -1;

isModefy --> a flag that show the state whether the page has been modefied.

diskPos-->show the position where page in the disk(not memory);

See function init();

       just init the infomation,input 

function isHit();

       when user input a instruction ,like + 0 70.

       this function will judge wether the block 0 is in mainmemory.If so ,return a value 1,else return 0(false);

function printInfo();

       just print the information of current state ,display all infomation.

function fifo();

        this is the core function of this procedure.This function will be called when that function isHit() return a value 0,Which means there is no free block so that OS must transter out a block.

Red circle is my logic design,I use three arrays to realize the process.

mainBlock stroge the block bumber .

page stroge the page number ,which in the main memory.

due to the algorithm fifo,we should confirm the order of page.So I add a array name order to point the opder of page .

It may be a little difficult to comprehense other's producure.But ,come on.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/394984.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数字工厂管理系统的应用案例

数字工厂管理系统是制造企业应用数字化工厂技术实现研发设计数字化、生产准备数字化、 生产制造数字化、运营管理数字化和营销服务数字化的重要手段&#xff0c;即通过应用数字相关技术提升产品全生命周期数字化水平&#xff0c;从而提升企业经营的可靠性、安全性和经济性。 任…

C++回顾(十)—— 多态

10.1 问题引出 10.1.1 如果子类定义了与父类中原型相同的函数会发生什么&#xff1f; 函数重写 在子类中定义与父类中原型相同的函数&#xff0c;函数重写只发生在父类与子类之间 重载与重写区别&#xff1a; &#xff08;1&#xff09;重载&#xff1a;同一个作用域&#xf…

A、力扣刷题——数组

提示&#xff1a;这是力扣上数组类题目里的简单题&#xff0c;按顺序做下来的23道题。 第一题&#xff1a; 关键词&#xff1a;原地修改&#xff0c;有序数组 我的答案&#xff1a; &#xff08;for循环&#xff09; &#xff08;1&#xff09;有序数组 class Solution{pu…

平安大视野前瞻2023投资策略:资产格局“危中有机”,关注科技、绿色、安全领域

3月3日&#xff0c;平安私人银行全新云端沙龙《平安大视野》第一站在杭州举办&#xff0c;活动聚焦2023年宏观经济展望&#xff0c;邀请中国首席经济学家论坛理事、鹏扬基金首席经济学家陈洪斌&#xff0c;平安私人银行首席策略分析师彭伟伟就国内外宏观经济变化和资产配置策略…

干货系列:高通量测序后的下游实验验证方法——m6A RNA甲基化篇|易基因

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。此前&#xff0c;我们分享了m6A RNA甲基化研究的数据挖掘思路&#xff08;点击查看详情&#xff09;&#xff0c;进而筛选出m6A修饰目标基因。做完MeRIP-seq测序后&#xff0c;如果需要对分…

【JavaWeb】Servlet详解

文章目录1. 前置知识2.servlet生命周期2.1 默认情况下&#xff0c;服务器启动时&#xff0c;servlet对象并没有被创建2.2 用户执行一次请求2.3用户执行第二次请求2.4 3,4,5,6....次请求2.5 关闭服务器3.servlet方法解析4.适配器模式改造servlet4.1不使用servlet模式4.2使用适配…

【微服务】(十五)—— Seata 的部署和集成

文章目录1. 部署Seata的tc-server1.1 下载Seata1.2 解压1.3 修改配置1.4 在nacos添加配置1.5 创建数据库表1.6 启动TC服务2. 微服务集成seata2.1 引入依赖2.2 修改配置文件3. TC服务的高可用和异地容灾3.1 模拟异地容灾的TC集群3.2 将事务组映射配置到nacos3.3 微服务读取nacos…

软测入门(八)Selenium项目实战

自动化项目实战 项目计划设计 测试计划测试范围设定目标规划活动 实际项目中&#xff0c;需要根据项目的实际情况创建自己的项目计划&#xff0c;没有固定的格式和内容要求&#xff1a; 项目简介自动化实现网上购票项目启动前置条件1.购票网站工作正常 2.自动化测试环境准备…

JAVA的16 个实用代码优化小技巧

一、类成员与方法的可见性最小化 举例&#xff1a;如果是一个private的方法&#xff0c;想删除就删除。 如果一个public的service方法&#xff0c;或者一个public的成员变量&#xff0c;删除一下&#xff0c;不得思考很多。 二、使用位移操作替代乘除法 计算机是使用二进制…

垒骰子(爆搜/DP)

动态规划方格取数垒骰子方格取数 题目描述 设有 NNN \times NNN 的方格图 (N≤9)(N \le 9)(N≤9)&#xff0c;我们将其中的某些方格中填入正整数&#xff0c;而其他的方格中则放入数字 000。如下图所示&#xff08;见样例&#xff09;: A0 0 0 0 0 0 0 00 0 13 0 …

ChatGPT助力校招----面试问题分享(一)

1 ChatGPT每日一题&#xff1a;期望薪资是多少 问题&#xff1a;面试官问期望薪资是多少&#xff0c;如何回答 ChatGPT&#xff1a;当面试官问及期望薪资时&#xff0c;以下是一些建议的回答方法&#xff1a; 1、调查市场行情&#xff1a;在回答之前&#xff0c;可以先调查一…

Python基础之while循环

一&#xff1a;while语法 while 条件:代码1 代码2 代码3....while的运行步骤&#xff1a; 步骤1&#xff1a;如果条件为真&#xff0c;那么依次执行&#xff1a;代码1、代码2、代码3、...... 步骤2&#xff1a;执行完毕后再次判断条件,如果条件为True则再次执行&#…

通用缓存存储设计实践

目录介绍 01.整体概述说明 1.1 项目背景介绍1.2 遇到问题记录1.3 基础概念介绍1.4 设计目标1.5 产生收益分析 02.市面存储方案 2.1 缓存存储有哪些2.2 缓存策略有哪些2.3 常见存储方案2.4 市面存储方案说明2.5 存储方案的不足 03.存储方案原理 3.1 Sp存储原理分析3.2 MMKV存储…

【数据挖掘】4、关联分析:Apriori、FP-Growth 算法、买面包是否也爱买啤酒

文章目录一、概念1.1 支持度1.2 置信度1.3 提升度二、Apriori 算法2.1 频繁项集的定义2.2 算法工作原理三、FP-Growth 算法3.1 算法步骤3.1.1 创建项头表3.1.2 构造 FP 树3.1.3 通过 FP 树挖掘频繁项集3.2 手动推导3.2.1 计算单一项的频率&#xff08;支持度计数&#xff09;3.…

shusheng007编程手记

[版权申明] 非商业目的注明出处可自由转载 出自&#xff1a;shusheng007 文章目录概述工具篇IntelliJ IDEA在Idea中下载源码时&#xff0c;报无法下载源码PostmanPost请求被识别成Get请求Linux开启关闭防火墙开放端口关闭端口如何修复磁盘Nginx如何使用docker来安装Nginx概述 …

VMware虚拟网络编辑桥接/NAT/仅主机模式详解

VMware虚拟网络编辑 安装VMware后 默认虚拟网络设置&#xff1a; VMnet0&#xff1a;桥接模式 VMnet1&#xff1a;仅主机 VMnet8&#xff1a;NAT模式 可以打开VMware的虚拟网络适配器查看 NAT模式 NAT模式借助虚拟NAT设备和虚拟DHCP服务器&#xff0c;使得虚拟机可以联网…

掌握Swagger3自动化生成接口文档完成后端提效

文章目录OpenApi规范Swagger3快速上手Swagger3使用Swagger3.x常用注解讲解和配置Api 模块配置ApiOperation 接口配置ApiParam 方法参数配置ApiIgnore 忽略此接口ApiModel()和ApiModelProperty()ApiResponse描述接口响应注意可能出现的问题OpenApi规范 开放API规范&#xff08;…

Java内存屏障简介

简介 内存屏障是插入两个CPU命令之间的命令&#xff0c;禁止处理器命令的重新排序(如屏障)&#xff0c;以确保有序性。此外&#xff0c;为了达到屏障的效果&#xff0c;在处理器写入、读取值之前&#xff0c;将主机的值写入缓存&#xff0c;清空无效的队列&#xff0c;保障可见…

C++函数重载及其背后的原理

写在前面 先说说我的状态吧&#xff0c;五一假期五天假&#xff0c;这些天都在玩&#xff0c;很少学习&#xff0c;我不是后悔&#xff0c;也没必要&#xff0c;本来假期就是为了让自己放松.我唯一要反思看到别人在学,我心里也想学但是却做不到,这是我的缺点,后面我会克服的.尽…

运维提质增效,有哪些办法可以做

凡是代码&#xff0c;难免有 bug。 开发者们的日常&#xff0c;除了用一行行代码搭产品外&#xff0c;便是找出代码里的虫&#xff0c;俗称 debug。 随着移动互联网的快速发展&#xff0c;App 已经成为日常生活中不可或缺的一部分。但是在开发者/运维人员的眼里简直就是痛苦的…