动态分区分配算法

【操作系统 - 4】动态分区分配算法 【操作系统 - 4】动态分区分配算法:学习至此,发现很多学了但很久没用的知识,久而久之,慢慢遗忘。等哪天还需要的话,却发现已经忘得差不多了,即使整理了文档(word等),还是得从头再学一遍。读研第一学期,发现很多东西都可以从博客上学习到,也有不少博主呕心沥血整理了挺多有用的博文。于是,本人借此契机,也慢慢开始整理一些博文,不断改进完善中。 阅读详情

1.实验步骤:

主函数:一个菜单栏的形式,可以选择要执行的算法。
首次适应算法:每次都从开始往后找满足条件的分区。
循环首次适应算法:从前一次找到的地方往后继续找分区。
最佳适应算法:先从小到大排序,找比前一个大后一个小的分区。
2.算法描述:

1.首次适应算法:该算法从空闲分区链首开始查找,直至找到一个能满足其大小要求的空闲分区为止。然后再按照作业的大小,从该分区中划出一块内存分配给请求者,余下的空闲分区仍留在空闲分区链中。
2.循环首次适应算法:该算法是首次适应算法的变种。在分配内存空间时,不再每次从表头(链首)开始查找,而是从上次找到空闲区的下一个空闲开始查找,直到找到第一个能满足要求的的空闲区为止,并从中划出一块与请求大小相等的内存空间分配给作业。该算法能使内存中的空闲区分布得较均匀。
3.最佳适应算法: 该算法总是把既能满足要求,又是最小的空闲分区分配给作业。为了加速查找,该算法要求将所有的空闲区按其大小排序后,以递增顺序形成一个空白链。这样每次找到的第一个满足要求的空闲区,必然是最优的。孤立地看,该算法似乎是最优的,但事实上并不一定。因为每次分配后剩余的空间一定是最小的,在存储器中将留下许多难以利用的小空闲区。同时每次分配后必须重新排序,这也带来了一定的开销。

3.源代码:

#include
#include
#include
using namespace std;
struct info{
int quhao; //区号
int dress; //起始地址
int num; //大小
int free; //是否空闲
string name; //进程名
};
info IN[100]; //原始内存分配表
int Kong[100];//空闲分区表
int Ready[100];//已分配分区表

//初始化分区
void init(){
Kong[0]=0;
ifstream fen(“data.txt”);
// 从文件中导入内存分区表
for(int i=0;i<5;i++){
fen>>IN[i].quhao>>IN[i].dress>>IN[i].num>>IN[i].free;
Kong[i+1]=i;
Kong[0]+=1;
}
fen.close();
cout<<“原始内存分区”<<endl;
cout<<“区号 地址 大小 空闲”<<endl;
for(int i=0;i<5;i++){
cout<<IN[i].quhao<<" “<<IN[i].dress<<” “<<IN[i].num<<” "<<IN[i].free<<endl;
}
}

//显示空闲分区列表
void disp(){
cout<<“空闲分区列表”<<endl;
for(int i=0;i<5;i++){
if(IN[Kong[i+1]].free==1)
cout<<IN[i].quhao<<" "<<IN[i].num<<endl;
}
}

//内存紧凑
void Jin(int n){
int free=0;
for(int i=0;i<5;i++){
free+=IN[Kong[i+1]].num;
}
if(free>=n){
cout<<“通过紧凑操作后可以进行分配”<<endl;
}
}

//首次适应算法
void FirstFit(){
int n,i,flag=0;
string name;
init(); //初始化分区表
// 请求进程,直到请求的进程大小为0时停止
cout<<“请输入要申请的空间大小”<<endl;
cin>>n;
while(n){
cout<<“请输入进程名”<<endl;
cin>>name;
// 从空闲列表开始向后面查找满足条件的内存区
for(i=0;i<Kong[0];i++){
if(IN[Kong[i+1]].num>=n&&IN[Kong[i+1]].free1){
IN[Kong[i+1]].name=name;
IN[Kong[i+1]].free=0;//不空闲
IN[Kong[i+1]].num-=n;//减去空间大小
cout<<“分配区号:”<<IN[Kong[i+1]].quhao<<endl;
flag=1;
break;
}
}
// 若找不到合适的内存区则输出报错信息
if(flag
0){
cout<<“分配失败,没有合适的内存区”<<endl;
}
flag=0;
disp(); //显示现在空闲区的情况
cout<<“请输入要申请的空间大小”<<endl;
cin>>n;
}

}

