主存储器空间的分配和回收(原理及实现)

2023-11-11

内容

主存储器空间的分配和回收。

目的

一个好的计算机系统不仅要有一个足够容量的、存取速度高的、稳定可靠的主存储器,而且要能合理地分配和使用这些存储空间。当用户提出申请存储器空间时,存储管理必须根据申请者的要求,按一定的策略分析主存空间的使用情况,找出足够的空闲区域分配给申请者。当作业撤离或主动归还主存资源时,则存储管理要收回作业占用的主存空间或归还部分主存空间。主存的分配和回收的实现与主存储器的管理方式有关的,通过本实验帮助学生理解在可变分区管理方式下应怎样实现主存空间的分配和回收。
三、实验原理
模拟在可变分区管理方式下采用最先适应算法实现主存分配和回收。
(1)可变分区方式是按作业需要的主存空间大小来分割分区的。当要装入一个作业时,根据作业需要的主存量查看是否有足够的空闲空间,若有,则按需要量分割一个分区分配给该作业;若无,则作业不能装入。随着作业的装入、撤离,主存空间被分成许多个分区,有的分区被作业占用,而有的分区是空闲的。例如:

在这里插入图片描述
为了说明哪些区是空闲的,可以用来装入新作业,必须要有一张空闲区说明表,格式如下:
在这里插入图片描述
其中,起址——指出一个空闲区的主存起始地址。
长度——指出从起始地址开始的一个连续空闲的长度。
状态——有两种状态,一种是“未分配”状态,指出对应的由起址指出的某个长度的区域是空闲区。
(2) 当有一个新作业要求装入主存时,必须查空闲区说明表,从中找出一个足够大的空闲区。有时找到的空闲区可能大于作业需要量,这时应把原来的空闲区变成两部分:一部分分给作业占用;另一部分又成为一个较小的空闲区。为了尽量减少由于分割造成的空闲区,而尽量保存高地址部分有较大的连续空闲区域,以利于大型作业的装入。为此,在空闲区说明表中,把每个空闲区按其地址顺序登记,即每个后继的空闲区其起始地址总是比前者大。
(3) 采用最先适应算法(顺序分配算法)分配主存空间。
按照作业的需要量,查空闲区说明表,顺序查看登记栏,找到第一个能满足要求的空闲区。当空闲区大于需要量时,一部分用来装入作业,另一部分仍为空闲区登记在空闲区说明表中。
由于本实验是模拟主存的分配,所以把主存区分配给作业后并不实际启动装入程序装入作业,而用输出“分配情况”来代替。
(4) 当一个作业执行结束撤离时,作业所占的区域应该归还,归还的区域如果与其它空闲区相邻,则应合成一个较大的空闲区,登记在空闲区说明表中。
(5) 请按最先适应算法设计主存分配和回收的程序。假设初始时主存中没有作业,现按下面序列进行内存的申请与释放:
作业1申请300K,作业2申请100K,作业1释放300K,作业3申请150K,
作业4申请30K, 作业5申请40K, 作业6申请60K, 作业4释放30K。
请你为它们进行主存分配和回收,把空闲区说明表的初值以及每次分配或回收后的变化显示出来或打印出来。

算法流程图

在这里插入图片描述

源程序

#include <iostream>
using namespace std;
#define COUNT 512

//定义作业结构体代表作业状态
typedef struct Task
{
	char name;//名称
	int start;//起始位置
	int end;//大小
	int flag;//是否分配的标志
}Task;

//定义结构体数组存储各项作业状态,代表作业表
Task OS[COUNT];
int counts;//被分成的块数统计

char c;//作业名
int num;//资源申请量

//初始化
void init()
{
	counts = 1;
	OS[0].name = 'P';//未分配命名为P
	OS[0].start = 0;//初始位置0
	OS[0].end = COUNT;
	OS[0].flag = 1;//分配标志未分配 = 1
}

//插入数组数据
void insert(int m, int st, int en)
{
	int i;
	counts++;//数组长度加一
	for (i = counts; i > m ; i--)//从插入位由后往前后移数据
	{
		OS[i] = OS[i - 1];
	}
	OS[m].start = st;//插入数据
	OS[m].end = en;
}

//删除数组数据
void move(int m)
{
	int i;
	for (i = m; i < counts - 1; i++)//从删除位由前往后前移数据
	{
		OS[i] = OS[i + 1];
	}
	counts--;//数组长度减一
}

