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

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

首次适应算法

循环首次适应算法

最佳适应算法

对于测试样例 :

首地址        大小

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. BSGS和EXBSGS

    也许更好的阅读体验 \(Description\) 给定\(a,b,p\),求一个\(x\)使其满足\(a^x\equiv b\ \left(mod\ p\right)\) \(BSGS\) \(BS ...

  2. IDEA/WebStorm使用笔记

    1.使用powershell作为默认终端 #改变powershell策略 Set-ExecutionPolicy Unrestricted -Scope CurrentUser 找到系统的powers ...

  3. L2范数归一化概念和优势

    1 归一化处理        归一化是一种数理统计中常用的数据预处理手段,在机器学习中归一化通常将数据向量每个维度的数据映射到(0,1)或(-1,1)之间的区间或者将数据向量的某个范数映射为1,归一化 ...

  4. Python初识面向对象

    初识面向对象 面向过程 VS 面向对象 面向过程的圣墟设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西 优点是:极大的降低 ...

  5. 【转载】Session对象的作用以及常见属性

    Session对象是Asp.Net应用程序中非常重要的一个内置对象,Session是指用户从打开浏览器访问服务器到关闭浏览器之间的会话状态,在一个会话期间,服务器会自动分配一个标识SessionId. ...

  6. 【js】字符串反转(倒序)的多种处理方式

    今天发布一篇关于字符串反转的几种方式(一种问题的解决方案不是只有一种). 方式1: 这种方式比较简单,推荐使用 字符串转数组,反转数组,数组转字符串. split(""):根据空字 ...

  7. WebService 规范

    详见:https://blog.csdn.net/u011165335/article/details/51345224 JAVA 中共有三种WebService 规范,分别是JAX-WS(JAX-R ...

  8. 深入浅出Git(偏向理论)

    目录 一.理论概述 1. 什么是Git 版本控制系统分类 2. GitLab和GitHub是什么 3.Git功能 二.结合具体命令了解其工作 1.环境 2.部署 Git仓库的使用 简单命令解释 Git ...

  9. 【转载】Linux 软件安装到 /usr,/usr/local/ 还是 /opt 目录?

    Linux 的软件安装目录是也是有讲究的,理解这一点,在对系统管理是有益的 /usr:系统级的目录,可以理解为C:/Windows/ /usr/lib:理解为C:/Windows/System32. ...

  10. DNS服务——域名解析委派

    域名解析委派 域名解析委派和DNS域名解析递归查询很像,举个例子解释域名解析委派 ①假设在.net域名下有台计算机想要访问www.cac.com. ②.net这台DNS服务器不知道www.cac.co ...