一、 实验目的

为了合理地分配和使用这些存储空间,当用户提出申请主存储器空间时,存储管理必须根据申请者的要求,按一定的策略分析主存空间和使用情况,找出足够 的空闲区域给申请者。当作业撤离归还主存资源时,则存储管理要收回占用的主存空间。主存的分配和回收的实现是与主存储器的管理方式有关的,通过本实验帮助 我们理解在不同的存储管理方式下应怎样实现主存空间的分配和回收。

用高级语言完成一个主存空间的分配和回收模拟程序,以加深对内存分配方式及其算法的理解。

二、实验内容和要求

2.1  模拟包括3部分:

1)实现特定的内存分配算法

2)实现内存回收模拟

3)每种内存分配策略对应的碎片数统计

2.2  固定分区存储管理

假设内存容量为120KB,并且分别划分成8,16,32,64KB大小的块各一块。

一个进程所需要的内存为0到100个KB。同时假设一个进程在运行过程中所需内存的大小不变。

模拟五个进程到达请求分配与运行完回收情况,输出主存分配表.

2.3  动态分区分配存储管理

采用连续分配方式之动态分区分配存储管理,使用首次适应算法、下次适应算法、最佳适应算法和最坏适应算法4种算法完成设计(任选两种算法)。

(1)在程序运行过程,由用户指定申请与释放。

(2)设计一个已占用分区表,以保存某时刻主存空间占用情况。

(3)设计一个空闲分区表,以保存某时刻主存空间剩余情况。

(4)用两个表的变化情况,反应各进程所需内存的申请与释放情况。

三、实验方法、步骤及结果测试

3.1 源程序名:1230.c

      可执行程序名:1230.exe

3.2 原理分析及流程图