//合并没有分配的相邻块
void remove(int m, int st, int en)
{
	if (!OS[m - 1].flag && !OS[m + 1].flag)
	//如果m位置前后标志都已分配则正常处理,不分配
	{
		OS[m].name = 'P';
		OS[m].flag = 1;
	}
	if (OS[m - 1].flag)
	//如果m位置前标志未分配,后标志已分配则与前一个合并
	{
		OS[m - 1].end = OS[m - 1].end + en;
		move(m);
	}
	if (OS[m + 1].flag)
	//如果m位置后标志未分配,前标志已分配则与后一个合并
	{
		OS[m].end = OS[m].end + OS[m + 1].end;
		OS[m].name = 'P';
		OS[m].flag = 1;
		move(m + 1);
	}
}

//打印输出
void show()
{
	int i;
	cout << "(名称  标识  起址  长度  状态)" << endl;
	for (i = 0; i < counts; i++)
	{
		if (OS[i].flag)//未分配
			cout << "P    ";
		else//已分配
			cout << OS[i].name << "    ";
		cout << i << "    " << OS[i].start << "    " << OS[i].end << "    ";
		//依次输出块的编号,起始位置,长度
		if (OS[i].flag)
			cout << "未分配" << endl;
		else
			cout << "已分配" << endl;
	}
}

//录入数据
void put()
{
	cout << "输入申请或者释放的进程名称及资源数:" << endl;
	cin >> c;
	cin >> num;
}

//申请资源
int apply()
{
	int i = 0;
	int applyflag = 0;//标记
	while (!applyflag && i < counts)//遍历数组查找连续的可分配资源是否存在
	{
		if (OS[i].end >= num && OS[i].flag)//通过比较块大小和是否已分配来找资源		空间
		{
			if (OS[i].end == num)//大小相等则直接修改信息
			{
				OS[i].name = c;
				OS[i].flag = 0;
			}
			else//若偏大则修改信息同时更新原先块为已分配和未分配两部分
			{
				insert(i + 1, OS[i].start + num, OS[i].end - num);
				OS[i + 1].flag = 1;
				OS[i + 1].name = 'P';
				OS[i].start = OS[i].start;
				OS[i].name = c;
				OS[i].end = num;
				OS[i].flag = 0;
			}
			applyflag = 1;//申请成功更改标记
		}
		i++;
	}
	if (applyflag)
	{
		cout << "申请成功" << endl;
		return 1;
	}
	else
	{
		cout << "没有足够大的空闲空间" << endl;
		return 0;
	}
}

//释放资源
int free()
{
	int i = 0;
	int freeflag = 0;//标记
	while (!freeflag && i < counts)//遍历数组查找所对应作业是否存在
	{
		if (OS[i].name == c)//找到作业
		{
			if (OS[i].end == num)//释放大小相等,合并未分配区
			{
				remove(i, OS[i].start, OS[i].end);
			}
			else
			{
				if (OS[i].end >num)//释放大小不足,将已分配区拆分为未分配和已分				配两个区
				{
					insert(i + 1, OS[i].start + num, OS[i].end - num);
					OS[i + 1].name = 'P';
					OS[i + 1].flag = 0;
					OS[i].end = num;
					OS[i].flag = 1;
					if (OS[i - 1].flag)//合并未分配区
					{
						remove(i, OS[i].start, OS[i].end);
					}
				}
				else
				{
					cout << "正使用的数量小于释放的数量" << endl;
					return 0;
				}
			}
			freeflag = 1;//修改标记
		}
		i++;
	}
	if (freeflag)
	{
		cout << "释放成功" << endl;
		return 1;
	}
	else
	{
		cout << "未找到匹配的进程名称" << endl;
		return 0;
	}
}

//菜单函数
void menu()
{
	int code;	
	while (1)
	{
		cout << "输入选择" << endl << 
			"1.初始化" << endl <<
			"2.输出" << endl <<
			"3.申请" << endl <<
			"4.释放" << endl <<
			"0.退出" << endl;
		cin >> code;
		//初始化
		if (code == 1)
		{
			init();
		}
		//显示输出
		else if (code == 2)
		{
			show();
		}
		//申请
		else if (code == 3)
		{
			put();
			apply();
			show();
		}
		//释放
		else if (code == 4)
		{
			put();
			free();
			show();
		}
		//退出操作
		else if (code == 0)
		{
			return;
		}
		else
			cout << "命令无效,请重新输入" << endl;
	}
}
int main()
{
	menu();
	return 0;
}

