当前位置:   article > 正文

c++模拟实现动态分区存储管理_模拟实现动态分区存储管理 可变分区管理方式将内存除操作系统占用区域外的空间看

模拟实现动态分区存储管理 可变分区管理方式将内存除操作系统占用区域外的空间看

一、代码

  1. #include<iostream>
  2. #include<vector>
  3. #include<string>
  4. using namespace std;
  5. typedef struct memoryBlock{
  6. string jobName;
  7. int startadress;
  8. int length;
  9. bool state;
  10. }memoryBlock;
  11. vector<memoryBlock> mb;
  12. void init(){
  13. memoryBlock m1,m2,m3,m4,m5;
  14. m1.jobName="作业1";m2.jobName="作业3";m3.jobName="未分配";m4.jobName="作业2";m5.jobName="未分配";
  15. m1.state=1;m2.state=1;m3.state=0;m4.state=1;m5.state=0;
  16. m1.startadress=5;m2.startadress=10;m3.startadress=14;m4.startadress=26;m5.startadress=32;
  17. m1.length=5;m2.length=4;m3.length=12;m4.length=6;m5.length=96;
  18. mb.push_back(m1);mb.push_back(m2);mb.push_back(m3);mb.push_back(m4);mb.push_back(m5);
  19. }
  20. void firstfit(){
  21. string name;
  22. cout<<"请输入要分配的作业名称:";
  23. cin>>name;
  24. int size;
  25. cout<<"请输入作业主存量:";
  26. cin>>size;
  27. for(vector<memoryBlock>::iterator it = mb.begin();it!=mb.end();++it){
  28. int s_pos = it->startadress+size;
  29. int last_size = it->length-size;
  30. int f = 0;
  31. if(it->length>size){
  32. f=1;
  33. }
  34. if(it->state==0&&it->length>=size){
  35. it->state=1;
  36. it->length=size;
  37. it->jobName = name;
  38. if(f){
  39. memoryBlock m;
  40. m.jobName="未分配";
  41. m.length=last_size;
  42. m.state=0;
  43. m.startadress = s_pos;
  44. it++;
  45. mb.insert(it,m);
  46. }
  47. break;
  48. }
  49. }
  50. }
  51. void bestfit(){
  52. string name;
  53. cout<<"请输入要分配的作业名称:";
  54. cin>>name;
  55. int size;
  56. cout<<"请输入作业主存量:";
  57. cin>>size;
  58. int min_last=128;
  59. for(vector<memoryBlock>::iterator it = mb.begin();it!=mb.end();++it){
  60. if(it->state==0&&it->length>=size){
  61. int last_size = it->length-size;
  62. if(last_size<min_last){
  63. min_last=last_size;
  64. }
  65. }
  66. }
  67. for(vector<memoryBlock>::iterator it = mb.begin();it!=mb.end();++it){
  68. int s_pos = it->startadress+size;
  69. int last_size = it->length-size;
  70. if(last_size==min_last){
  71. it->state=1;
  72. it->length=size;
  73. it->jobName = name;
  74. if(last_size>0){
  75. memoryBlock m;
  76. m.jobName="未分配";
  77. m.length=last_size;
  78. m.state=0;
  79. m.startadress = s_pos;
  80. it++;
  81. mb.insert(it,m);
  82. }
  83. break;
  84. }
  85. }
  86. }
  87. void memoryrecycle(){
  88. cout<<"请输入要回收的作业名称:";
  89. string name;
  90. cin>>name;
  91. vector<memoryBlock>::iterator it_new;
  92. for(vector<memoryBlock>::iterator it = mb.begin();it!=mb.end();++it){
  93. if(it->jobName.compare(name)==0){
  94. it->state=0;
  95. it->jobName="未分配";
  96. it_new = it;
  97. break;
  98. }
  99. }
  100. vector<memoryBlock>::iterator it_pre=--it_new;
  101. it_new++;
  102. vector<memoryBlock>::iterator it_next=++it_new;
  103. it_new--;
  104. if(it_pre->state==1&&it_next->state==0){
  105. it_new->length+=it_next->length;
  106. mb.erase(it_next);
  107. }
  108. else if(it_pre->state==0&&it_next->state==1){
  109. it_pre->length+=it_new->length;
  110. mb.erase(it_new);
  111. }
  112. else if(it_pre->state==0&&it_next->state==0){
  113. it_pre->length+=it_new->length;
  114. it_pre->length+=it_next->length;
  115. mb.erase(it_new);
  116. mb.erase(it_next);
  117. }
  118. }
  119. void showMT(){
  120. cout<<"*********************空闲区表*********************"<<endl;
  121. cout<<"\t起止\t|\t长度\t|\t状态"<<endl;
  122. for(vector<memoryBlock>::iterator it = mb.begin();it!=mb.end();++it){
  123. if(it->state==0){
  124. cout<<"\t"<<it->startadress<<"k\t|\t"<<it->length<<"k\t|\t"<<it->jobName<<endl;
  125. }
  126. }
  127. cout<<"**************************************************"<<endl;
  128. cout<<"*********************已分配表*********************"<<endl;
  129. cout<<"\t起止\t|\t长度\t|\t名称"<<endl;
  130. for(vector<memoryBlock>::iterator it = mb.begin();it!=mb.end();++it){
  131. if(it->state==1){
  132. cout<<"\t"<<it->startadress<<"k\t|\t"<<it->length<<"k\t|\t"<<it->jobName<<endl;
  133. }
  134. }
  135. cout<<"**************************************************"<<endl;
  136. }
  137. int main(){
  138. init();
  139. cout<<"选择分配主存算法(a-首次适应算法,b-最优适应算法)"<<endl<<"请输入选择的算法:";
  140. char option1;
  141. cin>>option1;
  142. int option2;
  143. int running = 1;
  144. while(running){
  145. cout<<"选择功能项(0-退出,1-分配主存,2-回收主存,3-显示主存)"<<endl<<"请输入选择的功能:";
  146. cin>>option2;
  147. switch (option2){
  148. case 0: running = 0;break;
  149. case 1: {
  150. if(option1=='a'){
  151. firstfit();
  152. }
  153. else if(option1=='b'){
  154. bestfit();
  155. }
  156. break;
  157. }
  158. case 2: {memoryrecycle();break;}
  159. case 3: {showMT();break;}
  160. default:{
  161. cout<<"输入有误!请重新选择"<<endl;
  162. break;
  163. }
  164. }
  165. }
  166. return 0;
  167. }

