操作系统原理-模拟动态分区首次适应分配和回收算法——沐雨先生

一、实验题目: 模拟动态分区首次适应分配和回收算法

二、实验目的: 通过本实验,可加深理解动态分区分配、回收程序的功能和具体实现,特别是对回收分区的合并的理解。

三、实验环境:

1、硬件:PC机及其兼容机。

2、软件:Windows OS,MS—DOS OS,Turbo C 或 C++、VC++等。

四、实验内容:

1、 设计动态分区首次适应分配、回收算法。

2、 设计“空闲分区表”,格式为:

在这里插入图片描述

4、设计显示程序,将“未分配区说明表”和“已分配区说明表”的内容,显示在屏幕上。

5、 初始分配从一个空闲区分配起,回收时要合并空区。

五、运行示例:

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

六、算法流程图:

在这里插入图片描述

七、程序清单:

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

#define N 5
#define MINSIZE 10//最大碎片大小

typedef struct EMP{
	int no;//分区编号
	int iadd;//起始地址
	int length;//长度
	int status;//状态 1-占有,0未占有
}EMP;
typedef struct USE{
	int no;//分区编号
	int iadd;//起始地址
	int length;//长度
	int status;//状态 1-占有,0未占有
	char job[10];//作业名
}USE;

void menu(){
	printf("---------OS实验三:模拟动态分区首次适应分配和回收算法---------\n");
	printf("---------------------------系统菜单---------------------------\n");
	printf("----------------------------1.分配----------------------------\n");
	printf("----------------------------2.回收----------------------------\n");
	printf("----------------------------3.显示----------------------------\n");
	printf("----------------------------0.退出----------------------------\n");
	printf("---------------------请输入您需要的功能(0-3)------------------\n");
	printf("--------------------------------------------------------------\n");
	printf("各功能简要说明:\n");
	printf("分配功能:选择该功能后,首先输入需要分配空间的作业名及所需空间的大小。然后,按照首次适用算法从空闲分区表中找到一个合适的分区,若找到,则划分相应的空闲分区给该作业(修改“未分配区说明表”和“已分配区说明表”中的内容);若没有找到,需要给出相应的提示信息。\n");
	printf("回收算法:选择该功能后,首先输入需要回收的作业的名称,然后,系统按照该名称从“已分配区说明表”中找到该作业对应的表项,若找到,则回收该分区(修改“未分配区说明表”和“已分配区说明表”中的内容),要注意空闲分区的合并与空闲分区表需要按地址有序调整;若没有找到,则给出相应的提示信息。\n");
	printf("显示分区表:将两个分区表的内容显示在屏幕上,以便随时查看程序的运行情况。\n");
}


void allocation(EMP e[],USE u[]){//分配内存
	int i,j,k;
	int flag;
	char tempname[10]={'\0'};
	int templength;
	system("cls");
	printf("-------内存分配-------\n");
	while(flag){
		printf("请输入作业名:");
		scanf("%s",tempname);
		getchar();
		printf("请输入请求的内存空间:");
		scanf("%d",&templength);
		getchar();
		for(i=0;i<N;i++)
			if(e[i].status==1 && e[i].length>=templength)
				break;
		if(i==N)
			printf("wait a moment!");
		else{
			k=e[i].length-templength;
			if(k<=MINSIZE)//该空间完全分配给进程
				e[i].status=0;
			else{//空闲区有剩余,因此表中仍保留该分区
				for(j=0;j<N;j++)
					if(u[j].status==0)			
						break;
				u[j].iadd=e[i].iadd;
				u[j].length=templength;
				u[j].status=1;
				strcpy(u[j].job,tempname);//必须先修改分区使用表
				e[i].length-=templength;
				e[i].iadd+=templength;//修改空闲分区表
			}
			printf("分配成功!\n");
		}
		printf("是否继续运行作业:1-是 0-否");
		scanf("%d",&flag);
	}
}


