试验四-存储管理-可变分区_第1页
试验四-存储管理-可变分区_第2页
试验四-存储管理-可变分区_第3页
试验四-存储管理-可变分区_第4页
试验四-存储管理-可变分区_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精选优质文档-倾情为你奉上精选优质文档-倾情为你奉上专心-专注-专业专心-专注-专业精选优质文档-倾情为你奉上专心-专注-专业存储管理实验-可变分区管理实验目的: 通过分区存储管理模拟算法.了解可变分区的内存分配和回收过程.熟悉内存分配之最先、最佳、最差适应算法。实验内容:阅读参考程序 ,写出该程序的内存分配算法是哪种?完善内存回收算法 。设计最先内存分配算法.分配从小地址开始 ;参考程序#include #include #define n 10 /*假定系统允许的最大作业数为n.假定模拟实验中n值为10*/#define m 10 /*假定系统允许的空闲区表最大为m.假定模拟实验中m值为1

2、0*/#define minisize 100 /*空闲分区被分配时.如果分配后剩余的空间小于minisize.则将该空闲分区全部分配.若大于minisize.则切割分配,即不留小碎片*/structfloat address; /*已分配分区起始地址*/float length; /*已分配分区长度.单位为字节*/int flag; /*已分配区表登记栏标志.用0表示空栏目*/used_tablen; /*已分配区表。即存放已经分配的分区*/ structfloat address; /*空闲区起始地址*/float length; /*空闲区长度.单位为字节*/int flag; /*空闲

3、区表登记栏标志.用0表示空栏目.可用来登记空闲区.用1表示该空闲区未分配*/free_tablem; /*空闲区表.即存放空闲分区*/*主存分配函数*/void allocate(char J,float xk) /*给J作业.采用最佳分配算法分配xk大小的空间*/ int i,k; float ad; k=-1; for(i=0;i=xk & free_tablei.flag=1) if(k=-1|free_tablei.lengthfree_ta69blek.length) k=i; if(k=-1)/*未找到可用空闲区.返回*/ printf(无可用空闲区n); return; /*找到

4、可用空闲区.开始分配:若空闲区大小与要求分配的空间差小于minisize大小.则空闲区全部分配;若空闲区大小与要求分配的空间差大于minisize大小.则从空闲区划出一部分分配*/ if(free_tablek.length-xk=minisize) free_tablek.flag=0; ad=free_tablek.address; xk=free_tablek.length; else free_tablek.length=free_tablek.length-xk; ad=free_tablek.address+free_tablek.length; /*修改已分配分区表*/ i=0;

5、 while(used_tablei.flag!=0&i=n) /*无表目可填写已分配分区*/ printf(无表目填写已分分区.错误n); /*修正空闲区表*/ if(free_tablek.flag=0) /*前面找到的是整个空闲分区*/ free_tablek.flag=1; else /*前面找到的是某个空闲分区的一部分*/ free_tablek.length=free_tablek.length+xk; return; else /*修改已分配表*/ used_tablei.address=ad; used_tablei.length=xk; used_tablei.flag=J;

6、 return;/*主存分配函数结束*/*主存回收函数*/void reclaim(char J)/*回收作业名为J的作业所占主存空间*/ int i,k,j,s,t; float S,L; /*寻找已分配表中对应登记项*/ s=0; while(used_tables.flag!=J|used_tables.flag=0)&s=n)/*在已分配表中找不到名字为J的作业*/ printf(找不到该作业n); return; /*修改已分配表*/ used_tables.flag=0; /*取得归还分区的起始地址S和长度L*/ S=used_tables.address; L=used_tabl

