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

news2024/10/7 20:25:05

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

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

三、实验环境:

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. 每次为作业回收空间后都需要按首次适应算法调整空闲分区表的顺序。

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

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

相关文章

【WiFi】WiFi QoS映射关系及抓包分析

WiFi Aliance认证测试对应图 RFC8325 ​​​​​​RFC 8325https://datatracker.ietf.org/doc/html/rfc8325 RFC 8325 – WiFi QoS Mappings | mrn-cciew (mrncciew.com)https://mrncciew.com/2021/09/14/rfc-8325-wifi-qos-mappings/ 802.11 UP和DSCP映射关系 802.11 UP …

万兆车载以太网转换器 10G/2.5G多速车载以太网转换器-MC10GM

MC10GM转换器 一、产品简要分析 2.5G,5G,10G可切换万兆/多速车载以太网转换器。采用罗森博格H-MTD标准接口类型。实现将车载以太网标准2.5/5/10G BASE-T1转换为工业级2.5/5/10G 标准以太网&#xff0c;进而接入电脑或工控机. 产品实现2.5/5/10G Base-T1 和2.5/5/10G Base-R之间…

ubuntu卸载Anaconda

1. 删除配置的环境变量 sudo gedit ~/.bashrc # >>> conda initialize >>> # !! Contents within this block are managed by conda init !! __conda_setup"$(/work3/ai_tool/anaconda3/bin/conda shell.bash hook 2> /dev/null)" if [ $? -…

CI860K01 3BSE032444R1 参数说明书

ABB CI860K01 3BSE032444R1是一款ABB公司生产的通信接口模块。 这款模块是专为工业自动化环境设计的&#xff0c;能够在各种设备之间提供稳定和可靠的数据传输接口。它采用了先进的通信技术和严格的生产工艺&#xff0c;确保了产品的高质量和性能。此外&#xff0c;它的设计合…

为响应国家号召,搜维尔科技开启虚拟仿真实验室设备升级改造服务

近日&#xff0c;国务院发布了关于《推动大规模设备更新和消费品以旧换新行动方案》&#xff0c;该通知的发布表现出国家对于科技创新事业的高度重视。各行各业都在积极响应国家号召&#xff0c;加快数字化转型和设备升级与更新步伐。搜维尔科技为响应国家号召&#xff0c;将开…

Linux 系统Centos7.0记录安装Docker和安装jdk环境完整教程(建议收藏备用)

Linux 系统Centos7.0记录安装Docker和安装jdk环境完整教程&#xff08;建议收藏备用&#xff09; 一、安装前准备工作 1.1 查看服务器系统版本以及内核版本 cat /etc/redhat-release1.2 查看服务器内核版本 uname -r这里我们使用的是CentOS 7.9 系统&#xff0c;内核版本为…

【LVGL-文件系统移植】

LVGL-文件系统移植 ■ LVGL-文件系统移植■ 示例一&#xff1a;■ 示例二&#xff1a;视频实例■ 综合示例&#xff1a; ■ LVGL-文件系统移植 ■ 示例一&#xff1a; 在这里插入代码片■ 示例二&#xff1a;视频实例 在这里插入代码片■ 综合示例&#xff1a; /***********…

2024年第16届大广赛新命题发布-爱华仕箱包

2024年3月27日&#xff0c;2024年第16届大广赛发布了新的命题&#xff0c;爱华仕箱包命题&#xff0c;自2017年起&#xff0c;爱华仕箱包已连续8年担任全国大学生广告艺术大赛命题单位。 爱华仕现已实现百货、超市、电商、礼品、投标、海外市场6大零售网络的全覆盖&#xff0c…

一口气搞懂分库分表 12 种分片算法,大厂都在用

前言 本文是《ShardingSphere5.x分库分表原理与实战》系列的第五篇文章&#xff0c;我们一起梳理下ShardingSphere框架中的核心部分分片策略和分片算法&#xff0c;其内部针为我们提供了多种分片策略和分片算法&#xff0c;来应对不同的业务场景&#xff0c;本着拿来即用的原则…

CD盘里的cda文件如何拷取成mp3?

