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

网络工程专业   姓名:蔡利聪  学号:201306114117

一、目的和要求

1. 实验目的

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

2.实验要求

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

(1)设计一个作业申请队列以及作业完成后的释放顺序,实现主存的分配和回收。采用分区说明表进行。

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

(3)设计一个空闲区说明表,以保存某时刻主存空间占用情况。把空闲区说明表的变化情况以及各作业的申请、释放情况显示。

二、实验内容

编写并调试一个模拟的内存分配与回收程序,使用首次适应算法、循环首次适应算法对内存空间的分配与回收。

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

1.    源程序名:a.cpp

可执行程序名:a.exe

2.    原理分析

(1)编写该程序首先要给定一个一定空间大小的内存,即申请空闲区空间最大值,并且要定义空间的各分区的作业标号、分区起始地址、分区长度,单位为字节、分区表的状态位、前向指针、后向指针、已分配分区表、空闲分区等。

(2)通过定义空间分区后,还要定义空间分区链表并对其进行初始化,对空闲分区和已分配分区进行链表访问,对于空闲分区可以分配给新进来的进程使用,对于已分配的分区,则等进程执行结束后在回收空间,恢复空闲区。通过链表的访问实现整个空间分区的分配与回收。

3.      主要程序段及其解释:

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include <conio.h>
  4 #define nil -1
  5 #define NULL 0
  6 #define maxisize 600    //用户的空闲区空间最大值
  7 #define minisize 4
  8 #define getspace(type) (type*)malloc(sizeof(type)) //分配空间
  9 struct table{
 10     char job;                 //作业标号
 11     float address;            //分区起始地址
 12     float length;             //分区长度,单位为字节
 13     int flag;                 //分区表的状态位
 14     struct table *FRlink;     //前向指针
 15     struct table *RElink;    //后向指针
 16 }*free_table=NULL,*place;   //已分配分区表,空闲分区表
 17 typedef struct table FRtable;
 18 //空间分区链表初始化
 19 FRtable *init(FRtable *tb)
 20 {
 21     tb->FRlink=NULL;
 22     tb->job=nil;
 23     tb->address=1064;
 24     tb->length=1664;
 25     tb->flag=0;
 26     tb->RElink=NULL;
 27     return tb;
 28 }
 29 //主存分配函数,为作业job分配大小为xk的分区空间
 30 void allocate(char job,float xk,int choice)
 31 {
 32     FRtable *tb,*link;
 33     int k=0;
 34     float temp=600;
 35     if (free_table->FRlink==NULL&&free_table->RElink==NULL)
 36     {//给首个作业分配空间,改写分区链表
 37         free_table->job=job;
 38         free_table->length=xk;
 39         free_table->flag=1;
 40         if (xk<maxisize)
 41         {
 42             tb=getspace(FRtable);
 43             free_table->RElink=tb;
 44             tb->FRlink=free_table;
 45             tb->job=nil;
 46             tb->address=1064+xk;
 47             tb->length=maxisize-xk;
 48             tb->flag=0;
 49         }
 50         if (choice==2)
 51         {//链接成循环链表
 52             free_table->FRlink=tb;
 53             tb->RElink=free_table;
 54             place=tb;
 55         }
 56         else
 57         {
 58             free_table->FRlink=NULL;
 59             if (xk<maxisize) tb->RElink=NULL;
 60         }
 61         k=1;
 62     }
 63     else
 64     {
 65         if (2==choice) tb=place;//采用CFF时将ta定位到上次找到的合适空间分区的下个空间分区
 66         else tb=free_table;
 67         while(tb!=NULL)
 68         {
 69             if (3==choice)
 70             {
 71                 while(tb!=NULL)
 72                 {
 73                     if (tb->length>=xk&&tb->flag==0)
 74                         if (tb->length<temp)
 75                             {place=tb;temp=tb->length;}   //选择最适合空间
 76                     tb=tb->RElink;
 77                 }
 78                 tb=place;
 79             }
 80             if (tb->length>=xk&&tb->flag==0)
 81                 if (tb->length-xk<=minisize)
 82                 {//当搜索到的空间大小<=xk+minisize时,将空间全部分配给作业
 83                     tb->job=job;
 84                     tb->flag=1;
 85                     place=tb->RElink;
 86                     k=1;
 87                     break;
 88                 }
 89                 else
 90                 {//当搜索到的空间大小>xk+minisize时,将空间划分,再分配给作业
 91                     link=getspace(FRtable);
 92                     link->length=tb->length-xk;
 93                     tb->job=job;
 94                     tb->length=xk;
 95                     tb->flag=1;
 96                     link->RElink=tb->RElink;
 97                     if (NULL!=tb->RElink) tb->RElink->FRlink=link;
 98                     tb->RElink=link;
 99                     link->FRlink=tb;
100                     link->job=nil;
101                     link->address=tb->address+xk;
102                     link->flag=0;
103                     place=link;
104                     k=1;
105                     break;
106                 }
107             tb=tb->RElink;
108         }
109     }
110     if (0==k)
111     {//未寻找到合适的空间分区,返回
112         printf(">>空间申请失败! \n");
113         return;
114     }
115 }
116
117 //主存回收函数,回收作业job所占用的分区空间
118 void reclaim(char job,int choice)
119 {
120     int bool1=0,bool2=0;
121     FRtable *tb,*link;
122     tb=free_table;
123     if (2==choice) link=tb;
124     else link=NULL;
125     do
126     {
127         if (job==tb->job&&1==tb->flag) break;
128         tb=tb->RElink;
129         if (tb==link)
130         {
131             printf("\n>>抱歉,不存在作业%c! \n",job);
132             return;
133         }
134     }while(tb!=link);
135     bool1=(NULL==tb->FRlink||tb->FRlink==tb->RElink)? 1:tb->FRlink->flag;
136     bool2=(NULL==tb->RElink||tb->FRlink==tb->RElink)? 1:tb->RElink->flag;
137     if (bool1&&bool2)
138     {
139         tb->job=nil;
140         tb->flag=0;
141     }
142     else if ((NULL==tb->FRlink||1==tb->FRlink->flag)&&0==tb->RElink->flag)
143     {
144         link=tb->RElink;
145         tb->job=nil;
146         tb->length+=link->length;
147         tb->flag=0;
148         tb->RElink=link->RElink;
149         if (NULL!=link->RElink) link->RElink->FRlink=tb;
150         free(link);
151     }
152     else if (0==tb->FRlink->flag&&1==tb->RElink->flag)
153     {
154         link=tb->FRlink;
155         link->length+=tb->length;
156         link->RElink=tb->RElink;
157         tb->RElink->FRlink=link;
158         if (free_table==tb) free_table=link;
159         free(tb);
160     }
161     else if (0==tb->FRlink->flag&&0==tb->RElink->flag)
162     {
163         link=tb->FRlink;
164         link->length=link->length+tb->length+tb->RElink->length;
165         link->RElink=tb->RElink->RElink;
166         if (NULL!=tb->RElink->RElink) tb->RElink->RElink->FRlink=link;
167         if (free_table==tb) free_table=link;
168         free(tb);
169         free(tb->RElink);
170     }
171 }
172 //显示空间分区链表
173 void display(FRtable *tb,int choice)
174 {
175 //    clrscr();
176     FRtable *temp;
177     if (2==choice) temp=tb;
178     else temp=NULL;
179     printf("\n\t标号\t分区首地址\t分区大小(KB)\t    状态位\n");
180     printf("\n\t sys\t 1024.00\t 40.00\t\t     1\n");
181     do
182     {
183         printf("\n\t %c\t %.2f\t %.2f\t\t     %d\n",tb->job,tb->address,tb->length,tb->flag);
184         tb=tb->RElink;
185     }while(temp!=tb);
186 }
187 //主函数
188 int main()
189 {
190     int i,a,choice;
191     float xk;
192     char job;
193     FRtable *ta=getspace(FRtable);
194     free_table=init(ta);
195     do{
196         printf("\n 分区分配算法:\n\t0 - 退出(Exit)\n\t1 - 首次适应算法(FF)\n\t2 - 循环首次适应算法(CFF)\n \n");
197         printf(">>请选择相应的算法(0-2):");
198         scanf("%d",&choice);
199         if (0==choice) exit(0);
200     }while(0>choice&&2<choice);
201     while(1)
202     {
203         printf("\n    菜单:\n\t0 - 退出(Exit)\n\t1 - 申请空间(Allocation)\n\t2 - 回收空间(Reclaim) \n");
204         printf(">>请选择你的操作(0-2):");
205         scanf("%d",&a);
206         switch(a)
207         {
208             //a=0,程序结束
209             case 0:exit(0);
210             //a=1,分配主存空间
211             case 1:printf(">>请输入作业标号和所需要申请的空间:");
212                     scanf("%*c%c%f",&job,&xk);
213                     allocate(job,xk,choice);
214                     display(free_table,choice);
215                     break;
216             //a=2,回收主存空间
217             case 2:printf(">>请输入你想回收的作业的相应标号:");
218                     scanf("%*c%c",&job);
219                     reclaim(job,choice);
220                     display(free_table,choice);
221                     break;
222             default:printf(">>ERROR:No thie choose! \n");
223         }
224     }
225 }

