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对应的地址,看看 ...
随机推荐
- Centos7+puppet+foreman,模板介绍
一.简介 provision templates 是灵活部署合适的操作系统的核心,模板包括有好几类 1.模板种类 pxe相关的模板,比如pxelinux,pxegrub,pxegrub2 kickst ...
- ef core数据迁移的一点小感悟
ef core在针对mysql数据迁移的时候,有些时候没法迁移...有两种情况没法迁移,一种是因为efcore的bug问题导致没法迁移,这个在github上有个问题集,另外一种是对数据表进行较大幅度的 ...
- AJAX with JSP and Servlet(代码)
欢迎任何形式的转载,但请务必注明出处. 本章内容来自YouTube需翻墙(点击进入视频学习) 服务器配置等可以参看我其他文章.注释等后续再加 效果图 结构 <body> <fie ...
- Java 之 ObjectInputStream 类
ObjectInputStream 类 1.概述 java.io.ObjectInputStream extends InputStream ObjectInputStream 反序列化流,将之前使用 ...
- python selenium测试用例断言
1.if ...else ...判断进行断言 #coding=utf-8 from time import * from selenium import webdriver "): driv ...
- poi 生成word 表格,并向表格单元格中插入多个图片
接这上一篇,导入数据,也要完整导出来.话不多说,直接上代码. 效果图 //根据实体对象 ,生成XWPFDocument public static XWPFDocument exportDataInf ...
- django内置缓存
由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcache中,5 ...
- nginx实现fastcgi反向代理
实现FastCGI: CGI的由来:最早的Web服务器只能简单地响应浏览器发来的HTTP请求,并将存储在服务器上的HTML文件返回给浏览器,也就是静态html文件,但是后期随着网站功能增多网站开发也越 ...
- 【问题】root账号的UID和GID永远是0吗?
参考:Does the root account always have UID/GID 0? 这实际上是2个问题 Does the superuser account always have uid ...
- tinymce + vue 富文本编辑
用texterea最多支持换行,如果文本信息想要更加丰富一些,比如增加格式样式,比如增加图片,textarea就爱莫能助了 在网上搜寻了一番,发现tinymce是比较方便好用的一款富文本编辑 http ...