//循环首次适应算法
void NextFit() {
int n,i,flag=0;
int xian;//保存上个分配区间的地址
string name;
init();
cout<<“请输入要申请的空间大小”<<endl;
cin>>n;
while(n){
cout<<“请输入进程名”<<endl;
cin>>name;
// 从上次分配的区块开始分配
for(i=xian;i<Kong[0];i++){
if(IN[Kong[i+1]].num>=n&&IN[Kong[i+1]].free1){
IN[Kong[i+1]].name=name;
IN[Kong[i+1]].free=0;
IN[Kong[i+1]].num-=n;//减去空间大小
cout<<“分配区号:”<<IN[Kong[i+1]].quhao<<endl;
xian=i;
flag=1;
break;
}
}
if(flag
0){
for(i=0;i<xian;i++){
if(IN[Kong[i+1]].num>=n&&IN[Kong[i+1]].free1){
IN[Kong[i+1]].name=name;
IN[Kong[i+1]].free=0;
IN[Kong[i+1]].num-=n;//减去空间大小
cout<<“分配区号:”<<IN[Kong[i+1]].quhao<<endl;
xian=i;
flag=1;
break;
}
}
}
if(flag
0){
cout<<“内存分配失败”<<endl;
}
disp();
cout<<“请输入要申请的空间大小”<<endl;
cin>>n;
}
}

// 按大小从小到大排序
void sort(){
int i,j;
for(i=0;i<5;i++){
for(j=1;j<5-i;j++){
if(IN[Kong[j+1]].num<IN[Kong[j]].num){
swap(Kong[j+1],Kong[j]);
}
}
}
// 显示排序后信息
cout<<“排序后的结果:”<<endl;
cout<<“区号 地址 大小 空闲”<<endl;
for(int i=0;i<5;i++){
cout<<IN[Kong[i+1]].quhao<<" “<<IN[Kong[i+1]].dress<<” “<<IN[Kong[i+1]].num<<” "<<IN[Kong[i+1]].free<<endl;
}
}

//最佳适应算法
void BestFit(){
int i,n,flag=0;
string name;
init();
sort();//给空闲分区按大小从小到大排序
cout<<“请输入要申请的空间大小”<<endl;
cin>>n;
while(n){
cout<<“请输入进程名”<<endl;
cin>>name;
if(IN[Kong[1]].num>=n){
IN[Kong[1]].name=name;
IN[Kong[1]].free=0;
IN[Kong[1]].num-=n;//减去空间大小
cout<<“分配区号:0”<<endl;
flag=1;
}
else{
for(i=1;i<Kong[0];i++){
if(IN[Kong[i+1]].num>=n&&IN[Kong[i]].num<n&&IN[Kong[i+1]].free1){
IN[Kong[i+1]].name=name;
IN[Kong[i+1]].free=0;
IN[Kong[i+1]].num-=n;//减去空间大小
cout<<“分配区号:”<<IN[Kong[i+1]].quhao<<endl;
flag=1;
break;
}
}
}
// 若找不到合适的内存区则输出报错信息
if(flag
0){
cout<<“分配失败,没有合适的内存区”<<endl;
}
flag=0;
disp(); //显示现在空闲区的情况
cout<<“请输入要申请的空间大小”<<endl;
cin>>n;
}
}

int main(){
int lx; //算法类型
cout<<“请选择一种算法:”<<endl;
cout<<“1.首次适应算法”<<endl;
cout<<“2.循环首次适应算法”<<endl;
cout<<“3.最佳适应算法”<<endl;
cout<<“0.退出”<<endl;
cin>>lx;
// 利用不同算法进行动态分区分配,直到输入为0
while(lx){
switch(lx){
case 1:FirstFit();
case 2:NextFit();
case 3:BestFit();
}
cout<<“请选择一种算法:” ;
cout<<“1.首次适应算法”<<endl;
cout<<“2.循环首次适应算法”<<endl;
cout<<“3.最佳适应算法”<<endl;
cout<<“0.退出”<<endl;
cin>>lx;
}
return 0;
}