二、介绍

编程实现动态分区存储管理方式的主存分配与回收。具体内容包括:首先确定主存空间分配表;然后采用最优适应算法及首次适应算法完成主存空间的分配和回收。

具体讲:

初始状态:动态分区管理方式预先不将主存划分区域。而是把主存除操作系统占用区域外的空间看作一个大的空闲区。当作业要求装入主存时,根据作业的大小查询主存内各空闲区。并按照特定的算法选择一合适的空闲区,按作业大小的要求画出一个分区并装入该作业。剩下的区域作为新的空闲区。

当作业执行完毕后,所占用的主存空间将被回收,成为一个空闲区。注意如果该空闲区的相邻分区也是空闲区,则需要将相邻空闲区合并成一个空闲区。

提示:

动态分区大小由作业需求量决定,分区的长度预先不能固定。

可建立两张分区表记录主存使用情况:

“已分配表”记录作业占用分区;“空闲区表”记录空闲区。

主程序菜单可参考:

    选择功能项(0-退出、1-分配主存、2-回收主存、3-显示主存)

    分配时,要求输入作业名和长度

    回收时,要求输入要回收的作业名

    显示主存,则显示空闲分区情况以及已分配分区情况等。

本实验模拟在两种存储管理方式下的主存分配和回收。

图例:

可变分区方式是按作业需要的主存空间大小来分割分区的。当要装入一个作业时,根据作业需要的主存量查看是否有足够的空闲空间,若有,则按需要量分割一个分区分配给该作业;若无,则作业不能装入。随着作业的装入、撤离,主存空间被分成许多个分区,有的分区被作业占用,而有的分区是空闲的。

为了说明哪些区是空闲的,可以用来装入新作业,必须要有一张空闲区说明表,格式如下:

 

起    址

长    度

状      态

第一栏

14 K

12 K

未 分 配

第二栏

32 K

96 K

未 分 配

其中,起址——指出一个空闲区的主存起始地址。

      长度——指出从起始地址开始的一个连续空闲的长度。

      状态——有两种状态,一种是“未分配”状态,指出对应的由起址指出的某个长度的区域是空闲区;另一种是“空表目”状态,表示表中对应的登记项目是空白(无效),可用来登记新的空闲区(例如,作业撤离后,它所占的区域就成了空闲区,应找一个“空表目”栏登记归还区的起址和长度且修改状态)。由于分区的个数不定,所以空闲区说明表中应有适量的状态为“空表目”的登记栏目,否则造成表格“溢出”无法登记。

上述的这张说明表的登记情况是按例所装入的三个作业占用的主存区域后填写的。

(1) 当有一个新作业要求装入主存时,必须查空闲区说明表,从中找出一个足够大的空闲区。有时找到的空闲区可能大于作业需要量,这时应把原来的空闲区变成两部分:一部分分给作业占用;另一部分又成为一个较小的空闲区。为了尽量减少由于分割造成的空闲区,而尽量保存高地址部分有较大的连续空闲区域,以利于大型作业的装入。为此,在空闲区说明表中,把每个空闲区按其地址顺序登记,即每个后继的空闲区其起始地址总是比前者大。为了方便查找还可使表格“紧缩”,总是让“空表目”栏集中在表格的后部。

(2) 采用最先适应算法(顺序分配算法)分配主存空间。

按照作业的需要量,查空闲区说明表,顺序查看登记栏,找到第一个能满足要求的空闲区。当空闲区大于需要量时,一部分用来装入作业,另一部分仍为空闲区登记在空闲区说明表中。

由于本实验是模拟主存的分配,所以把主存区分配给作业后并不实际启动装入程序装入作业,而用输出“分配情况”来代替。最先适应分配算法如图4-1。

(3) 当一个作业执行结束撤离时,作业所占的区域应该归还,归还的区域如果与其它空闲区相邻,则应合成一个较大的空闲区,登记在空闲区说明表中。例如,在提示(1)中列举的情况下,如果作业2撤离,归还所占主存区域时,应与上、下相邻的空闲区一起合成一个大的空闲区登记在空闲区说明表中。归还主存时的回收算法如图4-2。

(4) 请按最先适应算法设计主存分配和回收的程序。然后按主存中已装入三个作业,且形成两个空闲区,确定空闲区说明表的初值。现有一个需要主存量为6K的作业4申请装入主存;然后作业3撤离;再作业2撤离。请你为它们进行主存分配和回收,把空闲区说明表的初值以及每次分配或回收后的变化显示出来或打印出来。

图1:最先适应分配模拟算法

 
 

图2: 主存回收算法

 
 


 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/755576
推荐阅读
相关标签
  

闽ICP备14008679号