FF,NF,BF
设计一个可变式分区分配的存储管理方案。并模拟实现分区的分配和回收过程。
对分区的管理法可以是下面三种算法之一:
首次适应算法
循环首次适应算法
最佳适应算法
对于测试样例 :
首地址 大小
123 3
125 2
213 4
作业名 大小
1 3
2 3
3 1
从123开始查找,其大小满足作业1的需求,因此直接分配,开始作业2,再从头开始,123已经不能再分配,查找125,125由于被占用了1个地址单元,可以利用的只有1个地址单元,继续寻找,213满足,分配,开始作业3,此时125刚好满足,只不过地址是从126开始的。
代码:
#include <iostream>
#include <cstring>
#define Max_num 10
#define Max_job_num 10 using namespace std; struct partition
{
int address;
int size;
bool state;
partition& operator = (partition& B)
{
this->address = B.address;
this->size = B.size;
this->state = B.state;
return *this;
}
}; typedef struct
{
string name;
int size;
} job; typedef struct
{
partition data[];
} Singlypartition; typedef struct
{
job data[];
} Singlyjob; Singlypartition p;
Singlyjob j;
int part_num,job_num;
int address[];
int address1[]; void init()
{
for(int i = ; i<; i++)
{
p.data[i].size = ;
j.data[i].size = ;
}
cout<<"input the number of partition(less than 10) : ";
cin>>part_num;
if(part_num > )
{
cout<<"out of boundary";
return;
}
for(int i = ; i<part_num; i++)
{
cout<<"starting address: ";
cin>>p.data[i].address;
cout<<"the NO."<<i+<<" size: ";
cin>>p.data[i].size;
p.data[i].state = true;
}
cout<<"input the number of job(less than 10) : ";
cin>>job_num;
if(job_num > )
{
cout<<"out of boundary";
return;
}
for(int i = ; i<job_num; i++)
{
cout<<"job's name: ";
cin>>j.data[i].name;
cout<<"size: ";
cin>>j.data[i].size;
}
} void sort()
{
for(int i = ; i<part_num - ; i++)
{
for(int k = i; k<part_num; k++)
{
if(p.data[i].size > p.data[k].size)
swap(p.data[i],p.data[k]);
} }
} bool find(int ad,int js)
{
for(int i = ;i<;i++)
{
if(address[i] - ad >= js && address1[i] < ad && address[i] != -)
return true;
}
return false;
} bool jud(int ad,int js)
{
for(int i = ;i<;i++)
{
if(ad + js > address1[i] && ad < address1[i] && address1[i] != -)
return true;
}
return false;
} void FF()
{
int index = ;
while()
{
int judge = ;
if(index == job_num)
return;
int i;
for(i = ; i<part_num; i++)
{
if(p.data[i].state == true && p.data[i].size >= j.data[index].size
&& !jud(p.data[i].address,j.data[index].size)
&& !find(p.data[i].address,j.data[index].size))
{
address1[index] = p.data[i].address;
p.data[i].state = false;
cout<<"partition address "<<"partition size "
<<"job name "<<"job size "<<"partition state"<<endl;
cout<<" "<<p.data[i].address<<" "<<p.data[i].size
<<" "<<j.data[index].name
<<" "<<j.data[index].size<<" "
<<"have been allocated"<<endl;
address[index] = p.data[i].address + j.data[index].size;
i = part_num;
judge = ;
}
else
continue;
}
if(judge == )
cout<<"can not allocate: "<<j.data[index].name<<endl;
index++;
}
} void NF()
{
int index = ;
int signal = ;
int judge = ;
int i = ;
int k = ;
int index1 = ;
while(index != job_num)
{
i = signal;
index1 = ;
while(p.data[i].size != && index1 <= index)
{
if(p.data[i].state == true && p.data[i].size >= j.data[index].size
&& !jud(p.data[i].address,j.data[index].size)
&& !find(p.data[i].address,j.data[index].size))
{
address1[index] = p.data[i].address;
p.data[i].state = false;
cout<<"partition address "<<"partition size "
<<"job name "<<"job size "<<"partition state"<<endl;
cout<<" "<<p.data[i].address<<" "<<p.data[i].size
<<" "<<j.data[index].name
<<" "<<j.data[index].size<<" "
<<"have been allocated"<<endl;
address[index] = p.data[i].address + j.data[index].size;
i++;
signal = i;
judge = ;
break;
}
else
{
swap(p.data[i],p.data[k+part_num]);
i++;
k++;
signal = i;
index1++;
}
}
if(judge == )
cout<<"can not allocate: "<<j.data[index].name<<endl;
index++;
judge = ;
}
} void BF()
{
sort();
FF();
} int main()
{
int k;
cout<<"\t1.FF"<<endl<<"\t2.NF"<<endl<<"\t3.BF"<<endl<<"\t4.quit"<<endl;
cout<<"please choose: ";
cin>>k;
memset(address,-,sizeof(address));
memset(address1,-,sizeof(address1));
switch(k)
{
case :
init();
FF();
break;
case :
init();
NF();
break;
case :
init();
BF();
break;
case :
break;
default:
break;
}
return ;
}
FF,NF,BF的更多相关文章
- 内存分配---FF、BF、WF三种算法
动态分区分配是根据进程的实际需要,动态的为之分配内存空间.而在实现可变分区分配时,将涉及到分区分配中 所用的数据结构.分区分配算法和分区的分配与内存回收的过程. 分区分配中的数据结构:(1)描述空闲块 ...
- Java实现内存分配算法 FF(首次适应算法) BF(最佳适应算法)
一.概述 因为这次os作业对用户在控制台的输入输出有要求,所以我花了挺多的代码来完善控制台的显示. MemoryAlgorithm类里只是和控制台输入输出有关的操作,而对内存的所有逻辑操作都是用Mem ...
- Unity 图片的灰度处理
我们平时在做项目时,经常遇到按钮的点击而且还要区分悬浮,点击,禁用的状态,美术要针对一张图片做多个状态图片,资源图片的数量也就增大了,那么打出的包的大小也就跟着上去了,所以我们可以针对原始图片进行Sh ...
- 用D3js的区域生成器实现简单波浪图
最近做控件遇到含有波浪图的图表,一开始用Echarts虽然很快完成了,但Echarts的波浪图与其他图表的响应式不同步,于是学习了D3js,D3js写起来确实复杂一些,但能够实现的效果也更丰富,做的时 ...
- jpeg相关知识
一.jpeg介绍 JPEG 是 Joint Photographic Exports Group 的英文缩写,中文称之为联合图像专家小组.该小组隶属于 ISO 国际标准化组织,主要负责定制静态数字图像 ...
- URL中的保留和不安全字符
书写URL时要使用US-ASCII字符集可以显示的字符. http://www.google.com 如果需要在URL中使用不属于此字符集的字符,就要使用特殊的符号对该字符进行编码. 如:最常使用的空 ...
- OAF_文件系列4_实现OAF上传显示数据库动态图片Image(案例)
20150805 Created By BaoXinjian
- 虚拟化之esxi命令行管理
Vmware PowerCLI和Vmware CLI vMA A Linux virtual appliance that includes the vSphere SDK for Perl and ...
- 奋战5个小时解决诡异的PHP--“图像XX因其本身有错无法显示”的问题
昨天终于将客户的一个网站迁移至虚拟主机上,满怀希望的敲入网址.唰的一声,网站很轻松的被打开了. 心里那个高兴啊~~~ 咦,怎么产品图片都没有显示出来.一块块都是空白.敲入img src对应的地址,看看 ...
随机推荐
- Nokia5130不能上网
说明 我是一个挺怀旧的人,一直想入手一个好几年前买的Nokia5130. 于是昨天在淘宝上买了一个,花了我一百多.不过早就停产了,买到的自然是翻新机. 收到货的时候,看似一切美好,但是下载了个uc的j ...
- babel tsc webpack
我要用啥?js的话:babel编译+webpack模块打包ts的话:tsc编译成js+babel编译+webpack模块打包浏览器情况:如果您的浏览器支持es6所有语法那么就可以只用webpack来处 ...
- Luogu3824 [NOI2017]泳池 【多项式取模】【递推】【矩阵快速幂】
题目分析: 用数论分块的思想,就会发现其实就是连续一段的长度$i$的高度不能超过$\lfloor \frac{k}{i} \rfloor$,然后我们会发现最长的非$0$一段不会超过$k$,所以我们可以 ...
- Web Scraper 翻页——控制链接批量抓取数据(Web Scraper 高级用法)| 简易数据分析 05
这是简易数据分析系列的第 5 篇文章. 上篇文章我们爬取了豆瓣电影 TOP250 前 25 个电影的数据,今天我们就要在原来的 Web Scraper 配置上做一些小改动,让爬虫把 250 条电影数据 ...
- vmware vSphere Data Protection 6.1--------2-初始化
一.简介 安装完vdp接下来就是部署初始化了 安装篇请参考:vmware vSphere Data Protection 6.1部署 二.开始初始化 登陆https://192.168.216.200 ...
- (转) [组合数学] 第一类,第二类Stirling数,Bell数
一.第二类Stirling数 定理:第二类Stirling数S(p,k)计数的是把p元素集合划分到k个不可区分的盒子里且没有空盒子的划分个数. 证明:元素在哪些盒子并不重要,唯一重要的是各个盒子里装的 ...
- JQuery 的优先级
1.使用最新的jQuery版本 2.用对选择器. 2.1 jquery最快的选择器是ID选择器:来源于js的getElementById()方法 注释:需要选择多个元素,必然涉及到Dom遍历和循环 ...
- MACOS 安装mysqlclient 的 Library not loaded错误
报错场景 >>> import MySQLdb Traceback (most recent call last): File "<stdin>", ...
- linux查看日志报错
查看运行时错误: tail -f catalina.out | grep -C 10 'Exception' 10是行数: 单引号里面的是要查找的关键字:
- Shiro安全框架入门使用方法
详见:https://blog.csdn.net/qq_32651225/article/details/77199464 框架介绍Apache Shiro是一个强大且易用的Java安全框架,执行身份 ...