4.运行结果

如上图所示,当输入需要申请的空间和标号后,空闲分区会分配相应的空间大小,当输入回收的标号时,内存会回收相应大小的空间。根据实验结果显示,实验已达到预期效果。

实验总结

(1)本次实验是有关内存空间分配的算法的实现,实验内容相对之前的进程调度稍微简洁些,但是基本实现的数据结构的链表算法是一样的,还是需要通过申请空间,定义分区大小,然后通过链表对各空闲分区进行相应的内存分配。

(2)虽然对实验步骤比较清晰,对首次适应算法、循环首次适应算法的知识理解得比较好,但是在对如何通过这些算法去实现这个内存分配的实验,还是遇到很多困难,比如链表初始化与访问的算法基础掌握得不好,还有一些基本的C语言的语法结构掌握不熟练,而且对算法与与程序之间的思维不清晰,导致在写程序中出现较多问题,然后通过查找课本,上网搜寻资料,询问同学进行帮助解答,最后得到基本的实验程序。

转载于:https://www.cnblogs.com/clcbk/p/4550955.html

主存空间的分配和回收实验报告相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

  7. 39,叶慧敏 实验四 主存空间的分配和回收模拟

    一. 实验目的 为了合理地分配和使用这些存储空间,当用户提出申请主存储器空间时,存储管理必须根据申请者的要求,按一定的策略分析主存空间和使用情况,找出足够 的空闲区域给申请者.当作业撤离归还主存资源时 ...

  8. 可变分区存储管理实验报告总结_可变分区存储管理方式的内存分配和回收实验报告...

    操作系统实验报告 一.实验目的 通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解,熟悉可变分区存储 管理的内存分配和回收. 二.实验内容 1.确定内存空间分配表: 2.采用最优适应算法完成内 ...

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

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

  10. 内存的分配与回收实验

    内存的分配与回收 北京师范大学珠海分校 实验目的 1.通过使用位图或空闲表,跟踪内存使用情况,模拟和评价不同的内存分配算法: 2.熟悉内存分配和回收管理过程. 实验要求 1.要求用你熟悉的程序设计语言 ...

