动态内存分配算法:首次适应算法,循环首次适应算法,最坏适应算法,最佳适应算法实现
动态分区分配是根据进程的实际需要,动态地址为之分配内存空间,在分配时按照一定的分配算法,从空闲分区表或空闲分区链中选出一分区分配给该作业
1.首次适应算法(FF):将所有空闲分区按照地址递增的次序链接,在申请内存分配时,从链首开始查找,将满足需求的第一个空闲分区分配给作业。
2.循环首次适应算法(NF):将所有空闲分区按照地址递增的次序链接,在申请内存分配时,总是从上次找到的空闲分区的下一个空闲分区开始查找,将满足需求的第一个空闲分区分配给作业
3.最坏适应算法(WF):将所有的空闲分区按照从大到小的顺序形成空闲分区链,在申请内存分配时,总是把满足需求的、最大的空闲分区分配给作业。
4.最佳适应算法(BF): 将所有空闲分区按照从小到大的顺序形成空闲分区链,在申请内存分配时,总是把满足需求的、最小的空闲分区分配给作业。
源码
#include <iostream>
#include <fstream>
#include <iomanip>
using namespace std;#define MAXNUMBER 100
static int PartitionNum; //内存中空闲分区的个数
static int ProcessNum; //需要分配的进程个数
static int FreePartition[MAXNUMBER]; //空闲分区对应的内存
static int ProcessNeed[MAXNUMBER]; //需要分配的进程大小static int LeftFreePartition[MAXNUMBER];
static int LeftProcessNeed[MAXNUMBER];static char ProcessName[MAXNUMBER];
static char NameProcessToPartition[MAXNUMBER][MAXNUMBER];typedef struct
{int partitionSize;int id;
}sortNeed;void readDataFunction();
void input();
void display();
void FirstFit();
void NextFit();
void BestFit();
void WorstFit();
void selectAlgorithm(int chooceAlgorithm);
void display();void readDataFunction()
{cout<<"请输入空闲分区数"<<endl;cin >> PartitionNum;cout << "请输入空闲分区大小" << endl;for (int i = 0; i<PartitionNum; i++){cin >> FreePartition[i];}cout<<"请输入进程个数"<<endl;cin >> ProcessNum;cout<<"请输入进程名称"<<endl;for (int i = 0; i<ProcessNum; i++){cin >> ProcessName[i];}cout<<"请输入进程需要分配大小"<<endl;for (int i = 0; i<ProcessNum; i++){cin >> ProcessNeed[i];}
}void input()
{int chooseAlgorithm = 5;do{//readDataFunction();cout << "请选择实现的算法:" << endl;cout << "***** 1 - 首次适应算法 *****" << endl;cout << "***** 2 - 循环首次适应算法 *****" << endl;cout << "***** 3 - 最佳适应算法 *****" << endl;cout << "***** 4 - 最坏适应算法 *****" << endl;cout << "***** 0 - 结束 *****" << endl;cout << "chooseAlgorithm = ";cin >> chooseAlgorithm;selectAlgorithm(chooseAlgorithm);//display();} while (chooseAlgorithm);
}void initial()
{readDataFunction(); //读取原始数据for (int i = 0; i<PartitionNum; i++){LeftFreePartition[i] = FreePartition[i];for (int j = 0; j<ProcessNum; j++){NameProcessToPartition[i][j] = NULL;}}for (int i = 0; i<ProcessNum; i++){LeftProcessNeed[i] = ProcessNeed[i];}
}void FirstFit()
{cout << "***********首次适应算法***********" << endl;initial();int i, j;for (i = 0; i<ProcessNum; i++) //逐个遍历每个进程{for (j = 0; j<PartitionNum; j++){if (LeftProcessNeed[i] <= LeftFreePartition[j] && LeftFreePartition != 0) //当系统内存分区足够大的时候,即分配给进程资源{LeftFreePartition[j] -= LeftProcessNeed[i]; //扣除分配给进程的资源LeftProcessNeed[i] = 0; //当且仅当系统内存分区足够时才执行,即当前进程大小置0NameProcessToPartition[i][j] = ProcessName[i]; //存储各个进程所在的分区位置break; //!!!很重要,一个进程分区完后,应该立即break,进行下一个进程的判断}}}display();}void NextFit()
{cout << "***********循环首次适应算法***********" << endl;initial();int i, nextPoint = 0;bool isWhile;for (i = 0; i<ProcessNum; i++){isWhile = true;while (isWhile){if (LeftFreePartition[nextPoint] >= LeftProcessNeed[i]){LeftFreePartition[nextPoint] -= LeftProcessNeed[i];LeftProcessNeed[i] = 0;NameProcessToPartition[i][nextPoint] = ProcessName[i];nextPoint++;if (nextPoint > PartitionNum - 1){nextPoint = 0; //当j遍历到分区末尾的时候,返回首位置}isWhile = false;}elsenextPoint++;}}display();
}void BestFit()
{//思想:利用冒泡排序对分区大小进行排序,但不改变原分区的位置//创建一个结构体,包括分区大小和所对应的id,排序过程中,每改变顺序一次,id随着改变//关键:每次分配完一个进程的内存大小后,都要重新排序cout << "***********最佳适应算法***********" << endl;initial();int i, j, temp, tempID;sortNeed best[MAXNUMBER];for (i = 0; i<PartitionNum; i++){//初始化结构体best[i].partitionSize = FreePartition[i];best[i].id = i;}for (i = 0; i<ProcessNum; i++){for (int s = PartitionNum - 1; s > 0; s--) //冒泡排序(每次分配完一个进程后,都需要重新排序){for (int t = 0; t < s; t++){if (best[s].partitionSize < best[t].partitionSize){temp = best[s].partitionSize;best[s].partitionSize = best[t].partitionSize;best[t].partitionSize = temp;tempID = best[s].id;best[s].id = best[t].id;best[t].id = tempID;}}}for (j = 0; j<PartitionNum; j++){if (LeftProcessNeed[i] <= best[j].partitionSize){best[j].partitionSize -= LeftProcessNeed[i];LeftProcessNeed[i] = 0;NameProcessToPartition[i][best[j].id] = ProcessName[i];break;}}LeftFreePartition[best[j].id] = best[j].partitionSize;}display();
}void WorstFit()
{cout << "***********最坏适应算法***********" << endl;initial();int i, j, s, t, tempSize, tempID;sortNeed Worst[MAXNUMBER];for (i = 0; i<PartitionNum; i++){Worst[i].partitionSize = FreePartition[i];Worst[i].id = i;}for (i = 0; i<ProcessNum; i++){for (s = PartitionNum - 1; s>0; s--){for (t = 0; t<s; t++){if (Worst[s].partitionSize > Worst[t].partitionSize){tempSize = Worst[s].partitionSize;Worst[s].partitionSize = Worst[t].partitionSize;Worst[t].partitionSize = tempSize;tempID = Worst[s].id;Worst[s].id = Worst[t].id;Worst[t].id = tempID;}}}for (j = 0; j<PartitionNum; j++){if (LeftProcessNeed[i] <= Worst[j].partitionSize){Worst[j].partitionSize -= LeftProcessNeed[i];LeftProcessNeed[j] = 0;NameProcessToPartition[i][Worst[j].id] = ProcessName[i];break;}}LeftFreePartition[Worst[j].id] = Worst[j].partitionSize;}display();}void selectAlgorithm(int chooseAlgorithm)
{switch (chooseAlgorithm){case 0:break;case 1:FirstFit(); break;case 2:NextFit(); break;case 3:BestFit(); break;case 4:WorstFit(); break;default:cout << "请输入正确的序号:" << endl;}
}void display()
{int i;cout << "需要分配内存的进程名:" << setw(10);for (i = 0; i<ProcessNum; i++){cout << ProcessName[i] << setw(6);}cout << endl;cout << "需要分配内存的进程分区大小:" << setw(4);for (i = 0; i<ProcessNum; i++){cout << ProcessNeed[i] << setw(6);}cout << endl;cout << "分配结果:" << endl;cout << "分区序号:";for (i = 0; i<PartitionNum; i++){cout << "分区" << i + 1 << " ";}cout << endl << "分区大小:";for (i = 0; i<PartitionNum; i++){cout << FreePartition[i] << " ";}cout << endl << "剩余大小: ";for (i = 0; i<PartitionNum; i++){cout << LeftFreePartition[i] << " ";}cout << endl << "分配进程情况:" << endl;for (i = 0; i<PartitionNum; i++){for (int j = 0; j<ProcessNum; j++){if (NameProcessToPartition[j][i] != NULL){cout << NameProcessToPartition[j][i] << ": (分区" << i + 1 << ")" << endl;}}//cout<<" ";}cout << endl << "********结束**********" << endl;
}int main()
{input();return 0;
}
动态内存分配算法:首次适应算法,循环首次适应算法,最坏适应算法,最佳适应算法实现相关推荐
- 各种存储分配算法java代码实现_Java实现操作系统中四种动态内存分配算法:BF+NF+WF+FF...
1 概述 本文是利用Java实现操作系统中的四种动态内存分配方式 ,分别是:BF NF WF FF 分两部分,第一部分是介绍四种分配方式的概念以及例子,第二部分是代码实现以及讲解. 2 四种分配方式 ...
- 操作系统-动态内存分配算法
内存分配算法 1.首次适应算法(FF) 2.循环首次适应算法(NF) 3.最佳适应算法(BF) 4.最坏适应算法(WF) 本程序使用前端技术实现(html+css+JavaScript) 新建以下文件 ...
- Java实现操作系统中四种动态内存分配算法:BF+NF+WF+FF
1 概述 本文是利用Java实现操作系统中的四种动态内存分配方式 ,分别是: BF NF WF FF 分两部分,第一部分是介绍四种分配方式的概念以及例子,第二部分是代码实现以及讲解. 2 四种分配方式 ...
- 靠谱:保证实时的动态内存分配
五一在家没有出门,研究了一下 TLSF 动态内存分配算法. 缘起 要说清楚TLSF,得从动态内存分配开始说起.动态内存分配是所有系统中都要考虑的问题,我们从学C语言开始就知道用的malloc函数就是用 ...
- 动态内存分配(详解)
动态内存分配 1.堆内存分配 : C/C++定义了4个内存区间:代码区,全局变量与静态变量区,局部变量区即栈区,动态存储区,即堆(heap)区或自由存储区(free store). 堆的概念: 通常定 ...
- Unix/Linux操作系统分析实验二 内存分配与回收:Linux系统下利用链表实现动态内存分配
Unix/Linux操作系统分析实验一 进程控制与进程互斥 Unix/Linux操作系统分析实验三 文件操作算法: 实现在/proc目录下添加文件 Unix/Linux操作系统分析实验四 设备驱动: ...
- c语言链表动态分配内存,链表的C语言实现(含动态内存分配)
转自:http://blog.csdn.net/21aspnet/article/details/146968 链表的C语言实现(含动态内存分配) 上 链表的C语言实现之动态内存分配 一.为什么用动态 ...
- linux 在指定区域分配内存 c语言,C语言动态内存分配:(一)malloc/free的实现及malloc实际分配/释放的内存...
一.malloc/free概述 malloc是在C语言中用于在程序运行时在堆中进行动态内存分配的库函数.free是进行内存释放的库函数. 1.函数原型 #include void *malloc( s ...
- C语言动态内存分配:(一)malloc/free的实现及malloc实际分配/释放的内存
最新个人博客 shankusu.me 以下内容转载或参考或引用自 https://blog.csdn.net/zxx910509/article/details/62881131 一.malloc/f ...
- C/C++——动态内存分配
动态内存分配,就是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法.动态内存分配不像数组等静态内存分配方法那样需要预先分配存储空间,而是由系统根据程序的需要即时分配,且分配的大小就是程序 ...
最新文章
- 我为什么要做游戏化教养项目
- 利用CGMutablePathRef制作画板涂鸦
- JAVA虚拟机体系结构
- python3 sleep 并发_Python3并发写文件与Python对比
- java session 生命周期_JavaWeb关于session生命周期的几种设置方法
- 【译】 Web Components 的高级工具
- android studio 运行 Java Application
- Java文件读写操作指定编码方式防乱码
- 34Linux日期指令
- list在c语言中的作用,在C语言中大略实现VC++中的LISTARRAY功能方法(一)
- Silverlight 与 WPF 的一些差异
- BZOJ1827[USACO 2010 Mar Gold 1.Great Cow Gathering]——树形DP
- 编码器正反转识别方法
- 批量修改字幕文件中的时间,c语言实现
- Android 多媒体框架stagefright
- Rasa课程、Rasa培训、Rasa面试系列之: Rasa客户案例T-Mobile电信公司
- 检查评分汇总表缺项计算机,综合检查评分表.docx
- 计算机中丢失granny2,修复granny2.dll
- 学习典范【管理学之七】
- 【luogu P5055】【模板】可持久化文艺平衡树