当前位置:文档之家› 动态分区存储管理方式的主存分配回收实验参考

动态分区存储管理方式的主存分配回收实验参考

动态分区存储管理方式的主存分配回收实验报告一、实验目的深入了解动态分区存储管理方式的主存分配回收的实现。

二、实验要求编写程序完成动态分区存储管理方式的主存分配回收的实现。

实验具体包括:首先确定主存空间分配表;然后采用最优适应算法完成主存空间的分配,完成主存空间的回收;最后编写主函数对所作工作进程测试。

三、实验原理:存储管理中动态分区的管理方式。

四、实验程序设计1.数据结构◆已分分区表的数据结构定义#define n 10 //假定系统允许的最大作业数量为ntypedef struct used{float address; //已分分区起始地址float length; //已分分区长度,单位为字节CString flag; //已分配区表登记栏标志,用"0"表示空栏目,作业名表示使用}USED; //已分配区表USED used_table[n];◆空闲区表的数据结构定义#define m 10 //假定系统允许的空闲区表最大为mtypedef struct free{float address; //空闲区起始地址float length; //空闲区长度,单位为字节int flag; //空闲区表登记栏标志,用"0"表示空栏目,用"1"表示未分配}FREE; //空闲区表FREE free_table[m];2.功能函数设计1)系统数据初始化free_table[0].address=10240;free_table[0].length=102400;free_table[0].flag=1;//空闲区表初始化for(i=1;i<m;i++)free_table[i].flag=0;//空闲区表初始化for(i=0;i<n;i++)used_table[i].flag='0';2)分配函数void CExp3Dlg::allocate(CString J, float xk) //采用最优分配算法分配xk大小的空间{int i,k;float ad;k=-1;for(i=0;i<m;i++) //寻找空间大于xk的最小空闲区登记项kif(free_table[i].length>=xk&&free_table[i].flag==1)if(k==-1||free_table[i].length<free_table[k].length)k=i;if(k==-1) //未找到可用空闲区,返回{this->MessageBox("无可用空闲区");return;}/*找到可用空闲区,开始分配:若空闲区大小与要求分配的空间差小于minisize大小,则空闲区全部分配;若空闲区大小与要求分配的空间差大于minisize大小,则从空闲区划出一部分分配*/if(free_table[k].length-xk<=minisize){free_table[k].flag=0;ad=free_table[k].address;xk=free_table[k].length;}else{free_table[k].length=free_table[k].length-xk;ad=free_table[k].address+free_table[k].length;}//修改已分配区表i=0;while(used_table[i].flag!='0' && i<m) //寻找空表目i++;if(i>=m) //无表目填写已分分区{MessageBox("无表目填写已分分区,错误");//修正空闲区表if(free_table[k].flag==0) //前面找到的是整个空闲区free_table[k].flag=1;else //前面找到的是某个空闲区的一部分free_table[k].length=free_table[k].length+xk;return;}else //修改已分配区表{used_table[i].address=ad;used_table[i].length=xk;used_table[i].flag=J;}return;}3)回收函数void CExp3Dlg::reclaim(CString J) //回收作业名为J的作业所占主存空间{int i,k,j,s,t;float S,L;//寻找已分配区表中对应登记项s=0;while((used_table[s].flag!=J||used_table[s].flag=='0')&&s<n)s++;if(s>=n) //在已分配区表中找不到名字为J的作业{MessageBox("找不到该作业");return;}//修改已分配区表used_table[s].flag='0';//取得归还分区的起始地址S和长度LS=used_table[s].address;L=used_table[s].length;j=-1;k=-1;i=0;//寻找回收分区的上下邻空闲区,上邻表目k,下邻表目jwhile(i<MMM&&(j==-1||k==-1)){if(free_table[i].flag==0){if(free_table[i].address+free_table[i].length==S)k=i; //找到上邻if(free_table[i].address==S+L)j=i; //找到下邻}i++;}if(k!=-1)if(j!=-1) // 上邻空闲区,下邻空闲区,三项合并{free_table[k].length=free_table[j].length+free_table[k].length+L;free_table[j].flag=0;}else // 上邻空闲区,下邻非空闲区,与上邻合并free_table[k].length=free_table[k].length+L;elseif(j!=-1) //上邻非空闲区,下邻为空闲区,与下邻合并{free_table[j].address=S;free_table[j].length=free_table[j].length+L;}else //上下邻均为非空闲区,回收区域直接填入{ //在空闲区表中寻找空栏目t=0;while(free_table[t].flag==1&&t<MMM)t++;if(t>=MMM) //空闲区表满,回收空间失败,将已分配区表复原{MessageBox("主存空闲表没有空间,回收空间失败");used_table[s].flag=J;return;}free_table[t].address=S;free_table[t].length=L;free_table[t].flag=1;}return;}4)按钮函数设计◆【分配】按钮void CExp3Dlg::OnButtonAlloc(){this->UpdateData(true);CString name;float size;name=this->m_EDIT_NAME;size=this->m_EDIT_SIZE;allocate(name,size);}◆【回收】按钮void CExp3Dlg::OnButtonReclaim(){this->UpdateData(true);CString name;name=this->m_EDIT_NAME;this->reclaim(name);}◆【显示分配区】按钮void CExp3Dlg::OnButtonAllocate(){CString str,xx;CListBox *L;L=&m_LIST_ALLOC;L->ResetContent();L->InsertString(0,"起始地址分区长度标志");for(int j=0;j<10;j++){str="";xx.Format("%-8.2f",used_table[j].address);str+=xx+" ";xx.Format("%-8.2f",used_table[j].length);str+=xx+" ";xx.Format("%s",used_table[j].flag);str+=xx;L->InsertString(j+1,str);}}◆【显示回收区】按钮void CExp3Dlg::OnButtonFree(){// TODO: Add your control notification handler code hereCString str,xx;CListBox *L;L=&m_LIST_FREE;L->ResetContent();L->InsertString(0,"起始地址分区长度标志");for(int j=0;j<MMM;j++){str="";xx.Format("%-8.2f",free_table[j].address);str+=xx+" ";xx.Format("%-8.2f",free_table[j].length);str+=xx+" ";xx.Format("%5d",free_table[j].flag);str+=xx;L->InsertString(j+1,str);}}3.界面设计本程序的界面力求简洁、友好,每一步需要用户操作的提示以及每一次用户操作产生的调度结果都以中文的形式显示在屏幕上,使用户对要做什么和已经做了什么一目了然。

五、实验结果与分析1.本程序可以模拟动态分区存储管理方式的主存分配回收过程,并在对话框中进行显示,经检验,结果正确。

但是,这个程序的优化还是尚待完善的,比如:(1)应在分别在分配和回收时设置计数器,以记录当前空闲区和分配区中作业的数目,这样,就可以在显示时便于控制,不要一次显示数组中的所有储存信息,影响界面整齐(2)程序只是简单的实现了分配与回收的过程,对于一些细节问题和边界问题出力的比较粗糙。

相关主题