动态分区分配-首次适应算法

【操作系统】-- 动态分区分配算法(首次适应算法FF、最佳适应算法BF、最坏适应算法WF、循环首次适应算法NF) 每次从低地址开始查找,找到第一个能满足大小的空闲分区。空闲分区以地址递增的次序排列,每次分配内存时顺序查找空闲分区链,找到大小能满足要求的第一个空闲分区。空闲分区表、空闲分区链优点:①为分配大的内存空间创造了条件②不需要重新排序,算法开销小缺点:①不断被划分,会留下许多难以利用的小分区,产生碎片。空闲分区表↑空闲分区链(按起始地址有小到大排序)↓由于动态分区分配是一种连续分配方式,为各进程分配的空间必须是连续的一整片区域,因此为了保证大进程到来时能有连续的大空间,可以尽可能的留下大空间,优先使用小空间。空闲 阅读详情

动态分区分配-首次适应算法

动态分区分配是根据进程的实际需要,动态的为之分配内存的空间。

首次适应算法,要求空闲分区链以地址递增的次序链接,在分配内存时,从链首开始顺序查找,直到找到一个大小能满足要求的空闲分区为止,然后再按照作业的大小,从该分区中划出一块内存空间分给请求者,余下的空闲分区仍停留在空闲链中。

当进程运行完毕释放内存,系统根据回收区的首址,从空闲区链表中找到相应的插入点,此时可能出现以下4种情况之一

1回收区与插入点的前一个空闲分区F1相邻接,此时将两个分区合并

2回收区与插入点的后一个空闲分区F2相邻接,此时将两个分区合并

3回收区与插入点的前,后两个空闲分区相邻接,此时将三个分区合并

4回收区既不与F1相邻接,又不与F2相邻接,此时应为回收区单独建立一个新表项

