动态分区分配算法(First Fit,Next Fit,Best Fit,Worst Fit)

您所在的位置:网站首页 动态分区改为基本分区 动态分区分配算法(First Fit,Next Fit,Best Fit,Worst Fit)

动态分区分配算法(First Fit,Next Fit,Best Fit,Worst Fit)

2024-06-30 17:33:05| 来源: 网络整理| 查看: 265

一、动态分区分配算法的背景

为了能将用户程序装入内存,必须为它分配一定大小的内存空间。连续分配方式是最早出现的一种存储器分配方式, 曾被广泛应用于上世纪60~ -80 年代的OS中,该分配万式为个用户程序分配 一个连续的内存空间, 即程序中代码或数据的逻辑地址相邻,体现在内存空间分配时物理地址的相邻。连续分配方式可分为四类:单一连续分配、固定分区分配、动态分区分配以及动态可重定位分区分配算法四种方式,其中动态分区分配算法就是此实验的实验对象。 动态分区分配又称为可变分区分配,它是根据进程的实际需要,动态地为之分配内存空间。在实现动态分区分配时,将涉及到分区分配中所用的数据结构、分区分配算法和分区的分配与回收操作这样三方面的问题。 动态分区分配又称为可变分区分配,它是根据进程的实际需要,动态地为之分配内存空间。在实现动态分区分配时,将涉及到分区分配中所用的数据结构、分区分配算法和分区的分配与回收操作这样三方面的问题。

二、四种分配算法原理

1.首次适应算法(First Fit)

将空闲分区链以地址递增的顺序连接;在进行内存分配时,从链首开始顺序查找,直到找到一块分区的大小可以满足需求时,按照该作业的大小,从该分区中分配出内存,将剩下的空闲分区仍然链在空闲分区链中。 在这里插入图片描述

2.循环首次适应算法(Next Fit)

分配内存时不是从链首进行查找可以分配 内存的空闲分区,而是从上一次分配内存的空闲分区的下一个分区开始查找,直到找到可以为该进程分配内存的空闲分区; 在这里插入图片描述

3.最佳适应算法(Best Fit)

将空闲分区链中的空闲分区按照空闲分区由小到大的顺序排序,从而形成空闲分区链。每次从链首进行查找合适的空闲分区为作业分配内存,这样每次找到的空闲分区是和作业大小最接近的,所谓“最佳”。 在这里插入图片描述

4.最坏适应算法(Worst Fit)

与最佳适应算法刚好相反,将空闲分区链的分区按照从大到小的顺序排序形成空闲分区链,每次查找时只要看第一个空闲分区是否满足即可。 在这里插入图片描述

三、四种算法过程记录

动态内存信息: 分区个数:5 各分区首址:0 50 190 340 530 各分区大小:130 70 140 80 20

1.首次适应算法(First Fit)

在这里插入图片描述

2.循环首次适应算法(Next Fit) 在这里插入图片描述

3.最佳适应算法(Best Fit) 在这里插入图片描述

4.最坏适应算法(Worst Fit) 在这里插入图片描述

四、算法的优劣比较

1.首次适应算法(First Fit)

优点:高址部分的大的空闲分区得到保留,为大作业的内存分配创造了条件; 缺点: (1)每次都是优先利用低址部分的空闲分区,造成低址部分产生大量的外碎片。 (2)每次都是从低址部分查找,使得查找空闲分区的开销增大;

2.循环首次适应算法(Next Fit)

优点: (1)使得空闲分区分布更加均匀; (2)空闲分区的查找开销小; 缺点:高址部分的大空闲分区被分小,使得大作业进入无法分配内存;

3.最佳适应算法(Best Fit)

优点:第一次找到的空闲分区是大小最接近待分配内存作业大小的; 缺点:产生大量难以利用的外部碎片。

4.最坏适应算法(Worst Fit)

优点:效率高,分区查找方便; 缺点:当小作业把大空闲分区分小了,那么,大作业就找不到合适的空闲区。

五、代码实现

Partition.h

#pragma once #include #include #include #include #include #include #include #include using namespace std; typedef struct//分区 { static int PartitionNum;//分区数量 int m_PartitionId;//分区首地容量址 int m_PartitionSize;//分区 int m_BlockId;//空白分区首地址 }Partition; typedef struct//进程控制块 { static int PCBNum;//进程数量 string m_PidName;//进程名称 int m_PidSize;//进程大小 }PCB; void ReadData();//读入数据 void Display1(); void Display_Partition(); void Display();//输出分区完后各个分区的状态 void Display_PCB();//显示进程的状态 void FirstFit();//首次适应算法 void NextFit();//循环首次适应算法 void BestFit();//最佳适应算法 void WorstFit();//最坏适应算法

