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对应的地址,看看 ...
随机推荐
- CF858F Wizard's Tour
也许更好的阅读体验 \(\mathcal{Description}\) 给定一张 \(n\) 个点 \(m\) 条边的无向图,每条边连接两个顶点,保证无重边自环,不保证连通. 你想在这张图上进行若干次 ...
- 题解-APIO2019路灯
problem \(\mathtt {loj-3146}\) 题意概要:一条直线上有 \(n+1\) 个点和 \(n\) 条道路,每条道路连通相邻两个点.在 \(q\) 个时刻内,每个时刻有如下两种操 ...
- 怎样让ssh连接保持连接, 而不会因为没有操作而中断
因为安全方面的考虑, ssh服务默认在一段时间内不操作会断开连接, 解决方法修改ssh的配置文件, 让ssh每隔一段时间就自动进行一次连接, 以达到保持连接的目的. 首先找到ssh配置文件的位置: f ...
- 扩展支持全选的CheckBox列。
扩展支持全选的CheckBox列. https://www.codeproject.com/articles/42437/toggling-the-states-of-all-checkboxes-i ...
- 解决JAVA连接Sybase数据库查询数据乱码的问题
连接字符串加上charset=eucgb&jconnect_version=0例如:jdbc:sybase:Tds:server:port/database?charset=eucgb& ...
- 利用 pandas库读取excel表格数据
利用 pandas库读取excel表格数据 初入IT行业,愿与大家一起学习,共同进步,有问题请指出!! 还在为数据读取而头疼呢,请看下方简洁介绍: 数据来源为国家统计局网站下载: 具体方法 代码: i ...
- 前端框架开始学习Vue(二)
1 根据关键字实现数组的过滤 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...
- 注册码云和使用git
1.4.1 码云 注册码云 码云 填写信息注册后进入 创建仓库 问题:提交到码云的中文变成乱码 可以改变本机文件保存的编码为UTF-8即可 1.4.2 git git官网下载安装包 双击安装包开始安装 ...
- Windows Server 2008更改SID
参考:Windows Server 2012 克隆修改SID 前言 克隆(软克隆,硬克隆)虚拟机后,虚拟机不光名称一样,IP一样(设置静态IP情况下),连SID也一样 什么是SID SID 安全标识符 ...
- 【OF框架】在Visual Studio中启用Docker支持,编译生成,并在容器运行项目
准备 本地已经安装Docker 一.添加Docker支持 第一步:查看本地Docker服务状态 第二步:项目添加Docker支持 第三步:选择Linux容器 第四步:点击启动 第五步:确认Docker ...