下面用C语言模拟首次适应算法

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#define N 10000
int n1;//空闲分区的个数
int n2;//作业区的个数
struct kongxian
{
	int start;  //起址
	int end;    //结束
	int length;  //长度
}kongxian[N];
struct zuoye
{
	int start;  //起址
	int end;   //结束
	int length;  //长度
}zuoye[N];
int cmp1(const void *a,const void *b)
{
	return (*(struct kongxian *)a).start-(*(struct kongxian *)b).start;
}
int cmp2(const void *a,const void *b)
{
	return (*(struct zuoye *)a).start-(*(struct zuoye *)b).start;
}
void init()
{
	n1=1;  //初始时只有一个空闲区
	n2=0;  //初始没有作业
	kongxian[0].start=0;
	kongxian[0].end=1023;
	kongxian[0].length=1024;
}
void print1() //打印空闲分区
{
	int i;
	for(i=0;i<n1;i++)
	printf("空闲分区ID:%d 起止:%d 结束:%d 长度:%d\n",i,kongxian[i].start,kongxian[i].end,kongxian[i].length);
}
void print2() //打印作业分区
{
	int i;
	for(i=0;i<n2;i++)
	printf("作业分区ID:%d 起止:%d 结束:%d 长度:%d\n",i,zuoye[i].start,zuoye[i].end,zuoye[i].length);
}
int main()
{
	int i,j,k,t,len,flag,id;
	int front,middle, behind;
	int t1,t2;
	init();
	print1();
	printf("输入1装入新作业,输入0回收作业,输入-1结束\n");
	while(scanf("%d",&t)!=EOF)
	{
		if(t==1)  //装入新作业
		{
			printf("请输入作业的占用空间的长度 ");
			scanf("%d",&len);
			flag=0;
			for(i=0;i<n1;i++)
			{
				if(kongxian[i].length>=len)  //首次适应算法
				{
					flag=1;
					break;
				}
			}
			if(!flag)
			{
				printf("内存分配失败\n");
			}
			else
			{
				//将该作业加入作业区里
				zuoye[n2].start=kongxian[i].start;
				zuoye[n2].end=zuoye[n2].start+len;
				zuoye[n2].length=len;
				n2++;  //作业数加1
				if(kongxian[i].length==len) //该分区全部用于分配,删除该空闲分区
				{
					for(j=i;j<n1-1;j++)
					{
						kongxian[j].start=kongxian[j+1].start;
						kongxian[j].end=kongxian[j+1].end;
						kongxian[j].length=kongxian[j+1].length;
					}
					n1--;
				}
				else  //该空闲分区部分用于分配,剩余的留在空闲分区中
				{
					kongxian[i].start+=len;
					kongxian[i].length-=len;
				}
			}
		}
		else if(t==0)
		{
			printf("输入要回收的作业ID ");
            scanf("%d",&id);
			front=middle=behind=0;
			for(i=0;i<n1;i++)
			{
				if(kongxian[i].start>zuoye[id].end)
				break;
				if(kongxian[i].end==zuoye[id].start)  //待回收的作业上面有空闲分区
				{
					front=1;
					t1=i;
				}
				if(kongxian[i].start==zuoye[id].end)  //待回收的作业下面有空闲分区
				{
					behind=1;
					t2=i;
				}
			}
			if(!front&&!behind)  //待回收的作业上下均没有空闲分区
			{ 
				kongxian[n1].start=zuoye[id].start;
				kongxian[n1].end=zuoye[id].end;
				kongxian[n1].length=zuoye[id].length;
				n1++;  //空闲分区增加一个
				qsort(kongxian,n1,sizeof(struct kongxian),cmp1); //插入空闲分区后排序
				for(j=id;j<n2-1;j++)  //在作业分区中删除该作业
				{
					zuoye[j].start=zuoye[j+1].start;
					zuoye[j].end=zuoye[j+1].end;
					zuoye[j].length=zuoye[j+1].length;
			    }
				n2--;
			}
			if(front &&behind)  //待回收的作业上下均有空闲分区
			middle=1;
			if(front&&!middle)  //合并待回收的作业和上面的空闲分区
			{
				kongxian[t1].end+=zuoye[id].length;
				kongxian[t1].length+=zuoye[id].length;
				for(j=id;j<n2-1;j++)  //在作业分区中删除该作业
				{
					zuoye[j].start=zuoye[j+1].start;
					zuoye[j].end=zuoye[j+1].end;
					zuoye[j].length=zuoye[j+1].length;
			    }
				n2--;
			}
			if(middle)  //合并待回收的作业和上下的空闲分区
			{
				kongxian[t1].end=kongxian[t2].end;
				kongxian[t1].length+=(zuoye[id].length+kongxian[t2].length);
				//删除空闲分区t2
				for(j=t2;j<n1-1;j++)
				{
					kongxian[j].start=kongxian[j+1].start;
					kongxian[j].end=kongxian[j+1].end;
					kongxian[j].length=kongxian[j+1].length;
				}
				n1--;
				for(j=id;j<n2-1;j++)  //在作业分区中删除该作业
				{
					zuoye[j].start=zuoye[j+1].start;
					zuoye[j].end=zuoye[j+1].end;
					zuoye[j].length=zuoye[j+1].length;
			    }
				n2--;
			}
		    if(behind &&!middle) //合并待回收的作业和下面的分区
			{
				kongxian[t2].start-=zuoye[id].length;
				kongxian[t2].length+=zuoye[id].length;
				for(j=id;j<n2-1;j++)  //在作业分区中删除该作业
				{
					zuoye[j].start=zuoye[j+1].start;
					zuoye[j].end=zuoye[j+1].end;
					zuoye[j].length=zuoye[j+1].length;
			    }
				n2--;
			}
        }
		else
		{
			 printf("操作结束\n");
			 break;
		}
		print1();
		print2();
	}
	return 0;
}