最新文章

  1. css float 的使用
  2. mysql中change用法,mysql 中alter的用法以及一些步骤
  3. UA MATH564 概率论 QE练习题1
  4. MATLAB利用串口接收数据,并实时显示图形
  5. wxWidgets:wxMemoryOutputStream类用法
  6. Video在网页和移动端无法自动播放问题??
  7. java铲车_深入研究Java类装载机制
  8. 谭浩强《c语言程序设计》第五章第十六题 输出图案:空格和*搭配的循环
  9. 房屋户型图识别方法AI自适应墙体识别
  10. 1.0 Android基础入门教程
  11. 联想用u盘重装系统步骤_用u盘给联想笔记本装系统
  12. 小程序提示 网络异常 Network Anomalies
  13. C - Matrix Reducing
  14. VC++通过查看ReactOS开源代码,解决完整路径dll加载失败问题(附源码)
  15. python1到100奇数相加_如何使用while语句求1到100的奇数和
  16. CANopen协议本质
  17. 【SDUT第11周周赛Problem A】SDUT2576——Queen Collisions
  18. 链表的两种创建方法——头插法与尾插法
  19. vue使用d3数据可视化(柱状图、饼图、折线图 带坐标轴)
  20. 如何在本地进行一个IP访问多个域名

热门文章

  1. C#更新word目录
  2. oracle数据库还原指令,oracle中备份和还原数据库的命令汇总
  3. Softwaredistribution与系统瘦身
  4. 如何利用python计算即期利率_QuantLib 金融计算——案例之固息债的价格、久期、凸性和 BPS...
  5. matlab拟合线性,Matlab 线性拟合 非线性拟合
  6. UESTC 1636 梦后楼台高锁,酒醒帘幕低垂 最小生成树Kruskal算法的扩展
  7. 初学者最容易学的六种编程语言
  8. Sampler 半小时快速搭建PostgreSQL简易监控
  9. 桌面cpu与服务器cpu天梯,桌面CPU性能排行 桌面CPU天梯图2017年6月最新版
  10. 485通讯( 详解 )