操作系统 | 实验四 存储器管理

一、实验目的

①掌握分页式存储管理地址转换和缺页中断。
②理解虚拟存储器概念。

二、实验内容

1.模拟分页式存储管理中硬件的地址转换和产生缺页中断
分页式虚拟存储系统是把作业信息的副本存放在磁盘上,当作业被选中时,可把作业的开始几页先装入主存且启动执行。为此,在为作业建立页表时,应说明哪些页已在主存,哪些页尚未装入主存。
作业执行时,指令中的逻辑地址指出了参加运算的操作存放的页号和单元号,硬件的地址转换机构按页号查页表,若该页对应标志为“1”,则表示该页已在主存,这时根据关系式“绝对地址=块号×块长+单元号”计算出欲访问的主存单元地址。如果块长为2的幕次,则可把块号作为高地址部分,把单元号作为低地址部分,两者拼接而成绝对地址。若访问的页对应标志为“0”,则表示该页不在主存,这时硬件发“缺页中断”信号,由操作系统按该页在磁盘上的位置,把该页信息从磁盘读出装入主存后再重新执行这条指令。
2.用先进先出(FIFO)页面调度算法处理缺页中断
在分页式虚拟存储系统中,当硬件发出“缺页中断”后,引出操作系统来处理这个中断事件。如果主存中已经没有空闲块,则可用FIFO页面调度算法把该作业中最先进入主存的一页调出,存放到磁盘上,然后再把当前要访问的页装入该块。调出和装入后都要修改页表中对应页的标志。
FIFO页面调度算法总是淘汰该作业中最先进入主存的那一页,因此可以用一个数组来
表示该作业已在主存的页面。假定作业被选中时,把开始的m个页面装入主存,则数组的元素可定为m个。

三、数据结构

//页表信息结构体
struct info
{
bool state;//页标志,1表示该页已在内存,0表示该页不在内存
long block;//块号
long disk;//在磁盘上的位置
bool dirty;//更新标志
bool visit; //访问位
}pagelist[PAGENUM];

1、函数以及功能

函数名称功能描述
void InitEx1()分页式虚拟存储系统初始化
void WorkEx1()拟分页式存储管理中硬件的地址转换和产生缺页中断过程
void InitEx2()用先进先出(FIFO)页面调度算法处理缺页中断的初始化,其中也包含了对于当前的存储期内容的初始化
void WorkEx2()FIFO算法模拟
void option()选择哪种方法进行
void DisplayInfo()信息展示
int main()main函数

四、程序流程图

在这里插入图片描述

图1-地址转换程序流程图

在这里插入图片描述

图2- FIFO页面置换算法程序流程图

五、实验代码

#include<stdio.h>
#include<string.h>
#include <windows.h>

#define PAGENUM 100 	//页数 
#define PAGESIZE 128	//页大小 
#define BLOCKSIZE 4		//假设内存中最多允许M个页面

#define SYSINFO "存储器管理" // 系统信息 
#define AUTHOR "Yrani - 依然" //作者 

/**
* 	@Author: Yrani - 依然
* 	@Date: 2022-04-25 20:00:17
* 	@LastEditTime: 2022-04-28 12:55:00
* 	@keywords: FIFO页面调度算法、缺页中断、地址转换
**/


//页表信息结构体
struct info
{
	bool state;	//页标志,1表示该页已在内存,0表示该页不在内存
	long block;	//块号
	long disk;	//在磁盘上的位置
	bool dirty;	//更新标志
	bool visit; //访问位置
} pagelist[PAGENUM];

long po = 0;	//队列标记s
long P[BLOCKSIZE];	//假设内存中最多允许BLOCKSIZE个页面


//分页式虚拟存储系统初始化
void InitEx1()
{
	memset(pagelist,0,sizeof(pagelist));//内存空间初始化
	pagelist[0].state = 1;
	pagelist[0].block = 5;
	pagelist[0].disk = 011;
	pagelist[1].state = 1;
	pagelist[1].block = 8;
	pagelist[1].disk = 012;
	pagelist[2].state = 1;
	pagelist[2].block = 9;
	pagelist[2].disk = 013;
	pagelist[3].state = 1;
	pagelist[3].block = 1;
	pagelist[3].disk = 021;
}