#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#define N 10000
int n1;//空闲分区的个数
int n2;//作业区的个数
struct kongxian
{
	int start;  //起址
	int end;    //结束
	int length;  //长度
}kongxian[N];
struct zuoye
{
	int start;  //起址
	int end;   //结束
	int length;  //长度
}zuoye[N];
int cmp1(const void *a,const void *b)
{
	return (*(struct kongxian *)a).start-(*(struct kongxian *)b).start;
}
int cmp2(const void *a,const void *b)
{
	return (*(struct zuoye *)a).start-(*(struct zuoye *)b).start;
}
void init()
{
	n1=1;  //初始时只有一个空闲区
	n2=0;  //初始没有作业
	kongxian[0].start=0;
	kongxian[0].end=1023;
	kongxian[0].length=1024;
}
void print1() //打印空闲分区
{
	int i;
	for(i=0;i<n1;i++)
	printf("空闲分区ID:%d 起止:%d 结束:%d 长度:%d\n",i,kongxian[i].start,kongxian[i].end,kongxian[i].length);
}
void print2() //打印作业分区
{
	int i;
	for(i=0;i<n2;i++)
	printf("作业分区ID:%d 起止:%d 结束:%d 长度:%d\n",i,zuoye[i].start,zuoye[i].end,zuoye[i].length);
}
int main()
{
	int i,j,k,t,len,flag,id;
	int front,middle, behind;
	int t1,t2;
	init();
	print1();
	printf("输入1装入新作业,输入0回收作业,输入-1结束\n");
	while(scanf("%d",&t)!=EOF)
	{
		if(t==1)  //装入新作业
		{
			printf("请输入作业的占用空间的长度 ");
			scanf("%d",&len);
			flag=0;
			for(i=0;i<n1;i++)
			{
				if(kongxian[i].length>=len)  //首次适应算法
				{
					flag=1;
					break;
				}
			}
			if(!flag)
			{
				printf("内存分配失败\n");
			}
			else
			{
				//将该作业加入作业区里
				zuoye[n2].start=kongxian[i].start;
				zuoye[n2].end=zuoye[n2].start+len;
				zuoye[n2].length=len;
				n2++;  //作业数加1
				if(kongxian[i].length==len) //该分区全部用于分配,删除该空闲分区
				{
					for(j=i;j<n1-1;j++)
					{
						kongxian[j].start=kongxian[j+1].start;
						kongxian[j].end=kongxian[j+1].end;
						kongxian[j].length=kongxian[j+1].length;
					}
					n1--;
				}
				else  //该空闲分区部分用于分配,剩余的留在空闲分区中
				{
					kongxian[i].start+=len;
					kongxian[i].length-=len;
				}
			}
		}
		else if(t==0)
		{
			printf("输入要回收的作业ID ");
            scanf("%d",&id);
			front=middle=behind=0;
			for(i=0;i<n1;i++)
			{
				if(kongxian[i].start>zuoye[id].end)
				break;
				if(kongxian[i].end==zuoye[id].start)  //待回收的作业上面有空闲分区
				{
					front=1;
					t1=i;
				}
				if(kongxian[i].start==zuoye[id].end)  //待回收的作业下面有空闲分区
				{
					behind=1;
					t2=i;
				}
			}
			if(!front&&!behind)  //待回收的作业上下均没有空闲分区
			{ 
				kongxian[n1].start=zuoye[id].start;
				kongxian[n1].end=zuoye[id].end;
				kongxian[n1].length=zuoye[id].length;
				n1++;  //空闲分区增加一个
				qsort(kongxian,n1,sizeof(struct kongxian),cmp1); //插入空闲分区后排序
				for(j=id;j<n2-1;j++)  //在作业分区中删除该作业
				{
					zuoye[j].start=zuoye[j+1].start;
					zuoye[j].end=zuoye[j+1].end;
					zuoye[j].length=zuoye[j+1].length;
			    }
				n2--;
			}
			if(front &&behind)  //待回收的作业上下均有空闲分区
			middle=1;
			if(front&&!middle)  //合并待回收的作业和上面的空闲分区
			{
				kongxian[t1].end+=zuoye[id].length;
				kongxian[t1].length+=zuoye[id].length;
				for(j=id;j<n2-1;j++)  //在作业分区中删除该作业
				{
					zuoye[j].start=zuoye[j+1].start;
					zuoye[j].end=zuoye[j+1].end;
					zuoye[j].length=zuoye[j+1].length;
			    }
				n2--;
			}
			if(middle)  //合并待回收的作业和上下的空闲分区
			{
				kongxian[t1].end=kongxian[t2].end;
				kongxian[t1].length+=(zuoye[id].length+kongxian[t2].length);
				//删除空闲分区t2
				for(j=t2;j<n1-1;j++)
				{
					kongxian[j].start=kongxian[j+1].start;
					kongxian[j].end=kongxian[j+1].end;
					kongxian[j].length=kongxian[j+1].length;
				}
				n1--;
				for(j=id;j<n2-1;j++)  //在作业分区中删除该作业
				{
					zuoye[j].start=zuoye[j+1].start;
					zuoye[j].end=zuoye[j+1].end;
					zuoye[j].length=zuoye[j+1].length;
			    }
				n2--;
			}
		    if(behind &&!middle) //合并待回收的作业和下面的分区
			{
				kongxian[t2].start-=zuoye[id].length;
				kongxian[t2].length+=zuoye[id].length;
				for(j=id;j<n2-1;j++)  //在作业分区中删除该作业
				{
					zuoye[j].start=zuoye[j+1].start;
					zuoye[j].end=zuoye[j+1].end;
					zuoye[j].length=zuoye[j+1].length;
			    }
				n2--;
			}
        }
		else
		{
			 printf("操作结束\n");
			 break;
		}
		print1();
		print2();
	}
	return 0;
}
操作系统之动态分区分配方式的模拟 目的和要求: 用C语言或C++语言分别实现采用首次适应算法和最佳适应算法的动态分区分配过程alloc()和回收过程free()。其中,空闲分区通过空闲分区链表来管理,在进行内存分配时,系统优先使用空闲区低端空间。 实验原理: 首次适应算法(First-fit):当要分配内存空间时,就查表,在各空闲区中查找满足大小要求的可用块。只要找到第一个足以满足要球的空闲块就停止查找,并把它分配出去;如果该空闲... 阅读详情

