设计一个可变式分区分配的存储管理方案。并模拟实现分区的分配和回收过程。

对分区的管理法可以是下面三种算法之一:

首次适应算法

循环首次适应算法

最佳适应算法

对于测试样例 :

首地址        大小

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的更多相关文章

  1. 内存分配---FF、BF、WF三种算法

    动态分区分配是根据进程的实际需要,动态的为之分配内存空间.而在实现可变分区分配时,将涉及到分区分配中 所用的数据结构.分区分配算法和分区的分配与内存回收的过程. 分区分配中的数据结构:(1)描述空闲块 ...

  2. Java实现内存分配算法 FF(首次适应算法) BF(最佳适应算法)

    一.概述 因为这次os作业对用户在控制台的输入输出有要求,所以我花了挺多的代码来完善控制台的显示. MemoryAlgorithm类里只是和控制台输入输出有关的操作,而对内存的所有逻辑操作都是用Mem ...

  3. Unity 图片的灰度处理

    我们平时在做项目时,经常遇到按钮的点击而且还要区分悬浮,点击,禁用的状态,美术要针对一张图片做多个状态图片,资源图片的数量也就增大了,那么打出的包的大小也就跟着上去了,所以我们可以针对原始图片进行Sh ...

  4. 用D3js的区域生成器实现简单波浪图

    最近做控件遇到含有波浪图的图表,一开始用Echarts虽然很快完成了,但Echarts的波浪图与其他图表的响应式不同步,于是学习了D3js,D3js写起来确实复杂一些,但能够实现的效果也更丰富,做的时 ...

  5. jpeg相关知识

    一.jpeg介绍 JPEG 是 Joint Photographic Exports Group 的英文缩写,中文称之为联合图像专家小组.该小组隶属于 ISO 国际标准化组织,主要负责定制静态数字图像 ...

  6. URL中的保留和不安全字符

    书写URL时要使用US-ASCII字符集可以显示的字符. http://www.google.com 如果需要在URL中使用不属于此字符集的字符,就要使用特殊的符号对该字符进行编码. 如:最常使用的空 ...

  7. OAF_文件系列4_实现OAF上传显示数据库动态图片Image(案例)

    20150805 Created By BaoXinjian

  8. 虚拟化之esxi命令行管理

    Vmware PowerCLI和Vmware CLI vMA A Linux virtual appliance that includes the vSphere SDK for Perl and ...

  9. 奋战5个小时解决诡异的PHP--“图像XX因其本身有错无法显示”的问题

    昨天终于将客户的一个网站迁移至虚拟主机上,满怀希望的敲入网址.唰的一声,网站很轻松的被打开了. 心里那个高兴啊~~~ 咦,怎么产品图片都没有显示出来.一块块都是空白.敲入img src对应的地址,看看 ...

随机推荐

  1. MAMP PRO 在osx 10.10 错误处理

    新更新的osx10.10之后,启动MAMP会发现Apache无法启动, 处理如下: 1.cd /Applications/MAMP/Library/bin 2.mv envvars _envvars ...

  2. entity-framework-core – 实体框架核心RC2表名称复数

    参考地址:https://docs.microsoft.com/zh-cn/ef/core/modeling/relational/tables http://www.voidcn.com/artic ...

  3. Http 和 Socket 之间的恩爱情仇

    前言 一些刚入门的小伙伴可能会用 Socket,也会用 OkHttp 或者 HttpUrlConnection 等一些 HTTP 客户端工具,这两个东西看着有点像可是又不太一样,到底是哪里不一样呢? ...

  4. css 盒子 取值

    盒子:当我们设置一个标签宽高时,默认设置的是盒子里面content大小. 内容盒:content 填充盒:content+padding(overflow截取的区域) 边框盒:content+padd ...

  5. 软件自带依赖库还是共享对象库/为什么linux发行版之间不能有一个统一的二进制软件包标准

    接前文:Linux软件包(源码包和二进制包)及其区别和特点 在前文,我们知道了linux软件包分为源码包和二进制包两种方式,而不同的发行版之间又有着自己的二进制打包格式. 首先,软件运行依赖着各种各样 ...

  6. Excel导入+写入数据库

    1.引用服务 2.前端 <h2>这里是上传Excel功能页面</h2> <div> <form action="/Improve_Excel/get ...

  7. spark 机器学习 knn 代码实现(二)

    通过knn 算法规则,计算出s2表中的员工所属的类别原始数据:某公司工资表 s1(训练数据)格式:员工ID,员工类别,工作年限,月薪(K为单位)       101       a类       8年 ...

  8. NumPy 百题大冲关,冲鸭!

    角色名称:NumPy 角色描述:NumPy是一个NASA都在用的扩展库. NumPy提供了许多高级的数值编程技能,如:矩阵数据类型.矢量处理,以及精密的运算库.专为进行严格的数字处理而战斗.是很多大型 ...

  9. 理解ld-linux.so.2

    翻译自:Understanding ld-linux.so.2 前言 ld-linux.so.2是linux的动态加载器(dynamic loader).本文试图就ld-linux.so.2如何与Li ...

  10. nginx日志配置笔记:if条件

    1.特定条件写日志: 参照: https://stackoverflow.com/questions/19011719/how-to-write-only-logs-with-200-status h ...