void recycle(EMP e[],USE u[]){//回收内存
	int i,j,k,flag=1;
	EMP emp;//临时变量,排序是使用
	char tempname[10];
	system("cls");
	printf("-------内存回收-------\n");
	while(flag){
		k=0;
		printf("请输入回收作业名:");
		scanf("%s",tempname);
		while( strcmp(u[k].job,tempname) && k<N || u[k].status==0 )
			k++;
		if(k==N)
			printf("未找到该作业!");
		else{//找到该作业
			u[k].status=0;
			for(i=0;i<N;i++)
				if( (e[i].iadd+u[k].length)==u[k].iadd && e[i].status==1 )
					for(j=0;j<N;j++)
						if( e[j].iadd==(u[k].iadd+u[k].length) && e[j].status==1){//上下相邻空闲分区
							e[i].length+=e[j].length+u[k].length;
							e[j].status=0;
							//printf("1");
							break;
						}
						else//只有上相邻的空闲分区
							e[i].length+=u[k].length;
			if(i==N){//无上相邻
				for(j=0;j<N;j++)
					if( e[j].iadd==(u[k].iadd+u[k].length) && e[j].status==1){//下相邻空闲分区
						e[j].length+=+u[k].length;
						e[j].iadd=u[k].iadd;
						//printf("2");
						break;
					}
				if(j==N){//上下不相邻
					for(j=0;j<N;j++)
						if(e[j].status==0) break;
					e[j].iadd=u[k].iadd;
					e[j].length=u[k].length;
					e[j].status=1;
					//printf("3");
				}
			}
			printf("回收成功!");
		}
		for(i=0;i<N-1;i++)//按首次适应算法调整空闲分区表的顺序
			for(j=i+1;j<N;j++)
				if(e[j].iadd<e[i].iadd){
					emp=e[j];
					e[j]=e[i];
					e[i]=emp;
				}
		printf("是否继续回收作业:1-是 0-否");
		scanf("%d",&flag);
	}
}


void show(EMP e[],USE u[]){//显示空闲分区表和分区使用表
	int i,d;
	system("cls");
	printf("分区编号----起始地址------长 度-------状 态(空闲分区表)\n");//显示空闲分区表
	for(i=0,d=0;i<N;i++){
		if(e[i].status==1)
			printf("%d\t\t%d\t   %d\t\t%d\n",++d,e[i].iadd,e[i].length,e[i].status);
	}
	printf("\n分区编号----起始地址------长 度-------状 态----作业名(使用分区表)\n");//显示分区使用表
	for(i=0,d=0;i<N;i++){
		if(u[i].status==1)
			printf("%d\t\t%d\t   %d\t\t%d\t%s\n",++d,u[i].iadd,u[i].length,u[i].status,u[i].job);
	}
	printf("显示完毕!\n");
	system("pause");
}


void main(){//主函数
	int i,flag=1;
	int select;
	struct EMP emp[N],*e=emp;
	struct USE use[N],*u=use;
	e[0].iadd=400;//初始化空闲分区表和分区使用表
	e[0].length=2160;
	e[0].status=1;
	u[0].status=0;
	for(i=1;i<N;i++){
		emp[i].status=0;
		use[i].status=0;
	}
	while(flag){
		system("cls");
		menu();
		scanf("%d",&select);
		switch(select){
			case 0:flag=0;break;
			case 1:allocation(e,u);break;//分配内存
			case 2:recycle(e,u);break;//回收内存
			case 3:show(e,u);break;//显示表
			default:printf("输入错误,请重新输入!");break;
		}
	}
}

八、程序中使用的数据结构及符号说明:

#define N 5
#define MINSIZE 10//最大碎片大小

typedef struct EMP{
	int no;//分区编号
	int iadd;//起始地址
	int length;//长度
	int status;//状态 1-占有,0未占有
}EMP;
typedef struct USE{
	int no;//分区编号
	int iadd;//起始地址
	int length;//长度
	int status;//状态 1-占有,0未占有
	char job[10];//作业名
}USE;

int select;
struct EMP emp[N],*e=emp;
struct USE use[N],*u=use;

九、调试程序时出现问题说明及解决的方法:

  1. 由于忘却了c语言结构体数组函数调用的用法,又复习了相关知识
    解决方法:
    struct EMP emp[N],*e=emp;
    struct USE use[N],*u=use;
  2. 为作业分配内存空间时,分配后显示总是出错
    解决方法:分配内存后在修改分区使用表和空闲分区表时,一定要先修改分区使用表,再修改空闲分区表,顺序千万不能错。
  3. 回收内存函数中,在查找u[k]空表目时,一定一定要加上u[k].status==0,不然会重复回收导致错误。
  4. 在调试运行结果时,多次遇到运行中断的问题
    解决方法:再多处设置printf(“1”);以此找出断点在哪,判断出哪里程序有问题。
  5. 每次为作业回收空间后都需要按首次适应算法调整空闲分区表的顺序。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