相关推荐

操作系统【动态分区分配算法——首次适应算法、最佳适应算法、最坏适应算法、临近适应算法】

首次适应算法(First Fit)、 最佳适应算法(Best Fit)、 最坏适应算法(Worst Fit)【又称“最大适应算法”(Largest Fit)】、 临近适应算法(Next Fit)

upward 5万+

操作系统简单动态分区分配算法(c++)

操作系统基本动态内存分配算法,首次适应和最佳适应

凛_Lin~~的博客 3314

用首次适应算法实现内存动态分区分配

用首次适应算法编程实现对操作系统内存动态分区分配,主要功能包括分配内存和回收内存。

操作系统(动态分区分配算法:首次适应算法、循环首次适应算法、最佳适应算法和最坏适应算法)

设计程序模拟四种动态分区分配算法:首次适应算法、循环首次适应算法、最佳适应算法和最坏适应算法的工作过程。假设内存中空闲分区个数为n,空闲分区大小分别为P1, … ,Pn,在动态分区分配过程中需要分配的进程个数为m(m≤n),它们需要的分区大小分别为S1, … ,Sm,分别利用四种动态分区分配算法将m个进程放入n个空闲分区,给出进程在空闲分区中的分配情况

weixin_62134940的博客 7010

手把手教你在Keil/IAR中移植SEGGER_RTT组件(避坑指南+性能对比)

本文详细介绍了在Keil/IAR开发环境中移植SEGGER RTT调试组件的完整流程与优化技巧。通过对比传统串口调试,SEGGER RTT凭借零硬件占用、高速传输和双向交互等优势,显著提升嵌入式开发效率。文章包含配置步骤、性能调优方案及常见问题解决方案,是嵌入式开发者必备的实用指南。

y7z8a的博客 243

独立游戏开发者必看:STEAM税务信息更新全流程(附中国区避坑指南)

本文为独立游戏开发者详细解析了Steam税务信息更新的全流程,重点针对中国区开发者提供了避坑指南。文章深入解释了W-8BEN表格的填写要点,并指导如何准备个人所得税纳税记录和身份证等核心证明文件,以确保顺利通过审核,避免收入被预扣税款。

tcp8optimizer的博客 1280

首次适应算法 动态分区分配方式的模拟 C语言——课程设计实习

用C语言实现采用首次适应算法的动态分区分配过程alloc()和回收过程free()。其中,空闲分区通过空闲分区链表来管理,在进行内存分配时,系统优先使用空闲区低端的空间 - 假设初始状态如下,可用的内存空间为640KB,并有下列的请求序列;采用首次适应算法进行内存块的分配和回收,同时显示内存块分配和回收后空闲内存分区链的情况 - 假设初始状态如下,可用的内存空间为640KB,并有下列的请求序列; 作业1申请130KB 作业2申请60KB 作业3申请100KB 作业2释放60KB 作业4申请200 KB

m0_46404001的博客 8789

萤石摄像头批量下载视频后FFmepg拼接

本文描述萤石摄像头,如何批量下载视频,然后把视频片段拼接为一个完整的视频,亲测有效。有问题,可以下面留言