Partition.cpp

#include" Partition.h" int Partition::PartitionNum = 0; int PCB::PCBNum = 0; Partition* partition; PCB* pcb; int MIN; void ReadData()//读入数据 { ifstream readData; readData.open("data.txt"); readData >> Partition::PartitionNum;//读入分区数量 partition = new Partition[Partition::PartitionNum];//开空间 for (int i = 0; i readData >> partition[i].m_PartitionSize; } //readData >> PCB::PCBNum;//读入进程数量 //pcb = new PCB[PCB::PCBNum]; //for (int i = 0; i < PCB::PCBNum; i++)//读入进程名称 //{ // readData >> pcb[i].m_PidName; //} //for (int i = 0; i < PCB::PCBNum; i++)//读入进程大小 //{ // readData >> pcb[i].m_PidSize; //} //readData.close(); } void FirstFit()//首次适应算法 { bool flag = false; int i, j; string choose; ReadData(); //cout > MIN; //Display_PCB(); do { Display_Partition(); pcb = (PCB*)realloc(pcb, sizeof(PCB)*(PCB::PCBNum + 1)); cout pcb[PCB::PCBNum - 1].m_PidName; cout pcb[PCB::PCBNum - 1].m_PidSize; i = PCB::PCBNum - 1; for (j = 0; j partition[j].m_PartitionSize -= pcb[i].m_PidSize; partition[j].m_BlockId += partition[j].m_PartitionSize; if (partition[j].m_PartitionSize flag = false; cout int pos = 0; bool flag = false; int i, j; string choose; ReadData(); //Display_PCB(); /*cout > MIN;*/ do { Display_Partition(); pcb = (PCB*)realloc(pcb, sizeof(PCB)*(PCB::PCBNum+1)); cout pcb[PCB::PCBNum - 1].m_PidName; cout pcb[PCB::PCBNum - 1].m_PidSize; i = PCB::PCBNum - 1; for (j = pos;; j++) { if (pos >= PCB::PCBNum) { pos = 0; } if (pcb[i].m_PidSize partition[j].m_PartitionSize = 0; } flag = true; pos = j + 1; if (pos == PCB::PCBNum) { pos = 0; } break; } } if (flag) { flag = false; cout int pos = 0; bool flag = false; int i, j; multimap m; multimap::iterator ip; string choose; ReadData(); //Display_PCB(); /*cout > MIN;*/ do { Display_Partition(); pcb = (PCB*)realloc(pcb, sizeof(PCB)*(PCB::PCBNum + 1)); cout pcb[PCB::PCBNum - 1].m_PidName; cout pcb[PCB::PCBNum - 1].m_PidSize; i = PCB::PCBNum - 1; m.clear(); for (j = 0; j if (pcb[i].m_PidSize first) { ip->second->m_PartitionSize -= pcb[i].m_PidSize; ip->second->m_BlockId += ip->second->m_PartitionSize; /*if (ip->second->m_PartitionSize second->m_PartitionSize = 0; }*/ flag = true; break; } else { ip++; } } if (flag) { flag = false; cout int pos = 0; bool flag = false; int i, j; multimap m; multimap::iterator ip = m.begin(); string choose; ReadData(); //Display_PCB(); /*cout > MIN;*/ do { Display_Partition(); pcb = (PCB*)realloc(pcb, sizeof(PCB)*(PCB::PCBNum + 1)); cout pcb[PCB::PCBNum - 1].m_PidName; cout pcb[PCB::PCBNum - 1].m_PidSize; i = PCB::PCBNum - 1; m.clear(); for (j = 0; j if (pcb[i].m_PidSize first) { ip->second->m_PartitionSize -= pcb[i].m_PidSize; ip->second->m_BlockId += ip->second->m_PartitionSize; /*if (ip->second->m_PartitionSize second->m_PartitionSize = 0; }*/ flag = true; break; } else { ip++; } } if (flag) { flag = false; cout int i; set s; for (i = 0; i cout m.insert(make_pair(partition[i].m_PartitionId, partition + i)); } cout cout printf("%-d ", partition[i].m_PartitionId); } cout cout printf("%3d ", pcb[i].m_PidSize); } cout cout


【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