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对应的地址,看看 ...
随机推荐
- truncate删除一个分区,测试全局索引是否失效
目的,有一个清理数据的需求,需要删除历史的一个分区所有记录信息,但是存在主键global索引,如何更好的维护. 如下测试流程一 提前创建好一个已时间created 字段作为分区键的范围分区表 SQL& ...
- windows下搭建nginx负载均衡
学习笔记,第一次记录避免忘记 首先介绍一下本地环境是windows2008 R2-64位. 1. 到nginx官网上下载最新稳定版的安装包,http://nginx.org/en/download. ...
- intel ipp6.0安装过程
由于最近看到一个代码中使用了intel ipp6.0库,了解到,ipp6.0是一个很强大的图像处理库,将其与opencv联合使用,还能够加速opencv的处理,在图像处理的过程中,是一个很重要的工具. ...
- Django 报错总结
报错: AttributeError: 'NoneType' object has no attribute 'split' 最近在写网站中遇到一个问题,就是题目上所写的:AttributeError ...
- 十年感悟之 python之路
本文由 简悦 SimpRead 转码, 原文地址 https://laisky.com/p/python-road/ Changelog: updated at 2019/9/6 一.概述 本文起源于 ...
- iOS-CGContextRef
图形上下文(Graphics Context)---绘制目标 需要在iOS应用程序的屏幕上进行绘制时,需要先定义一个UIView类,并实现它的drawRect:方法,当启动程序时,会先调用loadVi ...
- node.js 微信开发2-消息回复、token获取、自定义菜单
项目结构 >config/wechat.json 微信公众号的配置文件 >controllers/oauth.js 微信网页授权接口(下一篇再细讲讲) >controllers/we ...
- Linux 非互联网环境安装依赖包
1 介绍 有的生产环境是没有网络的,我们部署rpm包的时候会出现缺少很多rpm包的依赖问题,都去网上下载实在太麻烦,今天介绍一个办法可以解决这一问题. 2 解决方案 找一台可以联网的机器,在上边下载相 ...
- Android笔记(十) Android中的布局——表格布局
TableLayout运行我们使用表格的方式来排列控件,它的本质依然是线性布局.表格布局采用行.列的形式来管理控件,TableLayout并不需要明确的声明包含多少行多少列,而是通过添加TableRo ...
- java - day014 - 编译期,运行期
编译期 静态成员 私有变量 成员变量 运行期 非静态方法 package day1401; public class Test1 { public static void main(String[] ...