ImageVerifierCode 换一换
格式:DOCX , 页数:36 ,大小:329.42KB ,
资源ID:10440823      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/10440823.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(动态分区管理.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

动态分区管理.docx

1、动态分区管理 操 作 系 统 实 验 报 告 实验名称: 动态分区管理 班 级: 软件工程08-1 姓 名: 学 号: 实验目的:用高级语言编写和调试一个内存的动态分配程序,实现内存的分配以及回收功能。 实验内容:用户录入作业时,可以根据首次适应算法、最佳适应算法、最差适应算法对作业需要的内存空间进行分配、在回收内存的时候判断回收区的前部和后部是否有空闲的区域,进行空白内存区域的合并,实现内存的回收。 实验步骤:(1)在内存空间中初始化一片连续内存空间,大小为127K; (2)对内存空间作事先处理,将内存空间划分成几个空闲区域,20K,30K,40K,17K,它们之间用5K的作业占用空间进行隔

2、离;(3)分别调用三种分配算法,录入作业,以及作业所需的空间大小,并观察作业的起始位置。 (4)对作业进行回收,改变空闲空间的大小,对相连的空闲空间进行合并。实验结果:1、 选择初始化内存空间函数 ;2、 输入分配的内存空间大小为127K;3、 事先对存储区进行分配处理,实验数据如下表 5K20K5K30K5K40K5K17K4、对部分作业进行回收,剩余所有5K的作业,使内存作业分布情况如下图5、查看内存的空闲空间情况6、使用首次适应算法对空闲空间进行分配;7、新建作业,所需空间大小为10K,根据首次适应算法,空间从低地址开始查找第一个大小符合的空闲空间为作业分配内存空间,起始位置是5K,大小

3、为10K。8、再录入一个新的作业,大小同样为10K,查看作业在内存中的起始位置;内存的分配符合首次适应算法。回收这两个作业。9、调用最佳适应算法10、录入作业,所需空间大小为15K,根据最佳适应算法,系统将所有大小符合的空闲内存空间组成一个链表,在里边找一个空间大小最小的空闲空间分配给作业,起始位置是110K,大小为15K;11、再录入一个作业(大小为1K,起始位置为125K)进行验证;结束后回收作业。12、调用最坏适应算法,录入作业,所需空间大小为15K,根据最坏适应算法,系统会将所有大小符合的空闲空间进行排列,将空间最大的分配给作业使用,起始位置是65K,大小为15K;13、再录入一个作业

4、,所需大小为16K,进行验证;14、回收作业,查看内存现在的空闲空间情况和作业分配情况;5K(占用)525K5K(占用)3060K5K(占用)65105K5K(占用)110127K15、回收作业0,作业0的空间和后面的空闲空间进行合并,回收作业6,作业6的前边和后边的空闲空间与作业6空间进行合并内存空闲情况如下;025K5K(占用)3060K5K(占用)65127K 16、回收作业4,内存空闲情况如下025K5K(占用)30127K17、回收作业2,内存空间清空。小结:此次试验的重点集中在首次适应,最佳适应,和最差适应算法的编写,而难点在内存的回收上,要分情况讨论内存中空闲区域的位置,位于回收

5、区域的上部相连,下部相连,还是上下两端相连。如果相连,则对这些空闲区域进行一起合并。在设计试验数据的时候要仔细的考虑,比如,在试验中如果空闲区域大小是按照依次递增的顺序时,首次适应算法会和最佳适应算法的分配方案一样,会造成对试验的影响。源码:#include stdio.h#include string.h#include stdlib.h#include time.htypedef struct available_space int number; int start_id; int size; bool judge;/此条记录是否有效.available_space;typedef st

6、ruct job int dawn_id; int size; bool judge;/此条记录是否有效.job;static available_space a_space100;static int s_number,s_account;/s_number:空闲区的编号 s_account:空闲区的总数static job works100;static int job_number,job_account;/解释同上.static memory_size;bool whether_resize_memory=true;/-bool t_control()/进行时间控制 double di

7、ff; time_t time1,nowTime; time(&time1); bool check1=true,check2=true,check3=true; printf(剩余时间3秒.n); while(true) time(&nowTime); diff=difftime(nowTime,time1); if(diff=1&check1) printf(剩余时间2秒.n); check1=false; if(diff=2&check2) printf(剩余时间1秒.n); check2=false; if(diff=3&check3) break; return true;/-voi

8、d get_look()/查看当前内存的空闲区情况. system(cls); char a; if(memory_size=0)/如果内存空间还未进行分配则提示. printf(对不起,当前内存空间大小还未进行合理设置,三秒后将自动返回主界面.n); if(t_control() return; else if(s_account=0)/用于检测当前是否还有空闲区. printf(nnnnnttt当前系统空闲区情况如下所示ttttn); printf(ttt当前系统内存已满,暂无空闲区可供使用.n); else/有空闲区. printf(nnnnnttt当前系统空闲区情况如下所示ttttn)

9、; printf(tt*编号tt起始地址t大小n); for(int i=0;is_number;i+)/根据空闲区的总的编号进行循环输出. if(a_spacei.judge) printf(tt*%dtt%dtt%dn,a_spacei.number,a_spacei.start_id,a_spacei.size); printf(nntt请按q键返回主界面.n); while(true) scanf(%c,&a); fflush(stdin); if(tolower(a)=q) break; /-void see_job()/从主界面的位置查看当前内存中存放的作业的情况 system(c

10、ls); char a; if(job_account=0) printf(对不起,当前内存中没有任何作业在被执行,三秒后将自动返回主界面.n); if(t_control() return; else printf(nnnnnttt当前系统作业分配情况如下所示ttttn); printf(tt*编号tt起始地址t大小n); for(int i=0;ijob_number;i+) if(worksi.judge) printf(tt*%dtt%dtt%dn,i,worksi.dawn_id,worksi.size); printf(nntt请按q键返回主界面.n); while(true) s

11、canf(%c,&a); fflush(stdin); if(tolower(a)=q) break; /-void get_look_job()/在内存分配后显示当前作业在内存中的分配情况. printf(nnnnnttt当前系统作业分配情况如ttttn); printf(tt*编号tt起始地址t大小n); for(int i=0;inumber=0;point-size=0;point-start_id=memory_size+10;/返回去后根据point-start_id的值可以判断是否找到了合适的内存区域 for(int i=0;istart_ida_spacei.start_id)

12、&(need_size=a_spacei.size)&a_spacei.judge) point=&a_spacei; return point;/-void first()/首次适应算法 system(cls); int job_size; char a; available_space *point; printf(请输入作业执行所需要的内存空间大小(大于0):); scanf(%d,&job_size); fflush(stdin); if(job_sizestart_idmemory_size)/判断是否找到了这样的一个地址. printf(对不起,当前内存空间已用完了,请稍后执行.n

13、); else/如果说找到了. worksjob_number.dawn_id=point-start_id; worksjob_number.size=job_size; worksjob_number.judge=true; job_number+; job_account+; if(point-sizejob_size)/如果空闲区的大小还有剩余,则只用修改其大小和起始地址. point-size=point-size-job_size; point-start_id=point-start_id+job_size; else/刚好放得下则从空闲区中将其删除. point-size=NU

14、LL; point-number=NULL; point-start_id=NULL; point-judge=false; s_account-; get_look_job();/查看当前作业情况. printf(n); printf(nn请按q键返回主界面.n); while(true)/仅用于控制界面停留. scanf(%c,&a); fflush(stdin); if(tolower(a)=q) break; /-available_space * get_mini_space(int job_size)/用于获取能够容纳当前输入的作业的最小空闲内存空间. available_spac

15、e *point=(available_space *)malloc(sizeof(available_space); point-number=0;point-size=memory_size+10;point-start_id=0;/. for(int i=0;isizea_spacei.size)&(job_size=a_spacei.size)&a_spacei.judge)/寻找比较小且可用的空闲内存块(此内存块必须保证未被占用). point=&a_spacei; return point;void best() /最佳适应算法 system(cls); int job_size;

16、 char a; available_space *point; printf(请输入作业执行所需要的内存空间大小(大于0):); scanf(%d,&job_size); fflush(stdin); if(job_sizesizememory_size) printf(对不起,当前内存空间已用完了,请稍后执行.n); else worksjob_number.dawn_id=point-start_id; worksjob_number.size=job_size; worksjob_number.judge=true; job_number+; job_account+; if(poin

17、t-sizejob_size)/如果空闲区的大小还有剩余,则只用修改其大小和起始位置. point-size=point-size-job_size; point-start_id=point-start_id+job_size; else point-size=NULL; point-number=NULL; point-start_id=NULL; point-judge=false; s_account-; get_look_job(); printf(n); printf(nn请按q键返回主界面.n); while(true)/仅用于控制界面停留. scanf(%c,&a); fflu

18、sh(stdin); if(tolower(a)=q) break; /-available_space * get_max_space(int job_size)/用于获取能够容纳当前输入的作业的最小空闲内存空间. available_space *point=(available_space *)malloc(sizeof(available_space); point-number=0;point-size=-10;point-start_id=0;/. for(int i=0;isizea_spacei.size)&(job_size=a_spacei.size)&a_spacei.j

19、udge)/寻找比较大且可用的空闲内存块(此内存块必须保证未被占用). point=&a_spacei; return point;void worst()/最坏适应算法 system(cls); int job_size; char a; available_space *point; printf(请输入作业执行所需要的内存空间大小(大于0):); scanf(%d,&job_size); fflush(stdin); if(job_sizesizestart_id; worksjob_number.size=job_size; worksjob_number.judge=true; jo

20、b_number+; job_account+; if(point-sizejob_size)/如果空闲区的大小还有剩余,则只用修改其大小和起始位置. point-size=point-size-job_size; point-start_id=point-start_id+job_size; else point-size=NULL; point-number=NULL; point-start_id=NULL; point-judge=false; s_account-; get_look_job(); printf(n); printf(nn请按q键返回主界面.n); while(tru

21、e)/仅用于控制界面停留. scanf(%c,&a); fflush(stdin); if(tolower(a)=q) break; /-void initial()/分配内存空间 bool bo=true; char check; bool ex=false; system(cls); if(job_account0)/作业队列不为空则无法进行内存空间的重新设置. printf(对不起,当前内存空间有其它进程正在使用,无法重新设置,三秒后自动退回主界面.n); if(t_control()/调用时间控制函数. return; do printf(内存的默认起始位置为:0号物理地址,请输入其大

22、小(大于零):n); scanf(%d,&memory_size); fflush(stdin); if(memory_size=0)/用户输入的内存大小不符合规定. printf(对不起,你输入的大小不符合规定(大于零),请根据提示重新输入.n); continue; else/输入的值符合规则. fflush(stdin); printf(初始化成功,您设置的空间大小是%d,起始地址0-%dn,memory_size,memory_size); while(true)/此处用于控制是否想重新设置内存空间大小. printf(是否重新设置空间大小? (Y/N)n); scanf(%c,&check); fflush(stdin); if(toupper(check)=N) ex=true; break; else if(toupper(check)=Y) break; else printf(输入字符不合规则,请重新输入n); if(ex)/如果用户确定不进行修改

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1