//模拟分页式存储管理中硬件的地址转换和产生缺页中断过程
void WorkEx1()
{
	bool stop = 0;
	long p = 0, q = 0;
	char s[128];
	while(!stop)
	{
		printf("请输入指令的页号和页内偏移:\n");
		if(scanf("%ld%ld",&p,&q) != 2)
		{
			scanf("%s",&s);
			if(strcmp(s,"exit") == 0)
			{
				//如果输入的为"exit"那么就退出,进入重选页面
				system("cls");
				stop = true;
			}
		}
		else if(p != 0)
		{
			if(pagelist[p].state)
			{
				//如果该页state标志位为1,说明该页在主存中
				printf("绝对地址=%ld\n",pagelist[p].block * PAGESIZE + q);//计算出绝对地址,绝对地址 = 块号*块长(默认128)+单元号
			}
			else
			{
				printf("该页%ld不在页表中,发生了缺页中断\n",p);//如果该页state标志位为0,表示该页不在主存中,则产生了一次缺页中断
			}
		}

	}
}


//以下部分为用先进先出(FIFO)页面调度算法处理缺页中断的初始化,其中也包含了对于当前的存储期内容的初始化
void InitEx2()
{
	po = 0;
	P[0] = 0;
	P[1] = 1;
	P[2] = 2;
	P[3] = 3;//对内存中的4个页面初始化并使目前排在第一位的为0
	memset(pagelist,0,sizeof(pagelist));//内存空间初始化
	pagelist[0].state = 1;
	pagelist[0].block = 5;
	pagelist[0].disk = 011;
	pagelist[1].state = 1;
	pagelist[1].block = 8;
	pagelist[1].disk = 012;
	pagelist[2].state = 1;
	pagelist[2].block = 9;
	pagelist[2].disk = 013;
	pagelist[3].state = 1;
	pagelist[3].block = 1;
	pagelist[3].disk = 021;
}

//FIFO算法模拟
void WorkEx2()
{
    long p = 0;
    long q = 0;
    long i = 0;
    char s[100];
    bool stop = false;
    do
    {
        printf("请输入指令的页号:\n");
        if(scanf("%ld", &p) != 1)
        {
            scanf("%s", s);
            if(strcmp(s, "exit") == 0) //如果输入为"exit"那么就退出,进入重选页面
            {
                stop = true;
                system("cls");
            }
        }
        else
        {
            if(pagelist[p].state) //如果该页flag标志位为1,说明该页在主存中
            {
                printf("绝对地址=%ld\n", pagelist[p].block * PAGESIZE + q);//计算绝对地址,绝对地址=块号×块长(128)+单元号
            }
            else
            {
                if(pagelist[P[po]].dirty) //当前页面被更新过,需把更新后的内容写回外存
                {
                    pagelist[P[po]].state = 0;
                }
                pagelist[P[po]].state = 0;//将flag标志位置0,表示当前页面已被置换出去
                printf("被置换出去的页面为%ld\n", P[po]);//显示根据FIFO算法被置换出去的页面
                printf("调入的页面为%ld\n", p);//显示根据FTFO算法被调入的页面
                pagelist[p].block = pagelist[P[po]].block;//块号相同
                pagelist[p].state = 1;//将当前页面的标记置为1,表示已在主存中
                P[po] = p;//保存当前页面所在的位置
                po = (po + 1) % BLOCKSIZE;
                for(i = 0; i < BLOCKSIZE; i++) //循环输出当前数组的数值,即当前在内存中的页面
                {
                    printf("P[%ld] = %ld\n", i, P[i]);
                }
            }
        }
    }
    while(!stop);
}

//信息展示
void DisplayInfo()
{
	printf("★★★★★★★★★★★★★★★★★\n");
	printf("★☆☆☆☆%s☆☆☆☆☆☆★\n",SYSINFO);
	printf("☆☆☆☆☆@Author:%s☆☆☆☆★\n",AUTHOR);
	printf("★★★★★★★★★★★★★★★★★\n");
}

//选择哪种方法进行
void option()
{

	int option = 0;
	char s[128];
	do
	{
		DisplayInfo();  //展示信息
		printf("请选择题号(1/2):\n");
		printf("注:输入exit可以进行退出!\n");
		if(scanf("%d",&option) != 1)
		{
			scanf("%s",&s);
			if(strcmp(s,"exit") == 0)
			{
				//如果输入为exit则退出整个程序
				return;
			}
		}
		else
		{
			if(option == 1)
			{
				//如果option=1说明选择的是模拟分页式存储管理中硬件的地址转换和产生缺页中断
				InitEx1();//初始化
				WorkEx1();//进行模拟
			}
			if(option == 2)
			{
				//如果option=2说明选择的是FFO算法来实现页面的置换
				InitEx2();//初始化
				WorkEx2();//进行模拟
			}
		}
	}
	while(1);
}

//main函数
int main()
{
	option();//选择题号
	return 0;
}

六、实验结果

主界面:
在这里插入图片描述

输入题号1
输入页号1和页内偏移101
在这里插入图片描述
输入页号2和页内偏移203
在这里插入图片描述