七、操作系统——动态分区分配算法(详解) 一、引入 动态分区分配算法:在动态分区分配方式中,当很多个空闲分区都能满足需求时,应该选择哪个分区进行分配? 二、首次适应算法(First Fit) 算法思想:每次都从低地址开始查找,找到第一个能满足大小的空闲分区。 如何实现:空闲分区以地址递增的次序排列。每次分配内存时顺序查找空闲分区链(或空闲分区表),找到大小能满足要求的第一个空闲分区。 三、最佳适应算法(Best Fit) 算法思想:由于动态分区分配是一种连续分配方式,为各进程分配的空间必须是连续的一整片区域。因此为了保证当“大进程”到来时能有 阅读详情

相关推荐

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

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

upward 5万+

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

1.首次适应算法(First Fit)2.循环首次适应算法(Next Fit)3.最佳适应算法(Best Fit)4.最坏适应算法(Worst Fit)1.首次适应算法(First Fit)2.循环首次适应算法(Next Fit) 3.最佳适应算法(Best Fit) 4.最坏适应算法(Worst Fit) 1.首次适应算法(First Fit)2.循环首次适应算法(Next Fit)3.最佳适应算法(Best Fit)4.最坏适应算法(Worst Fit) (488条消息) 动态分

木牛的博客 1万+

操作系统之动态分区分配算法 (java)

(实验目的、实验原理、实验步骤、内容、程序代码、实验数据、结论等) 1.实验目的 详细了解系统之中是如何存储进程的。 通过实验加强对基于顺序搜索的动态分区分配算法的理解和掌握。 加深理解有关存储结构的概念。 主存的分配和回收的实现与主存储器的管理方式有关的,通过本实验帮助学生理解在可变分区管理方式下应怎样实现主存空间的分配和回收。 2.实验要求 代码实现四种算法 撰写课程设计报告 报告要有设计、实现、测试等过程。 3.实验过程描述 原理(思路) 态分区分配是根据进程的实际需要,动态地

zzsaixuexi的博客 4313

动态分区分配

动态分区分配 动态分区分配是根据进程的实际需要,动态的为之分配内存的空间。总体是按照算法规则找到分配的空闲分区,然后从该分区中再按照作业的大小划出一块内存空间分给作业,该分区余下的空闲分区当做一个新的空闲分区留在空闲链中。 当作业按照算法规则分配好了后,等作业运行完毕释放内存,系统根据回收区的首址,从空闲区链表中找到相应的插入点,此时可能出现以下4种情况之一: 回收区与插入点的前一个空闲分区

_淡若清风_ 2407

操作系统 连续分配存储管理方式(含动态分区分配算法)

看教材枯燥,码字记录提神,根据计算机操作系统(第四版,汤小凤)个人整理,仅作学习记录 :) 为了能将用户程序装入内存,必须为它分配一定大小的内存空间。连续分配存储管理方式是最早出现的一种存储器分配方式。 该分配方式为一个用户程序分配一个连续的内存空间,即程序中代码或数据的逻辑地址相邻,体现在内存分配时物理地址的相邻。 连续分配方式可分为四类: 单一连续分配 固定分区分配 动态分区分配 动态可重定位分区分配 1. 单一连续分配 单道程序环境下,当时的存储器管理方式是把内存分为系统区和用户区两部分。 系统

qq_45186202的博客 1万+

别再拿空气标定法糊弄了!手把手教你搞定水下相机标定(附Python代码)

本文详细解析水下相机标定的关键技术,揭示传统空气标定法失效原因,并提供基于单视点模型(SVP)的完整Python解决方案。通过折射效应分析、标定板设计优化和代码实战演示,帮助读者掌握水下标定核心方法,有效提升水下视觉系统测量精度。

weixin_30530939的博客 208

【操作系统】动态分区分配算法(附代码)

