当前位置:   article > 正文

操作系统实验报告---主存分配与回收(最佳适应算法)_实验目的 深入了解动态分区存储管理方式的主存分配回收的实现。 2.实验预备知识

实验目的 深入了解动态分区存储管理方式的主存分配回收的实现。 2.实验预备知识

   动态分区主存的分配与回收

                                                                      16网络工程二班 孙书魁

目的:

           1,了解动态分区分配中,使用的数据结构和算法

          2,深入了解动态分区存储管理方式,主存分配与回收的实现

          3,进一步加深动态分区存储管理方式及其实现过程的了解

具体实现:

            确定主存分配表,然后采用最佳适应算法,完成完成主存分配和回收,最后编写主函数,进行主函数进行测试。

具体实现:

            主存分配之前的之态,主存分配过程中的状态,回收后的状态


  1. #include <stdio.h>
  2. #include <string.h>
  3. #define MAX 600 //设置总内存大小为512k
  4. struct partition {
  5. char pn[10];//分区名字
  6. int begin;//起始地址
  7. int size;//分区大小
  8. int end;//结束地址
  9. char status;//分区状态
  10. };
  11. struct partition part[MAX];
  12. int p = 0; //标记上次扫描结束处
  13. void Init()//初始化分区地址、大小以及状态
  14. {
  15. int i;
  16. for ( i = 0; i < MAX; i++ )
  17. part[i].status = '-';
  18. strcpy( part[0].pn, "SYSTEM" );
  19. part[0].begin = 0;
  20. part[0].size = 100;
  21. part[0].status = 'u';
  22. strcpy( part[1].pn, "-----" );
  23. part[1].begin = 100;
  24. part[1].size = 100;
  25. part[1].status = 'f';
  26. strcpy( part[2].pn, "A" );
  27. part[2].begin = 200;
  28. part[2].size = 50;
  29. part[2].status = 'u';
  30. strcpy( part[3].pn, "-----" );
  31. part[3].begin = 250;
  32. part[3].size = 50;
  33. part[3].status = 'f';
  34. strcpy( part[4].pn, "B" );
  35. part[4].begin = 300;
  36. part[4].size = 100;
  37. part[4].status = 'u';
  38. strcpy( part[5].pn, "-----" );
  39. part[5].begin = 400;
  40. part[5].size = 200;
  41. part[5].status = 'f';
  42. for ( i = 0; i < MAX; i++ )
  43. part[i].end = part[i].begin + part[i].size-1;
  44. }
  45. void Output( int i ) //以行的形式输出结构体的数据
  46. {
  47. printf( "\t%s", part[i].pn );
  48. printf( "\t%d", part[i].begin );
  49. printf( "\t%d", part[i].size );
  50. printf( "\t%d", part[i].end );
  51. printf( "\t%c", part[i].status );
  52. }
  53. void display() //显示分区
  54. {
  55. int i;
  56. int n; //用n来记录分区的个数
  57. printf("\n");
  58. printf( "\n 已分配分区表Used:" );
  59. printf( "\n\tNo.\tproname\tbegin\tsize\tend\tstatus" );
  60. printf("\n");
  61. n = 1;
  62. for ( i = 0; i < MAX; i++ )
  63. {
  64. if ( part[i].status == '-' )
  65. break;
  66. if ( part[i].status == 'u' )
  67. {
  68. printf( "\n\tNo.%d", n );
  69. Output( i );
  70. n++;// 记录已分配使用的分区个数
  71. }
  72. }
  73. printf("\n");
  74. printf( "\n 空闲分区表Free:" );
  75. printf( "\n\tNo.\tproname\tbegin\tsize\tend\tstatus" );
  76. printf("\n");
  77. n = 1;
  78. for ( i = 0; i < MAX; i++ )
  79. {
  80. if ( part[i].status == '-' )
  81. break;
  82. if ( part[i].status == 'f' )
  83. {
  84. printf( "\n\tNo.%d", n );
  85. Output( i );
  86. n++; //记录空闲分区的个数
  87. }
  88. }
  89. // printf( "\n" );
  90. printf("\n");
  91. printf( "\n 内存使用情况,按起始址增长的排:" );
  92. //printf( "\n printf sorted by address:" );
  93. printf( "\n\tNo.\tproname\tbegin\tsize\tend\tstatus" );
  94. printf("\n");
  95. n = 1;
  96. for ( i = 0; i < MAX; i++ )
  97. {
  98. if ( part[i].status == '-' )
  99. break;
  100. printf( "\n\tNo.%d", n );
  101. Output( i );
  102. n++;//记录已分配分区以及空闲分区之和的总个数
  103. }
  104. getch();
  105. }
  106. void Fit( int a, char workName[], int workSize ) //新作业把一个分区分配成两个分区:已使用分区和空闲分区
  107. {
  108. int i;
  109. for ( i = MAX; i > a + 1; i-- )
  110. {
  111. //通过逆向遍历,把在a地址后的所有分区往后退一个分区,目的在于增加一个分区
  112. if ( part[i - 1].status == '-' )
  113. continue;
  114. part[i]=part[i-1];
  115. }
  116. strcpy( part[a + 1].pn, "-----" );
  117. part[a + 1].begin = part[a].begin + workSize;
  118. part[a + 1].size = part[a].size - workSize;
  119. part[a + 1].end = part[a].end-1;
  120. part[a + 1].status = 'f';
  121. strcpy( part[a].pn, workName );
  122. part[a].size = workSize;
  123. part[a].end = part[a].begin + part[a].size-1;
  124. part[a].status = 'u';
  125. }
  126. void fenpei() // 分配
  127. {
  128. int i;
  129. int a;
  130. int workSize;
  131. char workName[10];
  132. int pFree;
  133. printf( "\n请输入作业名称:" );
  134. scanf( "%s", &workName );
  135. for(i=0;i<MAX;i++)
  136. {
  137. if(!strcmp(part[i].pn,workName))//判断作业名称是否已经存在
  138. {
  139. printf("\n作业已经存在,不必再次分配!\n");
  140. return;
  141. }
  142. }
  143. printf( "请输入作业大小(k):" );
  144. scanf( "%d", &workSize );
  145. for ( i = 0; i < MAX; i++ )//通过循环在空闲区找是否有适合区间存储作业
  146. {
  147. if ( part[i].status == 'f' && part[i].size >= workSize )
  148. {
  149. pFree = i;
  150. break;
  151. }
  152. }
  153. if ( i == MAX )
  154. {
  155. printf( "\n该作业大小超出最大可分配空间" );
  156. getch();
  157. return;
  158. }
  159. for ( i = 0; i < MAX; i++ )//最佳适应算法
  160. if ( part[i].status == 'f' && part[i].size >= workSize )
  161. if ( part[pFree].size > part[i].size )
  162. pFree = i;//通过遍历所有区间,每次都找到最小空闲分区进行分配
  163. Fit( pFree, workName, workSize );
  164. printf( "\n分配成功!" );
  165. getch();
  166. }
  167. void hebing() //合并连续的空闲分区
  168. {
  169. int i = 0;
  170. while ( i != MAX - 1 )
  171. {
  172. for ( i = 0; i < MAX - 1; i++ )
  173. {
  174. if ( part[i].status == 'f' )
  175. if ( part[i + 1].status == 'f' )
  176. {
  177. part[i].size = part[i].size + part[i + 1].size;
  178. part[i].end = part[i].begin + part[i].size-1;
  179. i++;
  180. for ( i; i < MAX - 1; i++ )
  181. {
  182. if ( part[i + 1].status == '-' )
  183. {
  184. part[i].status = '-';
  185. break;
  186. }
  187. part[i]=part[i+1];
  188. }
  189. part[MAX - 1].status = '-';
  190. break;
  191. }
  192. }
  193. }
  194. }
  195. void huishou() // 回收分区
  196. {
  197. int i;
  198. int number;
  199. int n=0;
  200. printf( "\n请输入回收的分区号:" );
  201. scanf( "%d", &number );
  202. if ( number == 1 )
  203. {
  204. printf( "\n系统分区无法回收" );
  205. return;
  206. }
  207. for ( i = 0; i < MAX; i++ )//通过循环查找要回收的已使用分区区号
  208. {
  209. if ( part[i].status == 'u' )
  210. {
  211. n++;
  212. if ( n == number )
  213. {
  214. strcpy( part[i].pn, "-----" );
  215. part[i].status = 'f';
  216. }
  217. }
  218. }
  219. if ( i == MAX - 1 )
  220. {
  221. printf( "\n找不到分区" );
  222. return;
  223. }
  224. hebing();//合并连续的空闲分区
  225. printf( "\n回收成功!" );
  226. getch();
  227. }
  228. void main()
  229. {
  230. int selection;
  231. Init();
  232. printf( "初始化完成,设内存容量%dk", MAX );
  233. printf( "\n系统文件从低址存储,占%dk", part[0].size );
  234. while ( 1 )
  235. {
  236. printf( "\n----------选择----------" );
  237. printf( "\n| 0、退出系统 |" );
  238. printf( "\n| 1、显示分区 |" );
  239. printf( "\n| 2、分配分区 |" );
  240. printf( "\n| 3、回收分区 |" );
  241. printf( "\n------------------------");
  242. printf( "\n请选择 > " );
  243. while ( 1 )
  244. {
  245. scanf( "%d", &selection );
  246. if ( selection == 0 ||selection == 1 || selection == 2 || selection == 3 )
  247. break;
  248. printf( "输入错误,请重新输入:" );
  249. }
  250. switch ( selection )
  251. {
  252. case 0:
  253. exit(0); //退出系统
  254. break;
  255. case 1:
  256. display(); //显示分区
  257. break;
  258. case 2:
  259. fenpei(); //分配作业
  260. break;
  261. case 3:
  262. huishou(); //回收分区
  263. break;
  264. default:
  265. break;
  266. }
  267. }
  268. }






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

闽ICP备14008679号