『Apisix安全篇』探索Apache APISIX身份认证插件:从基础到实战

&#x1f4e3;读完这篇文章里你能收获到 &#x1f6e0;️ 了解APISIX身份认证的重要性和基本概念&#xff0c;以及如何在微服务架构中实施API安全。&#x1f511; 学习如何使用APISIX的Key Authentication插件进行API密钥管理&#xff0c;包括创建消费者和路由。&#x1f504;…

Python 全栈体系【四阶】(十九)

第五章 深度学习 一、基本理论 4. 神经网络的改进 4.3 循环神经网络 4.3.1 标准 CNN 模型的不足 假设数据之间是独立的。标准 CNN 假设数据之间是独立的&#xff0c;所以在处理前后依赖、序列问题&#xff08;如语音、文本、视频&#xff09;时就显得力不从心。这一类数据…

Eigen之norm函数

向量的范数是一个将向量映射到非负实数的函数,通常表示为 ||x||。它是向量空间中的一种度量,用来衡量向量的大小或长度。范数满足以下性质: 非负性:对于任意向量 x,范数 ||x|| 大于等于零,且当且仅当 x 是零向量时等于零。齐次性:对于任意标量 α,范数 ||αx|| 等于 α…

2.Wireshark使用实训——分析FTP包

1&#xff0e;实训目的 掌握Wireshark的基本使用方法&#xff0c;具备Wireshark数据包内容的简单分析能力。 2&#xff0e;应用环境 某公司为了保障网络环境安全&#xff0c;需要使用Wireshark对网络中的数据包进行分析。 3&#xff0e;实训设备 安装有eNSP的计算机。 4&…

电机控制杂谈——永磁同步电机中的永磁体谐波反电势

1.问题的引出 在我的谐波抑制专题中&#xff0c;讲了三种谐波抑制的策略。当时是通过增大逆变器死区来产生较大的谐波。但是在实际电机里面&#xff0c;我感觉死区的影响基本上没有。。。课题组的驱动器中&#xff0c;逆变器的非线性其实基本可以忽略不计了。 但是&#xff0…

Vuex笔记

Vuex vuex 是实现数据集中式状态管理的插件。数据由 vex 统一管理。其它组件都去使用 vuex 中的数据。只要有其中一个组件去修改了这个 共享的数据&#xff0c;其它组件会同步更新。 多个组件之间依赖于同一状态。来自不同组件的行为需要变更同一状态。 环境搭建 1、vue2安…

YOLOv9改进策略:block优化 | ECVBlock即插即用的多尺度融合模块,助力小目标涨点 | 顶刊TIP 2023 CFPNet

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文改进内容&#xff1a;ECVBlock即插即用的多尺度融合模块&#xff0c;助力检测任务有效涨点&#xff01; yolov9-c-EVCBlock summary: 1011 layers, 68102630 parameters, 68102598 gradients, 252.4 GFLOPs 改进结构图如下&#x…

5个便宜的OV通配符SSL证书品牌

在当今互联网时代&#xff0c;网络安全、数据安全备受关注&#xff0c;作为网站拥有者&#xff0c;保护用户隐私数据安全变得越来越重要。其中&#xff0c;SSL证书是保障网站传输数据安全的关键&#xff0c;而在众多的选择中&#xff0c;OV通配符SSL证书以其验证显示企业身份、…

小林制药含红曲成分保健品疑致2死106人住院:红曲究竟是何方神圣?

一、红曲引发公众担忧二、红曲的生成及其特性三、红曲对人体的潜在风险四、小林制药及其在中国市场的产品情况 参考资料&#xff1a;三好夫人养生网 一、红曲引发公众担忧 近日&#xff0c;小林制药的一款含有红曲成分的保健品被疑似引发严重健康风险&#xff0c;导致两人死亡…

AutoCAD 2024 for Mac/Win:重塑设计绘图新纪元,引领行业变革先锋