在进行内存分配时,从链首开始顺序查找,直到找到一块分区的大小可以满足需求时,按照该作业的大小,从该分区中分配出内存,将剩下的空闲分区仍然链在空闲分区链中。:将空闲分区链中的空闲分区按照空闲分区由小到大的顺序排序,从而形成空闲分区链。:分配内存时不是从链首进行查找可以分配 内存的空闲分区,而是从上一次分配内存的空闲分区的下一个分区开始查找, 直到找到可以为该进程分配内存的空闲分区。:与最佳适应算法刚好相反,将空闲分区链的分区按照从大到小的顺序排序形成空闲分区链,每次查找时只要看第一个空闲分区是否满足即可。

守夜人 6656

学术版GPT安装教程——保姆版(附带原生GPT注册教程)

学术版GPT图文安装教程

DBenD的博客 2万+

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

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

凛_Lin~~的博客 3314

AlphaFold-multimer 复合物结构预测

是DeepMind开发的AlphaFold项目的一个扩展,旨在预测蛋白质多聚体的三维结构。蛋白质多聚体是由多个蛋白质亚单位相互组装而成的结构,如酶、膜蛋白复合物和病毒颗粒。理解多聚体的结构对于揭示蛋白质的功能和相互作用非常重要。

MurphyStar的博客 5646

uniapp [全端兼容] - 实现人脸识别对比+人脸相似度,从相册选择或拍照上传两张图片进行人脸对比得到人脸相似度及判断是否是同一个人,人脸活体检测及对比(免费纯前端方案+调用第三方API接口方案)

uniApp人脸对比 人脸对比识别 人脸对比相似度,uniapp实现获取手机摄像头权限,调用相机拍照实现人脸识别相似度对比,uniapp实现人脸识别对比,计算两张人脸的相似度,从而判断是否同一个人,并给出相似度评分。uniapp H5网页如何实现人脸相似度比对,uniapp纯前端怎么对比两张图片的相似度,计算两幅图像的相似度,图像相似度对比方法,UNI-APP人脸相似度对比,快速识别两张照片的相似程度(用百分比)图片相似度对比在线测试,图片相似度对比,uniapp微信小程序人脸相似度对比分析,uniapp

🏆 前端领域优质创作者 5020

内存动态分区分配算法

所谓动态分区分配,就是指内存在初始时不会划分区域,而是会在进程装入时,根据所要装入的进程大小动态地对内存空间进行划分,以提高内存空间利用率,降低碎片的大小

qq_46138755的博客 9119

复现基于混频因子模型的GDP即时预测方法

基于混频因子模型的GDP即时预测方法复现 本文复现了混频因子模型(MIDAS)在GDP即时预测中的应用。该方法整合7个月度宏观经济变量(工业增加值、CPI、PMI等)与季度GDP数据,通过状态空间模型实现高频预测。技术实现包括:1)使用PCA提取潜在共同因子;2)构建状态空间模型处理混频数据;3)通过卡尔曼滤波进行参数估计。实证结果显示模型预测效果良好(测试集R²=0.82),其中工业增加值对因子1贡献最大(0.82),CPI对因子2贡献显著(0.78)。该方法为决策者提供了更及时的季度GDP估算。

huanghm88的专栏 601

操作系统:动态分区分配算法

目的:陆续整理近一年的学习收获                                                        动态分区分配算法 一:概念  动态分区分配是根据进程的实际需要,动态地为之分配内存空间。在实现可变分区分配时,将涉及到分区分配中所用的数据结构、分区分配算法和分区的分配与回收操作这样三个问题。    首次适应算法(First Fit):   算法...

但行好事 莫问前程 2万+

Open3d (C++) RANSAC拟合圆柱(详细过程版)

实现了一种基于RANSAC算法的圆柱拟合方法。

点云侠的博客 238

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

动态分区分配算法实现

大家好,我是何时,本人4年开发经验,专注定制项目开发[python、Java、PHP、大数据、小程序、大屏可视化、爬虫等]

weixin_52721608的博客 1985

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

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

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

weixin_48560325的博客 1万+

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

上一篇: 开中断和关中断
下一篇: win10无法进入睡眠模式的解决方法
fdt丶
博客等级 码龄9年 68粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值