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

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

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

三、实验环境:

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.hqwc.cn/news/572175.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用LangChain LCEL生成RAG应用、使用LangChain TruLens对抗RAG幻觉

# 导入LangChain的库 from langchain import *# 加载数据源 loader WebBaseLoader() doc loader.load("https://xxx.html")# 分割文档对象 splitter RecursiveCharacterTextSplitter(max_length512) docs splitter.split(doc)# 转换文档对象为嵌入&#xff0c;并…

从根本上优雅地解决 VSCode 中的 Python 模块导入问题

整体概述&#xff1a; 在我尝试运行 test_deal_file.py 时&#xff0c;我遇到了一个 ModuleNotFoundError 错误&#xff0c;Python告诉我找不到名为 controllers 的模块。这意味着我无法从 deal_file.py 中导入 read_excel 函数。 为了解决这个问题&#xff0c;我尝试了几种方法…

Qt开发(2)——在已有VS项目中配置Qt

在之前的Qt开发学习中&#xff0c;基本都是在Qt Creator中创建一个Qt项目&#xff0c;或者即便是在VS中也是直接新建一个Qt项目。但很少有记录如何在已有的C项目中添加Qt,这就好比我有个项目已经开发完了&#xff0c;现在又说加个Qt界面的功能。这篇文章就是记录如何在已有项目…

2024年4月份 风车IM即时通讯系统APP源码 版完整苹果安卓教程

关于风车IM&#xff0c;你在互联网上能随便下载到了基本都是残缺品&#xff0c; 经过我们不懈努力最终提供性价比最高&#xff0c;最完美的版本&#xff0c; 懂货的朋友可以直接下载该版本使用&#xff0c;经过严格测试&#xff0c;该版本基本完美无缺。 下载地址&#xff1a;…

Matlab|计及电池储能寿命损耗的微电网经济调度

目录 1 主要内容 储能寿命模型 负荷需求响应 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序参考文献《考虑寿命损耗的微网电池储能容量优化配置》模型&#xff0c;以购售电成本、燃料成本和储能寿命损耗成本三者之和为目标函数&#xff0c;创新考虑储能寿命损耗约…

蓝桥杯2023年第十四届省赛真题:公因数匹配|数论:分解质因数

前置知识&#xff1a; 下列定理证明来自洛谷题解区&#xff1a; B3715 分解质因子 2 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 学习参考、分解质因数模板&#xff1a; 第二十三章 数论——质数&#xff08;1&#xff09;&#xff08;超级详细的推导&#xff09;_数论中…

学点儿数据库_Day11_多表、等值连接、内连接、模糊查找

1 多表 学生表、班级表、课程表、班级课程表 关系型数据库&#xff1a; MySql、SqlServer、Oracle 相同的数据出现多次绝不是一件好事&#xff0c;这是关系数据库设计的基础。关系表的设计就是要把信息分解成多个表&#xff0c;一个数据一个表&#xff0c;各表通过某些共同的…

Python学习笔记------文件操作

编码 编码就是一种规则集合&#xff0c;记录了内容和二进制间进行相互转换的逻辑。 编码有许多中&#xff0c;我们最常用的是UTF-8编码 计算机只认识0和1&#xff0c;所以需要将内容翻译成0和1才能保存在计算机中。同时也需要编码&#xff0c;将计算机保存的0和1&#xff0c…

【Canvas与艺术】模拟八一电影制片厂电影片头效果

【缘起】 八一厂每部电影前都有其专有开头&#xff0c;如&#xff1a;https://www.ixigua.com/6799821997258834440?logTag2eacce76401e13f9efe7 这个片头可以用canvas模拟下来。 【关键点】 线型放射状粒子系统的运作。 立体感五角星的绘制。 【图例】 【代码】 <!D…

江协STM32:点亮第一个LED灯和流水灯

很多单片机都是高电平弱驱动&#xff0c;低电平强驱动&#xff0c;所以这里是低电平有效 点亮一个LED灯 操作STM32的GPIO需要三个操作&#xff1a; 第一个使用RCC开启GPIO的时钟 第二步使用GPIO_Init函数初始化GPIO 第三步使用输出或输入函数控制GPIO 1.使用RCC开启GPIO的时…

maya导入导出bvh 自动 脚本

目录 maya打开脚本编辑器 运行打开bvh脚本 maya导出bvh脚本 maya打开脚本编辑器 打开Maya软件,点击右下角 “脚本编辑器” 运行打开bvh脚本<

自省式RAG 与 LangGraph的实践

自省式 RAG 对实现 RAG 的步骤进行逻辑分析&#xff1a;比如&#xff0c;我们需要知道什么时候进行检索&#xff08;基于问题和索引的构成&#xff09;、何时改写问题以提升检索效率&#xff0c;或者何时抛弃无关的检索结果并重新检索。因此提出了自省式 RAG&#xff0c;自省式…