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

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

首次适应算法

循环首次适应算法

最佳适应算法

对于测试样例 :

首地址        大小

123            3

125            2

213            4

作业名        大小

1             3

2             3

3             1

从123开始查找,其大小满足作业1的需求,因此直接分配,开始作业2,再从头开始,123已经不能再分配,查找125,125由于被占用了1个地址单元,可以利用的只有1个地址单元,继续寻找,213满足,分配,开始作业3,此时125刚好满足,只不过地址是从126开始的。

代码:

  1. #include <iostream>
  2. #include <cstring>
  3. #define Max_num 10
  4. #define Max_job_num 10
  5.  
  6. using namespace std;
  7.  
  8. struct partition
  9. {
  10. int address;
  11. int size;
  12. bool state;
  13. partition& operator = (partition& B)
  14. {
  15. this->address = B.address;
  16. this->size = B.size;
  17. this->state = B.state;
  18. return *this;
  19. }
  20. };
  21.  
  22. typedef struct
  23. {
  24. string name;
  25. int size;
  26. } job;
  27.  
  28. typedef struct
  29. {
  30. partition data[];
  31. } Singlypartition;
  32.  
  33. typedef struct
  34. {
  35. job data[];
  36. } Singlyjob;
  37.  
  38. Singlypartition p;
  39. Singlyjob j;
  40. int part_num,job_num;
  41. int address[];
  42. int address1[];
  43.  
  44. void init()
  45. {
  46. for(int i = ; i<; i++)
  47. {
  48. p.data[i].size = ;
  49. j.data[i].size = ;
  50. }
  51. cout<<"input the number of partition(less than 10) : ";
  52. cin>>part_num;
  53. if(part_num > )
  54. {
  55. cout<<"out of boundary";
  56. return;
  57. }
  58. for(int i = ; i<part_num; i++)
  59. {
  60. cout<<"starting address: ";
  61. cin>>p.data[i].address;
  62. cout<<"the NO."<<i+<<" size: ";
  63. cin>>p.data[i].size;
  64. p.data[i].state = true;
  65. }
  66. cout<<"input the number of job(less than 10) : ";
  67. cin>>job_num;
  68. if(job_num > )
  69. {
  70. cout<<"out of boundary";
  71. return;
  72. }
  73. for(int i = ; i<job_num; i++)
  74. {
  75. cout<<"job's name: ";
  76. cin>>j.data[i].name;
  77. cout<<"size: ";
  78. cin>>j.data[i].size;
  79. }
  80. }
  81.  
  82. void sort()
  83. {
  84. for(int i = ; i<part_num - ; i++)
  85. {
  86. for(int k = i; k<part_num; k++)
  87. {
  88. if(p.data[i].size > p.data[k].size)
  89. swap(p.data[i],p.data[k]);
  90. }
  91.  
  92. }
  93. }
  94.  
  95. bool find(int ad,int js)
  96. {
  97. for(int i = ;i<;i++)
  98. {
  99. if(address[i] - ad >= js && address1[i] < ad && address[i] != -)
  100. return true;
  101. }
  102. return false;
  103. }
  104.  
  105. bool jud(int ad,int js)
  106. {
  107. for(int i = ;i<;i++)
  108. {
  109. if(ad + js > address1[i] && ad < address1[i] && address1[i] != -)
  110. return true;
  111. }
  112. return false;
  113. }
  114.  
  115. void FF()
  116. {
  117. int index = ;
  118. while()
  119. {
  120. int judge = ;
  121. if(index == job_num)
  122. return;
  123. int i;
  124. for(i = ; i<part_num; i++)
  125. {
  126. if(p.data[i].state == true && p.data[i].size >= j.data[index].size
  127. && !jud(p.data[i].address,j.data[index].size)
  128. && !find(p.data[i].address,j.data[index].size))
  129. {
  130. address1[index] = p.data[i].address;
  131. p.data[i].state = false;
  132. cout<<"partition address "<<"partition size "
  133. <<"job name "<<"job size "<<"partition state"<<endl;
  134. cout<<" "<<p.data[i].address<<" "<<p.data[i].size
  135. <<" "<<j.data[index].name
  136. <<" "<<j.data[index].size<<" "
  137. <<"have been allocated"<<endl;
  138. address[index] = p.data[i].address + j.data[index].size;
  139. i = part_num;
  140. judge = ;
  141. }
  142. else
  143. continue;
  144. }
  145. if(judge == )
  146. cout<<"can not allocate: "<<j.data[index].name<<endl;
  147. index++;
  148. }
  149. }
  150.  
  151. void NF()
  152. {
  153. int index = ;
  154. int signal = ;
  155. int judge = ;
  156. int i = ;
  157. int k = ;
  158. int index1 = ;
  159. while(index != job_num)
  160. {
  161. i = signal;
  162. index1 = ;
  163. while(p.data[i].size != && index1 <= index)
  164. {
  165. if(p.data[i].state == true && p.data[i].size >= j.data[index].size
  166. && !jud(p.data[i].address,j.data[index].size)
  167. && !find(p.data[i].address,j.data[index].size))
  168. {
  169. address1[index] = p.data[i].address;
  170. p.data[i].state = false;
  171. cout<<"partition address "<<"partition size "
  172. <<"job name "<<"job size "<<"partition state"<<endl;
  173. cout<<" "<<p.data[i].address<<" "<<p.data[i].size
  174. <<" "<<j.data[index].name
  175. <<" "<<j.data[index].size<<" "
  176. <<"have been allocated"<<endl;
  177. address[index] = p.data[i].address + j.data[index].size;
  178. i++;
  179. signal = i;
  180. judge = ;
  181. break;
  182. }
  183. else
  184. {
  185. swap(p.data[i],p.data[k+part_num]);
  186. i++;
  187. k++;
  188. signal = i;
  189. index1++;
  190. }
  191. }
  192. if(judge == )
  193. cout<<"can not allocate: "<<j.data[index].name<<endl;
  194. index++;
  195. judge = ;
  196. }
  197. }
  198.  
  199. void BF()
  200. {
  201. sort();
  202. FF();
  203. }
  204.  
  205. int main()
  206. {
  207. int k;
  208. cout<<"\t1.FF"<<endl<<"\t2.NF"<<endl<<"\t3.BF"<<endl<<"\t4.quit"<<endl;
  209. cout<<"please choose: ";
  210. cin>>k;
  211. memset(address,-,sizeof(address));
  212. memset(address1,-,sizeof(address1));
  213. switch(k)
  214. {
  215. case :
  216. init();
  217. FF();
  218. break;
  219. case :
  220. init();
  221. NF();
  222. break;
  223. case :
  224. init();
  225. BF();
  226. break;
  227. case :
  228. break;
  229. default:
  230. break;
  231. }
  232. return ;
  233. }

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. CF858F Wizard's Tour

    也许更好的阅读体验 \(\mathcal{Description}\) 给定一张 \(n\) 个点 \(m\) 条边的无向图,每条边连接两个顶点,保证无重边自环,不保证连通. 你想在这张图上进行若干次 ...

  2. 题解-APIO2019路灯

    problem \(\mathtt {loj-3146}\) 题意概要:一条直线上有 \(n+1\) 个点和 \(n\) 条道路,每条道路连通相邻两个点.在 \(q\) 个时刻内,每个时刻有如下两种操 ...

  3. 怎样让ssh连接保持连接, 而不会因为没有操作而中断

    因为安全方面的考虑, ssh服务默认在一段时间内不操作会断开连接, 解决方法修改ssh的配置文件, 让ssh每隔一段时间就自动进行一次连接, 以达到保持连接的目的. 首先找到ssh配置文件的位置: f ...

  4. 扩展支持全选的CheckBox列。

    扩展支持全选的CheckBox列. https://www.codeproject.com/articles/42437/toggling-the-states-of-all-checkboxes-i ...

  5. 解决JAVA连接Sybase数据库查询数据乱码的问题

    连接字符串加上charset=eucgb&jconnect_version=0例如:jdbc:sybase:Tds:server:port/database?charset=eucgb& ...

  6. 利用 pandas库读取excel表格数据

    利用 pandas库读取excel表格数据 初入IT行业,愿与大家一起学习,共同进步,有问题请指出!! 还在为数据读取而头疼呢,请看下方简洁介绍: 数据来源为国家统计局网站下载: 具体方法 代码: i ...

  7. 前端框架开始学习Vue(二)

    1 根据关键字实现数组的过滤 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...

  8. 注册码云和使用git

    1.4.1 码云 注册码云 码云 填写信息注册后进入 创建仓库 问题:提交到码云的中文变成乱码 可以改变本机文件保存的编码为UTF-8即可 1.4.2 git git官网下载安装包 双击安装包开始安装 ...

  9. Windows Server 2008更改SID

    参考:Windows Server 2012 克隆修改SID 前言 克隆(软克隆,硬克隆)虚拟机后,虚拟机不光名称一样,IP一样(设置静态IP情况下),连SID也一样 什么是SID SID 安全标识符 ...

  10. 【OF框架】在Visual Studio中启用Docker支持,编译生成,并在容器运行项目

    准备 本地已经安装Docker 一.添加Docker支持 第一步:查看本地Docker服务状态 第二步:项目添加Docker支持 第三步:选择Linux容器 第四步:点击启动 第五步:确认Docker ...