3.3 主要程序段及其解释:

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <string.h>
  4 const int CANUSE = 1;
  5 const int CANTUSE = 0;
  6 //#define  MSIZE  128;
  7 const int MSIZE = 128;
  8
  9
 10 //内存分区
 11 struct MZone
 12 {
 13        //空闲区起始地址
 14     int begin_addr;
 15        //一个连续空闲区的长度
 16     int length;
 17        //状态
 18     int state;
 19        //内存中任务名
 20     char task_name[32];
 21        //指向下一个空闲分区
 22     struct MZone *next;
 23 };
 24
 25 //内存头指针
 26 struct MZone *Mhead = NULL;
 27
 28 //showmemory函数,显示当前内存分配情况
 29 void showmemory()
 30 {
 31      struct MZone *Mpoint = Mhead;
 32
 33      printf("内存的使用情况\n");
 34      printf("beginaddr\tlength\tstate\ttask\n");
 35
 36      while( NULL!=Mpoint)
 37      {
 38          printf("%dk\t\t",Mpoint->begin_addr);
 39          printf("%dk\t",Mpoint->length);
 40          Mpoint->state?printf("CANUSE\t"):printf("CANTUSE\t");
 41          printf("%s\n",Mpoint->task_name);
 42          Mpoint = Mpoint->next;
 43      }
 44
 45      system("pause");
 46
 47 }
 48
 49 //memoallocate函数,用于分配内存
 50 void memoallocate(void)
 51 {
 52      struct MZone *Mnew = (struct MZone*)malloc(sizeof(struct MZone));
 53      printf("输入要分配内存大小(kb):\n");
 54      scanf("%d",&Mnew->length);
 55      printf("输入任务名:\n");
 56      scanf("%s",&Mnew->task_name);
 57      Minsert(Mnew)?printf("分配内存成功\n"):printf("没有符合大小的空闲分区,内存分配失败。\n");
 58      system("pause");
 59      free(Mnew);
 60 }
 61
 62 //Minsert函数,功能插入任务到空闲分区
 63 int Minsert(struct MZone* Mnew)
 64 {
 65
 66      struct MZone *Zinsert = Mhead;
 67      //flag用于指示是Zinsert到了NULL,既没有内存可以分配
 68      int flag = 1;
 69
 70      while( Zinsert->length<Mnew->length || !Zinsert->state)
 71      {
 72              if( NULL!=Zinsert->next )
 73              {
 74                 Zinsert = Zinsert->next;
 75              }
 76              else
 77              {
 78                  Zinsert = Zinsert->next;
 79                  break;
 80              }
 81
 82      }
 83
 84      if( NULL==Zinsert )
 85      {
 86          return 0;
 87      }
 88
 89      if( MSIZE == Zinsert->begin_addr+Mnew->length )
 90      {
 91           Zinsert->state = CANTUSE;
 92           strcpy(Zinsert->task_name , Mnew->task_name);
 93           Zinsert->next = NULL;
 94           return 1;
 95      }
 96      else
 97      {
 98          struct MZone *Ztail = (struct MZone *)malloc(sizeof(struct MZone));
 99          Zinsert->state = CANTUSE;
100          strcpy(Zinsert->task_name , Mnew->task_name);
101          Zinsert->length = Mnew->length;
102          Zinsert->next = Ztail;
103
104          memset( Ztail, 0, sizeof(char)*32 );
105          Ztail->begin_addr = Zinsert->begin_addr + Mnew->length;
106          Ztail->state = CANUSE;
107          Ztail->length = MSIZE - Ztail->begin_addr;
108          Ztail->next = NULL;
109
110          return 1;
111      }
112 }
113
114 //memoreturn函数,用于回收内存
115 void memoreturn(void)
116 {
117      char tname[32];
118      printf("输入要收回的任务名\n");
119      scanf("%s",tname);
120      Mreturn(tname);
121      system("pause");
122 }
123
124 //Mreturn函数,功能回收内存
125 int Mreturn(char taskname[])
126 {
127     struct MZone *front = NULL;
128     struct MZone *position = Mhead;
129     struct MZone *tail = Mhead->next;
130
131     while( 0!=strcmp(position->task_name,taskname) )
132     {
133            front = position;
134            if( NULL!=position->next )
135            {
136                position = position->next;
137            }
138            else
139            {
140                position = NULL;
141                break;
142            }
143            tail = position->next;
144     }
145
146     if( NULL==position )
147     {
148         printf("内存中没有此任务!");
149     }
150     else
151     {
152       //不能用CANTUSE
153       if( NULL!=tail&&NULL!=front )
154        {
155
156             if( front->state&&tail->state )
157             {
158                 front->length = front->length + position->length + tail->length;
159                 front->next = tail->next;
160                 free(position);
161                 free(tail);
162             }
163             else if( front->state&&!tail->state )
164             {
165                 front->length = front->length + position->length;
166                 front->next = position->next;
167                 free(position);
168             }
169             else if( !front->state&&tail->state )
170             {
171                 position->length = position->length + tail->length;
172                 memset( position->task_name, 0, sizeof(char)*32 );
173                 position->next = tail->next;
174                 position->state = CANUSE;
175                 free(tail);
176             }
177             else if( !front->state&&!tail->state )
178             {
179                 memset( position->task_name, 0, sizeof(char)*32 );
180                 position->state = CANUSE;
181             }
182        }
183        else if( NULL!=tail&&NULL==front )
184        {
185          if( !tail->state )
186           {
187              memset( position->task_name, 0, sizeof(char)*32 );
188              position->state = CANUSE;
189           }
190           else
191           {
192              position->length = position->length + tail->length;
193              position->next = NULL;
194              free(tail);
195           }
196        }
197        else if( NULL==tail&&NULL!=front )
198        {
199          if(front->state)
200           {
201               front->length = front->length + position->length;
202               front->next = NULL;
203               free(position);
204           }
205           else
206           {
207               memset( position->task_name, 0, sizeof(char)*32 );
208               position->state = CANUSE;
209           }
210        }
211        else if( NULL==tail&&NULL==front )
212        {
213             memset( position->task_name, 0, sizeof(char)*32 );
214             position->state = CANUSE;
215        }
216     printf("内存回收成功!\n");
217    }
218 }
219
220 int main(void)
221 {
222      int func_ = 0;
223
224      //初始化Mhead
225      Mhead = (struct MZone*)malloc(sizeof(struct MZone));
226      Mhead->begin_addr = 0;
227      Mhead->length = MSIZE;
228      Mhead->state = CANUSE;
229      memset(Mhead->task_name, 0, sizeof(char)*32 );
230      Mhead->next = NULL;
231
232      while( 1 )
233      {
234            printf("******************首次适应算法实现主存分配和回收系统(内存)***************\n");
235            printf("1:查看内存分配情况\n");
236            printf("2:申请分配内存\n");
237            printf("3:申请回收内存\n");
238            printf("4:退出程序\n");
239            printf("~~~~~~~~~~~~~~~~~");
240            scanf("%d",&func_);
241            switch( func_ )
242            {
243                    case 1 :showmemory();break;
244                    case 2 :memoallocate();break;
245                    case 3 :memoreturn();break;
246                    case 4 :return 1;
247            }
248            system("cls");
249      }
250 }

四、 实验总结

转载于:https://www.cnblogs.com/1994-ann/p/5089979.html