7、es.length; j=-1;k=-1;i=0; /*寻找回收分区的空闲上下邻.上邻表目k.下邻表目j*/ while(im&(j=-1|k=-1) if(free_tablei.flag=1) if(free_tablei.address+free_tablei.length=S) k=i;/*找到上邻*/ if(free_tablei.address=S+L) j=i;/*找到下邻*/ i+; if(k!=-1) if(j!=-1) /* 上邻空闲区.下邻空闲区.三项合并*/ 。 else /*上邻空闲区.下邻非空闲区.与上邻合并*/ 。 else if(j!=-1) /*上邻非空闲区.

8、下邻为空闲区.与下邻合并*/ 。 else /*上下邻均为非空闲区.回收区域直接填入*/ /*在空闲区表中寻找空栏目*/ t=0; while(free_tablet.flag=1&t=m)/*空闲区表满,回收空间失败,将已分配表复原*/ printf(主存空闲表没有空间,回收空间失败n); used_tables.flag=J; return; free_tablet.address=S; free_tablet.length=L; free_tablet.flag=1; return;/*主存回收函数结束*/int main( ) int i,a; float xk; char J; /*

9、空闲分区表初始化:*/ free_table0.address=10000; /*起始地址假定为10000*/ free_table0.length=10240; /*长度假定为10240.即10k*/ free_table0.flag=1; /*初始空闲区为一个整体空闲区*/ for(i=1;im;i+) free_tablei.flag=0; /*其余空闲分区表项未被使用*/ /*已分配表初始化:*/ for(i=0;i=a&J=A&J=a&J=A&J=Z); reclaim(J); /*回收主存空间*/ break; case 3: /*a=3显示主存情况*/ /*输出空闲区表和已分配表

10、的内容*/ printf(输出空闲区表:n起始地址t分区长度t标志n); for(i=0;im;i+) printf(%.0ft%.0ft%6dn,free_tablei.address,free_tablei.length, free_tablei.flag); printf( 按任意键,输出已分配区表n); getchar(); printf( 输出已分配区表:n起始地址 分区长度 标志n); for(i=0;in;i+) if(used_tablei.flag!=0) printf(%.0ft%.0ft%6cn,used_tablei.address,used_tablei.length

11、, used_tablei.flag); else printf(%.0ft%.0ft%6dn,used_tablei.address,used_tablei.length, used_tablei.flag); break; default:printf(没有该选项n); /*case*/ /*While*/ 代码:#pragma once#includeusing namespace std;#define n 10 /*假定系统允许的最大作业数为n.假定模拟实验中n值为10*/#define m 10 /*假定系统允许的空闲区表最大为m.假定模拟实验中m值为10*/#define min

12、isize 100 /*空闲分区被分配时.如果分配后剩余的空间小于minisize.则将该空闲分区全部分配.若大于minisize.则切割分配,即不留小碎片*/class Memorypublic:/已分配表区.存放已经分配的分区structfloat address; /*已分配分区起始地址*/float length; /*已分配分区长度.单位为字节*/int flag; /*已分配区表登记栏标志.用0表示空栏目*/used_tablen; /*已分配区表。即存放已经分配的分区*/ /空闲表区.存放空闲分区structfloat address; /*空闲区起始地址*/float leng

13、th; /*空闲区长度.单位为字节*/int flag; /*空闲区表登记栏标志.用0表示空栏目.可用来登记空闲区.用1表示该空闲区未分配*/free_tablem; /*空闲区表.即存放空闲分区*/public:Memory();Memory();/*主存分配函数参数char J:作业id参数float xk:作业所需要的内存大小*/void allocate(char J, float xk);/*给J作业.采用最佳分配算法分配xk大小的空间*/void reclaim(char J);/主存回收函数void fistfit(char J, float xk);/首次适应算法;#inclu

14、de Memory.hMemory:Memory()Memory:Memory()/内存分配函数void Memory:allocate(char J, float xk)int k = -1;float ad;/作业J的起始地址for (int i = 0; i = xk&free_tablei.flag = 1)if (k = -1 | free_tablei.length free_tablek.length)k = i;if (k = -1)cout 无可用分区 endl;return;/未找到可用的空闲分区.函数调用结束.返回/*若找到可用空闲分区:if(可用空闲分区与所需空闲分区的

15、差小于minisize).该空闲分区全部分配否则的话.从空闲分区中划出一部分来给作业分配内存*/if (free_tablek.length - xk = minisize)free_tablek.flag = 0;/将此分区置为不可分配ad = free_tablek.address;/将作业的起始地址写为该分区的起始地址xk = free_tablek.length;/将作业所需要的空间长度修改为该分区的长度else/所需分区大小与可用空闲分区的大小差值大于minisizefree_tablek.length = free_tablek.length - xk;/空闲分区的大小修改为原大小

16、减去所需空间大小?ad = free_tablek.address + free_tablek.length; /使作业的结束地址刚好位于该分区的末尾/*修改已分配的分区表*/int i = 0;while(used_tablei.flag != 0 & i= n) /*无表目可填写已分配分区*/cout 无表目填写已分分区.错误n;/*修正空闲区表*/if (free_tablek.flag = 0)/如果整个分区都分配给J作业free_tablek.flag = 1;/将该分区置为可用状态else/*前面找到的是某个空闲分区的一部分*/free_tablek.length = free_t

17、ablek.length + xk;/更新空闲分区的大小return;else/*修改已分配表*/used_tablei.address = ad;used_tablei.length = xk;used_tablei.flag = J;return;/*主存回收函数*/void Memory:reclaim(char J)int i, k, j, s, t;float S, L;/*寻找已分配表中对应登记项*/s = 0;while (used_tables.flag != J | used_tables.flag = 0) & s= n)/*在已分配表中找不到名字为J的作业*/cout 找