CDA并非一种独立的音频文件格式&#xff0c;而是指存储在音乐CD上的音轨文件。这种格式的起源可以追溯到CD制造商对一种在CD播放器上直接播放音轨的需求&#xff0c;而不是在计算机上存储音频文件。因此&#xff0c;CDA通常存在于音乐CD中&#xff0c;为提供一种便捷的音频存储…

python--切片

1.切片&#xff1a; 切片是编程语言为有序序列&#xff08;sequence&#xff09;准备的&#xff0c;用来切割或者截取某个片段 一个完整的切片是包含三个参数和两个冒号" : " ,用于分隔三个参数(start_index、end_index、step)。当只有一个“:”时&#xff0c;默认第…

JavaScript混淆工具选择与使用指南

摘要 本文介绍了什么是js混淆工具&#xff0c;以及为什么需要使用js混淆工具。详细解释了js混淆工具的实现原理和作用&#xff0c;探讨了如何选择合适的js混淆工具&#xff0c;列举了几款常用的js混淆工具&#xff0c;并对它们的特点和适用场景进行了分析。最后总结了js混淆工…

手把手教你绘画原型图:Axure的安装使用

&#x1f341; 作者&#xff1a;知识浅谈&#xff0c;CSDN签约讲师&#xff0c;CSDN博客专家&#xff0c;华为云云享专家&#xff0c;阿里云专家博主 &#x1f4cc; 擅长领域&#xff1a;全栈工程师&#xff0c;大模型&#xff0c;爬虫、ACM算法 &#x1f492; 公众号&#xff…

【C++】类和对象入门(从struct到class带你了解类和对象!)

&#x1f338;博主主页&#xff1a;釉色清风&#x1f338;文章专栏&#xff1a;C&#x1f338;今日语录&#xff1a;人生本就是一首代写的诗歌&#xff0c;而他们的文字浅薄&#xff0c;不该被潦草地印刷着。所以在我笔下&#xff0c;“一重山有一重山地错落&#xff0c;我有我…

28位驻华大使、公使参访苏州金龙 点赞刚刚全球发布的新V系大巴

3月26日下午&#xff0c;由外交部组织的“驻华使节团参访江苏”活动走进苏州金龙。来自28个国家和国际组织的驻华大使、公使参观了苏州金龙展厅&#xff0c;并试乘体验了苏州金龙全新V系大巴。外交部中国政府欧洲事务特别代表吴红波&#xff0c;外交部礼宾司、翻译司、非洲司、…

javascript基础代码练习

一、输入新增病例数&#xff0c;累计确诊病例数&#xff0c;14天内聚集性疫情发生天数。新增或者累计确诊病例为0则该地区为低风险地区。新增大于0且累计确诊&#xff1c;50或者累计大于50且14天内聚集性疫情发生天数为0的地区为中风险地区。其他情况为高风险地区。 <!DOCT…

大数据Hadoop入门04 ——【HDFS shell操作】

一、HDSF shell命令行解释说明 1、介绍 命令行界面&#xff08;英语: command-line interface&#xff0c;缩写: CLl)&#xff0c;是指用户通过键盘输入指令&#xff0c;计算机接收到指令后&#xff0c;予以执行一种人际交互方式。Hadoop提供了文件系统的shell命令行客户端:…

labelme自动标注工具的安装和python代码修改

labelme嵌入SAM和EfficientSAM自动标注模型 目录: 1.labelme windows环境下安装python版本labelme 2.labelme.exe直接安装 3.labelme生成exe 4.labelme python代码修改 labelme自动标注使用方法 编辑/Create AI-Polygon 自动分割,直接生成分割图,标注为point,完成标注后…

Typora 主题配置

title: Typora主题配置 search: 2024-03-19 tags: “#Typora主题” Typora 主题配置 文章目录 Typora 主题配置Step-1 进入官方主题网站Step-2 选中主题&#xff0c;并点击DownloadStep-3 跳转到 github 网站Step-4 直接下载源码Step-5 解压下载的源码Step-6 找到下载源码中的…

01背包-动态规划

01背包 易知状态转移方程为&#xff1a; dp[i][j] max(dp[i-1][j],dp[i-1][j-v[i]]w[i]) 代码 N,V map(int,input().split()) v, w [0],[0] # 体积v&#xff0c;价值w for i in range(N):a list(map(int,input().split()))v.append(a[0]) # 体积viw.append(a[1]) # 价值w…