39,叶慧敏 实验四 主存空间的分配和回收模拟相关推荐

  1. 实验四 主存空间的分配和回收

    实验四 主存空间的分配和回收 一.目的和要求 1.1. 实验目的 用高级语言完成一个主存空间的分配和回收程序,以加深对动态分区分配方式及其算法的理解. 1.2. 实验要求 采用连续分配方式之动态分区分 ...

  2. 实验四、主存空间的分配和回收模拟

    实验四.主存空间的分配和回收模 物联网工程  王鸾  201306104128 一.        实验目的        为了合理地分配和使用这些存储空间,当用户提出申请主存储器空间时,存储管理必须 ...

  3. 《操作系统》实验报告——主存空间的分配与回收

    理论知识 Linux--Linux C语言编程基础知识 一.实验目的 采用可变式分区管理,使用最佳适应算法实现主存的分配与回收. 通过本次实验,帮助学生理解在可变式分区管理方式下,如何实现主存空间的分 ...

  4. 操作系统——实验叁——主存空间的分配与回收

    一. 实验目的 采用可变式分区管理,使用最佳适应算法实现主存的分配与回收 通过本次实验,帮助学生理解在可变式分区管理方式下,如何实现主存空间的分配与回收. 二. 实验内容 主存是中央处理机能直接存取指 ...

  5. 操作系统实验三:主存空间的分配与回收

    实验三:主存空间的分配与回收 一.实验目的 通过本次实验,帮助学生理解在可变式分区管理方式下,如何实现主存空间的分配与回收. 二.实验内容 主存是中央处理机能直接存取指令和数据的存储器.能否合理而有效 ...

  6. 【操作系统】主存空间的分配和回收

    实验一.主存空间的分配和回收实验 专业:商业软件工程  姓名:杨晶晶  学号:201406114102 一.        实验目的 用高级语言完成一个主存空间的分配和回收程序,以加深对动态分区分配方 ...

  7. linux课程设计题目主存空间的分配与回收,可变分区分配与回收,哈尔滨理工大学操作系统课程设计报告.doc-资源下载在线文库www.lddoc.cn...

    可变分区分配与回收,哈尔滨理工大学 操作系统课程设计报告.doc 哈 尔 滨 理 工 大 学 课 程 设 计 ( 操 作 系 统 ) 题 目 可变分区分配与回收 (首次适应算法) 班 级 计算机科学与 ...

  8. 天津理工大学《操作系统》实验二,存储器的分配与回收算法实现,代码详解,保姆式注释讲解

    天津理工大学<操作系统>实验二,存储器的分配与回收算法实现,代码详解,保姆式注释讲解 实验内容 1. 本实验是模拟操作系统的主存分配,运用可变分区的存储管理算法设计主存分配和回收程序,并不 ...

  9. 六、操作系统——内存管理的概念(空间的分配与回收、空间的扩充、地址转换、存储保护)

    一.概述 二.操作系统作为系统资源的管理者,当然也需要对内存进行管理,要管些什么呢? 1. 内存空间的分配与回收 连续分配:指为用户进程分配的必须是一个连续的内存空间. 1. 单一连续分配 在单一连续 ...

最新文章

  1. Oracle包和包体以及与非包体定义函数、过程的区别
  2. 前端学习(1402):多人管理22验证joi
  3. 论文浅尝 | 利用 KG Embedding 进行问题回答
  4. 轻松解决Android gradle太慢问题
  5. Python的小整数对象池
  6. shell--6、Shell printf 命令
  7. SSD目标检测网络模型详细介绍
  8. windows 域介绍
  9. 徐州2018年大学计算机比赛,2018年第四届徐州市中小学生学科综合能力大赛获奖名单!权威发布!【五年级】...
  10. 【浪漫程序员系列】情人节给女友写代码表达爱意,让她感动到哭
  11. 效率源linux,FLOOPY效率源硬盘坏道修复工具 修复坏硬盘的时候 为何只能手动修复 而自动修复又说找不到硬盘?...
  12. 在centos7下安装云锁
  13. 3.3 CPU共享功能
  14. 算法的时间复杂度比较,计算多项式的直接法和秦九韶法
  15. Github/gitee 上传文件最大100MB限制this exceeds file size limit of 100.0 MB
  16. 为什么 JSON 不支持注释?
  17. 非零基础自学Golang 第1章 走进Go 1.2 Go语言官方文档 1.3 学好Go 的建议
  18. 华为云,用科技开启智慧化生活
  19. Vb.net发送腾讯云短信
  20. 深度桌面版中文Linux,【LinuxDeepin下载】LinuxDeepin(深度科技Linux操作系统) V20 官方最新版-开心电玩...

热门文章

  1. 22、Windows10下局域网的两台电脑间传输文件
  2. 【狮子数学】chapter2-02-中值定理
  3. android点击下拉历史记录,如何在Android上删除浏览历史记录-万兴恢复专家
  4. 抖音小程序如何运营;怎么快速变现赚钱。
  5. 【数学】【2017.7.7普及】串
  6. HBuilder X 常用的快捷键
  7. 抖音如何导流到微信?抖音官网链接引导加微信的设置
  8. 了解如何获得免费的笔记本电脑在线
  9. 深度学习实战之行人防碰撞预警系统
  10. java 发邮件授权码_javamail - androidmail 发送邮件 各种邮件授权方式