输入页号6 66,发生中断
在这里插入图片描述

再输入正确的页表
在这里插入图片描述

输入exit返回
在这里插入图片描述

输入题号2
输入已经在内存的页号

在这里插入图片描述在这里插入图片描述

输入不在内存的页号
在这里插入图片描述

再次循环

七、实验体会总结

总结与体会:

  • 本次实验对页式存储器管理进行了学习,具体为模拟分页式存储管理中硬件的地址转换和产生缺页中断算法,和用先进先出(FIFO)页面调度算法处理缺页中断两种中断算法两种方式。
  • 分页式存储管理中硬件的地址转换中的地址结构为第一部分是页号,后一部分为页内地址(位移量),通过实验对页式存储器有了进一步的理解。当请求某一页面式时,该页不存在,此时就会产生缺页中断
  • FIFO算法是先进先出算法处理缺页中断,该页不存在就会替换掉最先被放进的页面,可以通过选择2清楚的看到替换过程。
  • 相较于前三次实验,此次实验代码也较短较为简单,调试修改起来很快,但是调试的过程中也遇到了不少的问题,需要自己仔细推敲理梳理,才能理解其中的原理与逻辑。
  • 该次实验程序的健壮性有待提高,该程序有很多可拓展的地方,如果学有余力的话,可以将此代码再从新整理,完善。
  • 此次实验为实验5页面置换算法打下了基础。
  • 课下还需要多花时间,将理论与实践相结合起来,才能更好的掌握知识。
  • 18
    点赞
  • 123
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一. 实验目的: 1.通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解。熟悉虚存管理的各种面淘汰算法 2.通过编写和调试地址转换过程的模拟程序以加强对地址转换过程的了解。 二.实验要求 实验程序由以下三大部分组成: (1) 通过随机数产生一个指令序列(实际上是指令的逻辑地址序列),共320条指令。指令的地址按下述原则生成: A:50%的指令是顺序执行的 B:25%的指令要实现向前跳转,均匀分布在前地址部分 C:25%的指令要实现向后跳转,均匀分布在后地址部分 具体的实施方法是: A:在[0,319]的指令地址之间随机选取一起点m B:顺序执行一条指令,即执行地址为m+1的指令 C:在前地址[0,m+1]中随机选取一条指令并执行,该指令的地址为m’ D:顺序执行一条指令,其地址为m’+1 E:在后地址[m’+2,319]中随机选取一条指令并执行 F:重复步骤A-E,直到320次指令 (2) 将每条指令的逻辑地址变换为地址 设:面大小为1K; 用户内存容量4到32; 用户虚存容量为32K。 在用户虚存中,按每K存放10条指令排列虚存地址,即320条指令在虚存中的存放方为: 第 0 条-第 9 条指令为第0(对应逻辑地址为[0,9]) 第10条-第19条指令为第1(对应逻辑地址为[10,19]) ……………………………… 第310条-第319条指令为第31(对应逻辑地址为[310,319]) 按以上方,用户指令可组成32。 (3) 分别使用FIFO算法和LFU算法,计算给用户进程的这32分配4,5,…,32个面(内存块)时其缺页率。
存储器管理实验,主要围绕着对计算机中的存储器进行管理和优化展开。在设计实验时,可以有以下几个创意点: 1. 分页虚拟存储管理:实验可以设计一个基于分页虚拟存储管理的系统。通过模拟操作系统中的面置换算法,比如LRU(最近最少使用)算法、FIFO(先进先出)算法等,让学生对面置换的过程和机制有更深入的了解。 2. 虚拟内存管理实验实验可以实现一个简单的虚拟内存管理系统。在实验中,可以设置一定的内存大小,并模拟程序对内存的访问和替换过程。通过调整面大小、实现面置换算法等,让学生体验虚拟内存管理的性能优化以及实际应用。 3. 缓存一致性实验:对于多处理器系统,缓存一致性是一个关键的问题。实验可以设计一个基于MESI协议的缓存一致性模拟实验,让学生理解缓存一致性的概念和工作原理,以及掌握处理器间数据一致性的解决方法。 4. 内存分配算法:实验可以设计一个内存分配算法的模拟实验。通过实现不同的分配算法,比如最先适应算法、最佳适应算法和最坏适应算法等,让学生比较不同内存分配算法的优缺点,并对它们的性能进行评估。 5. 动态内存管理实验实验可以让学生实现一个简单的动态内存管理系统,比如堆内存分配和释放。通过实验,学生可以了解动态内存管理的过程和挑战,以及理解内存泄漏和内存碎片等问题。 通过以上实验的设计与实践,学生可以更好地理解存储器管理的原理和实践,提升对计算机系统中存储器管理理解掌握

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值