运行结果

  1. 初始化
    在这里插入图片描述
  2. 作业1申请300K
    在这里插入图片描述
  3. 作业2申请100K在这里插入图片描述
  4. 作业1释放300K
    在这里插入图片描述
  5. 作业3申请150K
    在这里插入图片描述
  6. 作业4申请30K
    在这里插入图片描述
  7. 作业5申请40K
    在这里插入图片描述
  8. 作业6申请60K
    在这里插入图片描述
  9. 作业4释放30K
    在这里插入图片描述
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

主存储器空间的分配和回收(原理及实现) 的相关文章

  • java调优总结

    JVM调优总结 序 几年前写过一篇关于JVM调优的文章 前段时间拿出来看了看 又添加了一些东西 突然发现 基础真的很重要 学习的过程是一个由表及里 再由里及表的过程 呵呵 所谓的 温故而知新 而真正能走完这个轮回的人 也就能称为大牛或专家了
  • Win11微软账号登录不上?Win11登录Microsoft账户出错的解决方法

    Win11微软账号登录不上 近期有部分Win11用户反映在登录微软账号会出现一直转圈 无法登录的情况 这样导致部分功能都不能正常使用了 为此十分令人头疼 那么对于这一情况 有没有什么方法可以有效的解决呢 下面小编教给大家操作方法 大家可以去
  • Linux网络安全-Zabbix入门(一)

    一 基本概念 1 监控目的 运行情况 提前发现问题 2 监控资源类别 公开 tcp udp 端口 私有 cpu 磁盘 监控一切需要监控的东西 只要能够想到 能够用命令实现的都能用来监控 如果想远程管理服务器就有远程管理卡 比如Dell id
  • mapengpeng1999@163.com 操作系统4~处理机调度

    处理机调度 1 三级调度体系 1 处理机调度主要是对处理机运行时间进行分配 即 按照一定算法或策略 将处理机运行时间分配给各个并发进程 同时尽量提高处理机的使用效率 2 现代操作系统中 按调度所实现的功能分3种类型 高级调度 中级调度和低级
  • 操作系统学习(九)进程通信

    一 知识总览 二 定义 进程通信是指进程之间的信息交换 每个进程都拥有自己的内存空间 是相互独立的 这样在每个进程执行时 才不会被其他进程所干扰 三 进程通信的方式 1 共享存储 1 两个进程对共享区的访问必须是互斥的 即在同一时间内 只允
  • 虚拟机管理程序、虚拟化和云: 深入剖析 PowerVM 虚拟机管理程序

    预备知识 Power 是没有限制的虚拟化 一些企业打算依靠 PowerVM 虚拟化将多个工作负载整合到较少系统上 从而提高服务器利用率 降低成本 Power VM 为基于 Power Systems 平台的高级 RAS 功能和领先性能为 A
  • Linux 磁盘与文件系统管理(鸟哥私房菜)

    本文来自 http vbird dic ksu edu tw linux basic 0230filesystem php 第八章 Linux 磁盘与文件系统管理 系统管理员很重要的任务之一就是管理好自己的磁盘文件系统 每个分割槽不可太大也
  • Windows 添加永久静态路由

    route add p 10 10 0 0 mask 255 255 0 0 10 10 6 1 p 参数 p 即 persistent 的意思 p 表示将路由表项永久加入系统注册表
  • Linux学习--CentOS7.5

    CentOS7命令大全 Linux系统简介 Unix Linux发展史 Linux目录结构 树形结构 查看 切换以及创建目录 文本内容操作 grep工具 关机和重启 Linux命令 基本用法 ls list 使用通配符 mkdir 别名 g
  • 通过源码包*.src.rpm定制开发rpm

    为什么80 的码农都做不了架构师 gt gt gt 1 基本流程 1 下载 安装相应的src rpm包 wget xxx src rpm rpm ivh xxx src rpm 这里的 安装 是指把xxx src rpm中的tar gz p
  • Visual studio 2005 hangs on startup AppHangXProcB1 svchost devenv.exe svchost.exe:{2a811bb2-303b-48b...

    This problem has been torturing me for the whole afternoon and after searching on the web for a long time I finally get
  • Windows运行常用命令(win+R)

    1 calc 启动计算器 2 notepad 打开记事本 3 write 写字板 4 mspaint 画图板 5 snippingtool 截图工具 支持无规则截图 6 mplayer2 简易widnows media player 7 S
  • Linux常用命令记录

    文章目录 1 软件安装 安装软件 来自源服务器 安装 deb软件 来自本地 deb文件 修复依赖关系 卸载软件 2 文件 文件夹操作 删除文件夹 移动文件 文件重命名 3 程序查看 处理 进程查看 查看端口占用情况 强制终止程序 4 解压文
  • Ubuntu9.04太多乱码(中文不能正常显示)

    最近在使用Ubuntu9 04的过程中 发现有好多地方都出现乱码 其实是中文不能正常显示 现在把我所遇到的所有乱码问题集中一下 方便以后查阅参考 一 Flash乱码 在终端输入 sudo gedit etc fonts conf d 49
  • 内存管理——分页分段

    一 分页存储管理 1 页面与页框 1 页面 将一个进程的逻辑地址空间分成若干个大小相等的片 称为页面或页 并为各页加以编号 2 页框 相应于页面 把内存空间分成和页面相同大小的若干个存储块 称为 物理 块或页框 frame 3 页内碎片 在
  • linux 使用systemctl 启动服务报错: Error: No space left on device

    By default Linux only allocates 8192 watches for inotify which is ridiculously low And when it runs out the error is als
  • 如何快速构建CMBD系统-glpi

    脚本后续更新及迭代将由kkitDeploy项目代替 https github com luckman666 kkitdeploy server 请大家持续关注kkitDeploy 一 CMBD系统构建步骤 起初 开发这套CMBD系统是为了帮
  • MacOS中清除原有ssh公钥方法

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 用ssh的跳转登录服务器后 ssh会把你每个你访问过计算机的公钥 public key 都记录在 ssh known hosts 当下次访问相同计算机时 SSH会核对公钥
  • Linux(13):例行性工作排程

    例行性工程 听谓的排程是将工作安排执行的流程之意 Linux 排程就是透过 crontab 与 at 这两个东西 两种工作排程的方式 一种是例行性的 就是每隔一定的周期要来办的事项 一种是突发性的 就是这次做完以后就没有的那一种 at at
  • 八股文打卡day20——操作系统(3)

    面试题 线程同步的方式有哪些 我的回答 多线程同时访问和修改某个数据的话 会造成数据的不一致和冲突问题 所以就需要线程同步 线程同步的方式有 1 互斥锁 互斥锁就是 当一个资源被访问和操作时 会对这个资源加锁 把这个资源锁定 其他线程不能对

随机推荐

  • nltk-比较中文文档相似度-完整实例

    nltk同时也能处理中文的场景 只要做如下改动 使用中文分词器 如我选用了结巴分词 对中文字符做编码处理 使用unicode编码方式 python的源码编码统一声明为 gbk 使用支持中文的语料库 代码如下 需要jieba的支持 usr b
  • 华为智能手环智能手表软件测试,Huawei WatchFace Designer(华为手表表盘开发工具) V10.0.1.16 官方测试版...

    Huawei WatchFace Designer是华为自主研发的基于PC端的华为手表手环表盘设计编辑软件 目前本软件支持华为WATCH GT系列运动手表 Band系列智能手环表盘制作 操作说明 设计师可以通过菜单 文件 新建 创建表盘并编
  • 类和对象学习——构造方法!

    类和对象学习 构造方法 我们自己定义一个类 是为了创建这个类的对象 然后调用该类中方法 执行一系列代码 实现我们要的程序功能 我们创建这个类的对象怎么创建的 new 类的对象名 1 无参构造 用类名 做方法名的方法 是构造方法 1 什么是构
  • 大数据专栏-Hive插入数据时长时间卡住的问题分析过程及原因

    最近在进行hive案例教学时 某一个学生出现了一个很奇怪的问题 前期hadoop和hive的平台搭建没有任何问题 在hive建表练习时 前几次也是正常进行 但是在进行分组聚合时 出现了问题 问题现象 1 通过分组聚合查询 把查询结果插入到另
  • 一篇SSM框架整合友好的文章(一)

    2016 12 18 21 47 517人阅读 评论 0 收藏 举报 分类 java 16 版权声明 本文为博主原创文章 欢迎转载 转载请注明作者 原文超链接 博主地址 http blog csdn net forezp 目录 转载请标明出
  • 网络安全之DDos攻击

    一 DDoS 攻击究竟是什么 DDoS 攻击 全称是 Distributed Denial of Service 翻译成中文就是分布式拒绝服务 一般来说是指攻击者利用 肉鸡 对目标网站在较短的时间内发起大量请求 大规模消耗目标网站的主机资源
  • 高精度算法【加减乘除】

    全文目录 前言 高精度加法 操作步骤 代码模板 高精度减法 操作步骤 代码模板 高精度乘法 操作步骤 代码模板 高精度除法 操作步骤 代码模板 前言 在实际应用中 语言提供的数据类型的最大值或最小值可能不足以支撑我们所进行的运算 这时会导致
  • 论文写作参考文献 期刊标准缩写

    写论文时 经常疑惑参考文献的缩写是什么 反复的查看别人的参考格式 很麻烦 有参考文献期刊缩写大全方便了不少 Content is based on IEEEfull bib and IEEEabrv bib as of 2016 03 25
  • python中argparse

    关于argparse网上的资料好多 搞明白后自己整理下 方便以后查看 argparse 是python自带的命令行参数解析包 可以用来方便地读取命令行参数 它的使用也比较简单 1 基本框架 下面是采用argparse从命令行获取用户名 该p
  • centos7 pip2升级失败解决方法

    centos7 默认python版本是2 7 所以安装的pip也要支持py2 yum install python2 pip y 安装之后默认版本较低 pip 8 1 2 在提示升级时 可能会遇到我这种错误 pip install upgr
  • ssh+vscode remote显示x11

    本教程环境为 windows主机上安装vscode远程连接ubuntu linux服务器做开发 在vscode里面添加ssh主机即可实现远程开发 在服务器上需要安装相应的扩展 实现方法如下 step1 本地windows安装上x11显示软件
  • vue uniapp等动态添加类名

    1 对象形式 p 对象的形式 文字的颜色 p 2 对象形式 p 对象的形式 文字的颜色 p 3 三元表达式 p 三元表示式 文字的颜色 p 4 数组形式 p 数组的形式 文字的颜色 p 5 数组对象形式 p 数组中使用对象 文字的颜色 p
  • VSCode 搭建 STM32开发环境

    首先附上一张VS Code图 一直都喜欢这种 黑色主题感觉高大上 因为公司准备上市 所以不能使用Keil开发了 在这之前有在Linux上开发过STM32 于是想着在Windows上也搭建一个 这样方便跨平台 于是决定搭建一个用VSCode
  • 让你能进“大厂”的数据分析项目是长怎样?全套路线(建议收藏)

    算法 数据结构 全套路线 建议收藏 前言 所谓活到老 学到老 虽然我感觉自己已经学了很多算法了 但是昨天熬夜整理完以后发现 自己还是个弟弟 实在忍不住了 打算把 算法学习路线 发出来 我把整个算法学习的阶段总结成了五个步骤 分别为 基础语法
  • NLP模型笔记2022-09:hanlp所有预训练模型API接口使用

    目录 1 找出所有预训练模型 为后续训练模型准备 2 如何使用上述模型 2 1 以分词模型为案例 2 2 以分词 词性 实体识别 句法模型为统一的模型 参考文献 HanLP2 1支持包括简繁中英日俄法德在内的104种语言上的10种联合任务
  • Python安装报错:”ModuleNotFoundError:No module named _ctypes“ 的解决方案

    目录 第一步 下载安装包 第二步 执行安装 1 创建存放目录 2 运行脚本configure 3 make编译make install安装 4 最后运行make clean 第三步 创建软连接 总结安装过程 总结报错解决 第一步 下载安装包
  • 串口助手使用16进制发送数据

    目录 如何使用串口助手发送16进制数据 注意发送字节 连续发送 注意不要使用回车 如何使用串口助手发送16进制数据 错误示范 正确示范 注意发送字节 有些串口在16进制发送是必须这样 02 直接输入2发送不出去 如图 如何知道没有发送成功呢
  • MFC多线程各种线程用法 .

    一 问题的提出 编写一个耗时的单线程程序 新建一个基于对话框的应用程序SingleThread 在主对话框IDD SINGLETHREAD DIALOG添加一个按钮 ID为 IDC SLEEP SIX SECOND 标题为 延时6秒 添加按
  • Windows 7 下Maven的下载安装配置 (配置本地仓库及修改路径)

    环境 windows 7 64位 官网下载Maven 1 首先去官网 http maven apache org 进行下载 这里尽量不要选太高级的版本 选个稳定的版本就可以了 上面的两个箭头都可以进行选择 第一个箭头是代表最新的版本 这里我
  • 主存储器空间的分配和回收(原理及实现)

    内容 主存储器空间的分配和回收 目的 一个好的计算机系统不仅要有一个足够容量的 存取速度高的 稳定可靠的主存储器 而且要能合理地分配和使用这些存储空间 当用户提出申请存储器空间时 存储管理必须根据申请者的要求 按一定的策略分析主存空间的使用