烤鱼哥哥的博客 1202

操作系统动态分区分配方式C/C++语言(首次适应算法(FF)循环首次适应算法(NF)最best适应算法(BF)最坏适应算法(WF))

算法介绍 一、动态分区分配算法 为把一个新作业装入内存,须按照一定的分配算法, 从空闲分区表或空闲分区链中出一分区分配给该作业。由于内存分配算法对系统性能有很大的影响,故人们对它进行了较为广泛而深入的研究,于是产生了许多动态分区分配算法。传统的四种分配算法,它们都属于顺序式搜索算法。 二、分区分配操作 在动态分区存储管理方式中,主要的操作是分配内存和回收内存。 1)分配内存 系统应利用某种分配算法,从空闲分区链(表)中找到所需大小的分区。设请求的分区大小为u.size,表中每个空闲分区的大小可表示为m.si

weixin_48560325的博客 1万+

【Java微服务-医疗管理项目】(附源码+资料+教程)

尚医疗是专门为各大医院、门诊提供的一款医疗管理平台。 系统包含:系统管理、药品进销存管理、看病就诊、收费管理、检查管理、数据统计等核心模块。 通过尚医疗系统可以快速、方便的管理病人从挂号到门诊结束所涉及到的全套流程。也可以清晰明了的体现出药品进货、出售的所有记录。.........

m0_72882572的博客 2203

【机器视觉】Halcon 最新版本安装教程(HALCON 24.11.1.1 Progress-Steady)

注:如果使用评估版本,下载前先了解最新评估授权密钥所支持的版本。。近几年不同版本安装过程类似,均可参考本教程。

OpenSeek的博客 3万+

动态分区分配算法(1、首次适应算法 2、最佳适应算法 3、最坏适应算法 4、邻近适应算法)

文章目录前言知识总览1、首次适应算法2、最佳适应算法3、最坏适应算法4、邻近适应算法知识回顾与重要考点 前言 此篇文章是我在B站学习时所做的笔记,大部分图片都是课件老师的PPT,方便复习用。此篇文章仅供学习参考。 提示:以下是本篇文章正文内容 知识总览 动态分区分配算法:在动态分区分配方式中,当很多个空闲分区都能满足需求时,应该选择哪个分区进行分配? 1、首次适应算法 算法思想:每次都从低地址开始查找,找到第一个能满足大小的空闲分区。 如何实现:空闲分区以地址递增的次序排列。每次分配内存时顺序查找空闲

CHEN的博客笔记 1万+

QCC304x系列开发教程(实战篇)之5.2 QCC3040之提示音

earbud_init.c中,初始化table中UiPrompts_Init /*! \brief Table of initialisation functions */ static const init_table_entry_t appInitTable[] = { ......... {UiPrompts_Init, 0, NULL}, ......... } ui_prompts.c中是提示音音处理的主要逻辑和配置源文件 函数static void uiPro...

心跳包的博客 2392

采用首次适应算法实现动态分区分配过程的模拟

采用首次适应算法实现动态分区分配过程的模拟 实验要求 用C语言编程,实现采用首次适应算法的动态分区分配过程 实验内容 (1)空闲分区通过空闲分区链来管理;进行内存分配时,系统优先使用空闲区低端的空间。 (2)假设初始状态下可用的内存空间为640KB,并有下列的请求序列: 作业1申请130KB 作业2申请60KB 作业3申请100KB 作业2释放60KB 作业4申请200KB 作业3释放100KB 作业1释放130KB 作业5申请140KB 作业6申请60KB 作业7申请50KB 作业6释放60KB 采用首次

qq_38902844的博客 3629

嵌入式STM32F407CET6移植OpenHarmony系统方法

文件末尾添加:export PATH=~/gcc-arm-none-eabi-10-2020-q4-major/bin:$PATH。编译完成文件输出在LiteOs源码目录下out/STM32F407_ATK_Explorer文件夹中。②点击connect to the target,下方会自动显示识别出来的芯片型号以及flash大小。⑤点击program verify并点击start,等待烧写并校验完成,你就能看到程序正在运行了。,在选择刚才我们说的Huawei_LiteOS.hex文件。

嵌入式技术开发 546

RSL-RL:开源人形机器人强化学习控制研究库