18、不到该作业! endl;return;/*修改已分配表*/used_tables.flag = 0;/*取得归还分区的起始地址S和长度L*/S = used_tables.address;L = used_tables.length;j = -1; k = -1; i = 0;/*寻找回收分区的空闲上下邻.上邻表目k.下邻表目j*/while (im & (j = -1 | k = -1)if (free_tablei.flag = 1)/如果该分区未分配if (free_tablei.address + free_tablei.length = S) k = i;/*找到上邻*/if (fr

19、ee_tablei.address = S + L) j = i;/*找到下邻*/i+;if (k != -1)if (j != -1)/* 上邻空闲区.下邻空闲区.三项合并*/free_tablek.length = free_tablek.length + S + free_tablej.length;free_tablej.flag = 0;else/*上邻空闲区.下邻非空闲区.与上邻合并*/free_tablek.length = free_tablek.length + S;elseif (j != -1)/*上邻非空闲区.下邻为空闲区.与下邻合并*/free_tables.leng

20、th += free_tablej.length;free_tablej.flag = 0;else/*上下邻均为非空闲区.回收区域直接填入*/*在空闲区表中寻找空栏目*/t = 0;while (free_tablet.flag = 1 & t= m)/*空闲区表满,回收空间失败,将已分配表复原*/printf(主存空闲表没有空间,回收空间失败n);used_tables.flag = J;return;free_tablet.address = S;free_tablet.length = L;free_tablet.flag = 1;return;/首次适应算法void Memory:f

21、istfit(char J, float xk)for (int i = 0; i m; i+)/给空闲表区排序for (int j = i + 1; j free_tablej.length)int temp = free_tablei.length;free_tablei.length = free_tablej.length;free_tablej.length = temp;temp = free_tablei.address;free_tablei.address = free_tablej.address;free_tablej.address = temp;temp = free

22、_tablei.flag;free_tablei.flag = free_tablej.flag;free_tablej.flag = temp;int k = -1;float ad;/作业J的起始地址for (int i = 0; i m; i+)if (xk = free_tablei.length)&(free_tablei.flag=1)k = i;if (k = -1)cout 无可用分区 endl;return;/未找到可用的空闲分区.函数调用结束.返回/*若找到可用空闲分区:if(可用空闲分区与所需空闲分区的差小于minisize).该空闲分区全部分配否则的话.从空闲分区中划出

23、一部分来给作业分配内存*/if (free_tablek.length - xk = minisize)free_tablek.flag = 0;/将此分区置为不可分配ad = free_tablek.address;/将作业的起始地址写为该分区的起始地址xk = free_tablek.length;/将作业所需要的空间长度修改为该分区的长度else/所需分区大小与可用空闲分区的大小差值大于minisizefree_tablek.length = free_tablek.length - xk;/空闲分区的大小修改为原大小减去所需空间大小?ad = free_tablek.address +

24、 free_tablek.length; /使作业的结束地址刚好位于该分区的末尾/*修改已分配的分区表*/int i = 0;while (used_tablei.flag != 0 & i= n) /*无表目可填写已分配分区*/cout 无表目填写已分分区.错误n;/*修正空闲区表*/if (free_tablek.flag = 0)/如果整个分区都分配给J作业free_tablek.flag = 1;/将该分区置为可用状态else/*前面找到的是某个空闲分区的一部分*/free_tablek.length = free_tablek.length + xk;/更新空闲分区的大小return

25、;else/*修改已分配表*/used_tablei.address = ad;used_tablei.length = xk;used_tablei.flag = J;return;#include #includeMemory.husing namespace std;int main()Memory M;char J;/*空闲分区表初始化:*/M.free_table0.address = 10000; /*起始地址假定为10000*/M.free_table0.length = 10240; /*长度假定为10240.即10k*/M.free_table0.flag = 1; /*初始空闲区为一个整体空闲区*/for (int i = 1; im; i+)M.free_tablei.f

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论