在数字化时代的浪潮中&#xff0c;设计绘图工具的发展日新月异&#xff0c;AutoCAD 2024作为一款集创新、高效、智能于一体的CAD设计绘图软件&#xff0c;正以其卓越的性能和人性化的操作体验&#xff0c;引领着行业变革的新潮流。 AutoCAD 2024不仅继承了前代版本的优秀基因&…

【zip技巧】4种方法,删除ZIP压缩包密码

之前给大家介绍了zip压缩包加密方法&#xff0c;那么zip压缩包取消密码&#xff0c;大家了解多少呢&#xff1f;有密码的情况下&#xff0c;有哪些方法可以取消密码&#xff1f;无密码又该如何取消密码&#xff1f;今天总结四个方法分享给大家。 一、 最原始的方法&#xff0…

vue3 引入svg 图片的详细方法

我们都知道 svg 文件比图片小的多&#xff0c;可以节省很多空间&#xff0c;这对页面性能来说是个很大的提升。 下面介绍一下 vue3 项目中使用 svg 的详细方法&#xff1a; &#xff08;1&#xff09;安装依赖插件 npm install vite-plugin-svg-icons -D&#xff08;2&#x…

Springboot整合瀚高

需要下载highgo驱动,然后将jar包打入进自己本地maven中 下载地址: highgi6.2.4 1.打开jar包所在的文件&#xff0c;然后在该文件夹中打开命令窗口&#xff08;或者先打开命令窗口&#xff0c;然后cd到jar所在文件夹&#xff09; install-file -Dfile&#xff1a;jar包名Dart…

java 面向对象入门

类的创建 右键点击对应的包&#xff0c;点击新建选择java类 填写名称一般是名词&#xff0c;要知道大概是什么的名称&#xff0c;首字母一般大写 下面是创建了一个Goods类&#xff0c;里面的成员变量有&#xff1a;1.编号&#xff08;id&#xff09;&#xff0c;2.名称&#x…

微信小程序页面制作练习——制作一个九宫格导航图

要求&#xff1a; 代码实现&#xff1a; 先将所需要的资源图片存入我的image文件里面 模拟练习供参考&#xff0c;不建议这样存入image里&#xff0c;因为本地图片占内存太大&#xff0c;不能预览。 一、list.wxml里面搭建框架代码&#xff1a; <!--pages/list/list.wxml…

基于朴素贝叶斯算法和vue分离式架构的新闻数据情感分析可视化

基于朴素贝叶斯算法和vue分离式架构的新闻数据情感分析可视化 作品简介一、技术栈二、功能三、系统展示 作品简介 在本篇博客中&#xff0c;我将带您探索一个基于Python的新闻数据分析项目&#xff0c;其中涉及爬虫、可视化、情感分析等多种技术&#xff0c;并通过整合Django和…

阿里云 -- 连接云服务器ECS、管理云服务器ECS、WordPress 页面配置

连接云服务器ECS 1. 远程连接云服务器ECS&#xff0c;点击实例最右侧操作列的远程连接按钮&#xff0c;并在弹出的对话框中点击立即登录 2. 登录云服务器ECS&#xff0c;通过密码认证方式&#xff0c;输入用户名和密码 提示&#xff1a;新创建的ECS实例状态即使为运行中&#…

【AutoML】一个用于图像、文本、时间序列和表格数据的AutoML

一个用于图像、文本、时间序列和表格数据的AutoML AutoGluon介绍安装AutoGluon快速上手 参考资料 AutoGluon自动化机器学习任务&#xff0c;使您能够在应用程序中轻松实现强大的预测性能。只需几行代码就可以训练和部署有关图像&#xff0c;文本&#xff0c;时间序列和表格数据…

FlorisBoard:Android开源键盘的现代化选择

FlorisBoard&#xff1a;Android开源键盘的现代化选择 简介 FlorisBoard是一款免费且开源的安卓键盘&#xff0c;适用于Android 7.0及以上版本的设备。它的现代化设计和用户友好的界面使其在众多键盘应用中脱颖而出。FlorisBoard的独特之处在于它注重用户体验的同时&#xff0…

三位数组合-第12届蓝桥杯选拔赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第42讲。 三位数组合&#…