摘要:RSL-RL是一款专为机器人领域设计的开源强化学习库,其核心特点是紧凑性、可修改性和高性能。该库聚焦PPO和BC两大主流算法,并整合了对称性增强、好奇心驱动等机器人专用技术。通过纯GPU训练优化,RSL-RL在大型仿真中展现出卓越的吞吐性能,已成功应用于腿足运动控制、全身协调等多个机器人研究场景。其轻量级架构包含运行器、算法和网络三个可独立修改的组件,支持TensorBoard等主流日志工具。该框架特别适合需要快速原型开发的机器人研究者,但不适用于通用机器学习基准测试。开源地址:https://git

2506_90492529的博客 1674

首次适应算法 动态分区分配java_采用首次适应算法的动态分区分配模拟

#include void hui(Fq *head){Fq *p=head->next;p->before=head;int no=0;cout<>no;while(p!=NULL){if(p->no==no){free(p);cout<return ;}else{p=p->next;}}}void alloc(int b,int no,Fq *p){w...

weixin_31063289的博客 482

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

操作系统实验——模拟动态分区首次适应分配和回收算法

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

weixin_52760656的博客 1860

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

首次适应算法代码java链表,采用首次适应算法实现动态分区分配过程的模拟

实验名称:采用首次适应算法实现动态分区分配过程的模拟实验要求:用C语言编程,实现采用首次适应算法的动态分区分配过程。实验内容:(1)空闲分区通过空闲分区链来管理;进行内存分配时,系统优先使用空闲区低端的空间。(2)假设初始状态下可用的内存空间为640KB,并有下列的请求序列:作业1申请130KB作业2申请60KB作业3申请100KB作业2释放60KB作业4申请200KB作业3释放100KB作业1释...

weixin_35551678的博客 733

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

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

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

Movrain的博客 1141

动态分区分配方式的模拟------首次适应算法和最佳适应算法

首次适应算法是将空闲区按照起始地址排序,从中找到第一个刚好可以容纳进程所需空间的区域进行分配。 代码的思路相对简单,时间性能上不是很高,仅仅达到了效果。 1.用C语言分别实现采用首次适应算法和最佳适应算法的动态分区分配过程alloc( )和回收过程free( )。其中,空闲分区通过空闲分区链来管理:在进行内存分配时,系统优先使用空闲区低端的空间。 2.假设初始状态下,可用的内存空间为640KB,并有下列的请求序列: •作业1申请130KB。 •作业2申请60KB。 •作业3申请100KB。 •作业2释放6

懒羊羊的梦想 5620

3.1.5 操作系统之动态分区分配的四种算法(首次适应算法、最佳适应算法、最坏适应算法、临近适应算法)

文章转自:3.1.5 操作系统之动态分区分配的四种算法(首次适应算法、最佳适应算法、最坏适应算法、临近适应算法)_BitHachi的博客-优快云博客_最佳适应算法目录0.思维导图1.首次适应算法2.最佳适应算法3.最坏(大)适应算法4.临近适应算法5.四种算法归纳比较...

Lianuuu的博客 2168

操作系统————四种动态分区分配算法详解(首次适应,最坏适应,最佳适应,邻近适应)

假设此时又有一个进程6需要5MB的空间,那么上次结束的位置是2号空闲分区,我们直接往后查找到10MB的空闲分区发现满足条件直接分配,这样指针移动的次数是1次。首次适应算法有一部分最佳适应算法的优点,而邻近适应算法包含了最坏适应算法的缺点,所以不能说邻近适应算法比一定首次适应算法好。我们假设现在内存有三个空闲分区,大小分别是20MB,10MB,4MB如上图所示。按容量递增的顺序就可以保证找出的分区是最合适的,不会太大造成空间的浪费。我们还是以上面的例子分析,按照容量递减的顺序排列空闲分区。

2301_80303982的博客 2631

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

设计动态分区首次适应分配、回收算法。 设计“未分配区说明表”,格式为: 序号 始址 长度 状态 设计“已分配区说明表”,格式为: 作业名 始址 长度 状态 设计显示程序,将“未分配区说明表”和“已分配区说明表”的 内容,显示在屏幕上 初始分配从一个空闲区分配起,回收时要合并空区。 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #include.

qq_45848441的博客 278
上一篇: 子网划分
下一篇: CSS样式的基础学习总结
橘子局
博客等级 码龄14年 70粉丝 84原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值