存储管理算法的模拟.doc_第1页
存储管理算法的模拟.doc_第2页
存储管理算法的模拟.doc_第3页
存储管理算法的模拟.doc_第4页
存储管理算法的模拟.doc_第5页
免费预览已结束,剩余13页可下载查看

下载本文档

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

文档简介

存储管理算法的模拟 姓名:海日汗学号:20092106091、概述分区式存储管理算法主要有:首次适应算法,最佳适应算法,最坏适应算法。2、实验目的模拟实现分区存储管理算法中的首次、最佳、最坏适应算法。3、实验要求输入: 1)当前内存空闲分区的序列,包括起始地址、空闲分区大小。2)进程的分区请求序列。输出要求: 1) 三种算法的空闲分区队列2) 三种算法的分配结果4、实验代码#include iostreamusing namespace std;#define free 0 /空闲状态#define busy 1 /已用状态#define ok 1 /完成#define error 0 /出错#define max_length 500 /最大内存空间为500kbint flag;typedef struct freespace /定义一个空闲区说明表结构 long size; /分区大小 long address; /分区地址 int state; /状态elemtype;/ 线性表的双向链表存储结构typedef struct dulnode elemtype data; struct dulnode *prior; /前趋指针 struct dulnode *next; /后继指针dulnode,*dulinklist; dulinklist head_node; /头结点dulinklist end_node; /尾结点int alloc(int); /内存分配int free(int); /内存回收int first_fit(int); /首次适应算法int best_fit(int); /最佳适应算法int worst_fit(int); /最差适应算法void show(); /查看分配int initblock(); /开创空间表 int initblock() /开创带头结点的内存空间链表 head_node=(dulinklist)malloc(sizeof(dulnode); end_node=(dulinklist)malloc(sizeof(dulnode); head_node-prior=null; /头结点的前驱指针指向空 head_node-next=end_node; /头结点的后继指针指向尾结点 end_node-prior=head_node; /尾结点的前驱指针指向头结点 end_node-next=null; /尾结点的后继指针指向空 end_node-data.address=0; /尾结点的地址是0 end_node-data.size=max_length; /分区大小是最大分区 end_node-data.state=free; /状态是空 return ok;void main() int ch; /算法选择标记cout*存储管理算法模拟*n; cout请输入所使用的内存分配算法:n; coutch;while(ch3)coutch; initblock(); /开创空间表 int choice; /操作选择标记 while(1) show();cout请输入您的操作:; coutchoice; if(choice=1) alloc(ch); / 分配内存 else if(choice=2) / 内存回收 int flag; coutflag; free(flag); else if(choice=0) break; /退出 else /输入操作有误 cout输入有误,请重试!endl; continue; /分配主存int alloc(int ch) int need = 0; coutneed; if(need0 |need=0) cout请重新输入分配大小!endl; return error; if(ch=2) /选择最佳适应算法 if(best_fit(need)=ok) cout分配成功!endl; else cout内存不足,分配失败!endl; return ok; if(ch=3) /选择最差适应算法 if(worst_fit(need)=ok) cout分配成功!endl; else cout内存不足,分配失败!endl; return ok; else /默认首次适应算法 if(first_fit(need)=ok)cout分配成功!endl; else cout内存不足,分配失败!data.size=need; temp-data.state=busy; dulnode *p=head_node-next; while(p) if(p-data.state=free & p-data.size=need) /现有的空闲块正好等于需要的空间大小 p-data.state=busy; return ok; break; if(p-data.state=free & p-data.sizeneed) /现有的空闲块能满足需求且有剩余 temp-prior=p-prior; /修改双向链表的头尾指针,插入新申请的作业 temp-next=p; temp-data.address=p-data.address; p-prior-next=temp; p-prior=temp; p-data.address=temp-data.address+temp-data.size; p-data.size-=need; return ok; break; p=p-next; return error;/最佳适应算法int best_fit(int need) int ch; /记录最小剩余空间 dulinklist temp=(dulinklist)malloc(sizeof(dulnode); temp-data.size=need; temp-data.state=busy; dulnode *p=head_node-next; dulnode *q=null; /记录最佳插入位置 while(p) /初始化最小空间和最佳位置 if(p-data.state=free & (p-data.size=need) if(q=null)q=p;ch=p-data.size-need;else if(q-data.size p-data.size)q=p;ch=p-data.size-need; p=p-next; if(q=null) return error; /没有找到空闲块 else if(q-data.size=need) q-data.state=busy; return ok; else temp-prior=q-prior; temp-next=q; temp-data.address=q-data.address; q-prior-next=temp; q-prior=temp; q-data.address+=need; q-data.size=ch; return ok; return ok; /最差适应算法int worst_fit(int need) int ch; /记录最大剩余空间 dulinklist temp=(dulinklist)malloc(sizeof(dulnode); temp-data.size=need; temp-data.state=busy; dulnode *p=head_node-next; dulnode *q=null; /记录最佳插入位置 while(p) /初始化最大空间和最佳位置 if(p-data.state=free & (p-data.size=need) ) if(q=null)q=p;ch=p-data.size-need;else if(q-data.size data.size)q=p;ch=p-data.size-need; p=p-next; if(q=null) return error; /没有找到空闲块 else if(q-data.size=need) q-data.state=busy; return ok; else temp-prior=q-prior; temp-next=q; temp-data.address=q-data.address; q-prior-next=temp; q-prior=temp; q-data.address+=need; q-data.size=ch; return ok; return ok;/主存回收int free(int flag) dulnode *p=head_node;for(int i= 0; i next;elsereturn error;p-data.state=free; if(p-prior!=head_node & p-prior-data.state=free)/与前面的空闲块相连 p-prior-data.size+=p-data.size; p-prior-next=p-next; p-next-prior=p-prior;p=p-prior; if(p-next!=end_node & p-next-data.state=free)/与后面的空闲块相连 p-data.size+=p-next-data.size; p-next-next-prior=p; p-next=p-next-next; if(p-next=end_node & p-next-data.state=free)/与最后的空闲块相连 p-data.size+=p-next-data.size; p-next=null; return ok; /显示主存分配情况void show()int flag = 0; coutn主存分配情况:n; coutnext;cout分区号t起始地址t分区大小t状态nn; while(p) cout flag+t; cout data.addresstt; cout data.sizedata.state=free) cout空闲nn; else coutnext; cout+nn;实验结果分析:1.首先适应算法的内存分配情况:内存分配顺序是:150kb,85kb, 62kb, 120kb, 15kb, 30kb(只有最后结果截图下来的!)下面是回收内存的情况:回收的内存分区号的顺序是:分区1 分区3 分区5; 下面是回收了1 3 5 分区之后的内存的情况。(说明的是回收分区5之后原来的分区6和现在新回收的分区5和在一起成为新的一个大的空闲内存!)再一次分配内存:因为这样才可以看出首次适应算法的分配内存的顺序。分配内存的大小是 65kb 75kb 95kb再一次分配65kb之后:分配75kb之后:分配95kb之后:(找不到95kb的空闲内存,所以分配失败!)明显看的出来首次适应算法的主要思想是:当接到内存申请时,查找分区说明表,找到第一个满足申请长度的空闲区,将其分割并分配。2.最佳适应算法分配65kb之后:分配75kb之后:分配95kb之后 我们能看出最佳适应算法的主要思想是:当接到内存申请时,查找分区说明表,找到第一个能满足申请长度的最小空闲区,将其分割并分配!3.最差适应算法分配65kb之后分配75kb之后分配95kb之后最差适应算法的主要思想是:当接到内存申请时,查找分区说明表,找到能满足申请要求的最大的空闲区。我的心得: 我通过本次实验深入了解了这三个算法!只

温馨提示

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

评论

0/150

提交评论