年级 2008级 学号 2008431015 姓名 邢旻鸿 成绩 专业 信息与计算科学 实验地点 主楼401 指导教师 王硕 实验项目 单处理器系统的进程调度 实验日期 2010年12月19日 一、实验目的
深入了解动态分区存储管理方式的主存分配回收的实现。
二、实验要求
编写程序完成动态分区存储管理方式的主存分配回收的实现。实验具体包括:首先确定主存空间分配表;然后采用最优适应算法完成主存空间的分配,完成主存空间的回收;最后编写主函数对所作工作进程测试。
三、实验原理:
存储管理中动态分区的管理方式。
四、实验程序设计
1. 数据结构
已分分区表的数据结构定义
#define n 10 //假定系统允许的最大作业数量为n typedef struct used { float address; //已分分区起始地址 float length; //已分分区长度,单位为字节 CString flag; //已分配区表登记栏标志,用\"0\"表示空栏目,作业名表示使用 }USED; //已分配区表 USED used_table[n];
空闲区表的数据结构定义
#define m 10 //假定系统允许的空闲区表最大为m typedef struct free { float address; //空闲区起始地址 float length; //空闲区长度,单位为字节 int flag; //空闲区表登记栏标志,用\"0\"表示空栏目,用\"1\"表示未分配 }FREE; //空闲区表 FREE free_table[m];
- 1 -
2.功能函数设计
1) 系统数据初始化 free_table[0].address=10240; free_table[0].length=102400; free_table[0].flag=1; //空闲区表初始化
for(i=1;i void CExp3Dlg::allocate(CString J, float xk) //采用最优分配算法分配xk大小的空间 { int i,k; float ad; k=-1; for(i=0;i /*找到可用空闲区,开始分配:若空闲区大小与要求分配的空间差小于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 - 2 - 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 //修改已分配区表 used_table[s].flag='0'; //取得归还分区的起始地址S和长度L S=used_table[s].address; L=used_table[s].length; j=-1;k=-1;i=0; //寻找回收分区的上下邻空闲区,上邻表目k,下邻表目j while(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; else if(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 } 4) 按钮函数设计 【分配】按钮 void CExp3Dlg::OnButtonAlloc() { this->UpdateData(true); CString name; float size; name=this->m_EDIT_NAME; size=this->m_EDIT_SIZE; allocate(name,size); } - 4 - 【回收】按钮 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\ str+=xx+\" \"; xx.Format(\"%-8.2f\ str+=xx+\" \"; xx.Format(\"%s\ str+=xx; L->InsertString(j+1,str); } } 【显示回收区】按钮 void CExp3Dlg::OnButtonFree() { // TODO: Add your control notification handler code here CString str,xx; CListBox *L; L=&m_LIST_FREE; L->ResetContent(); L->InsertString(0,\"起始地址 分区长度 for(int j=0;j 标志\"); 标志\"); } } xx.Format(\"%5d\ str+=xx; L->InsertString(j+1,str); 3.界面设计 本程序的界面力求简洁、友好,每一步需要用户操作的提示以及每一次用户操作产生的调度结果都以中文的形式显示在屏幕上,使用户对要做什么和已经做了什么一目了然。 五、实验结果与分析 1.本程序可以模拟动态分区存储管理方式的主存分配回收过程,并在对话框中进行显示,经检验,结果正确。但是,这个程序的优化还是尚待完善的,比如: (1) 应在分别在分配和回收时设置计数器,以记录当前空闲区和分配区中作业的数目,这样, 就可以在显示时便于控制,不要一次显示数组中的所有储存信息,影响界面整齐 (2) 程序只是简单的实现了分配与回收的过程,对于一些细节问题和边界问题出力的比较粗 糙。例如当没有分配区没有作业时,【回收】按钮应失效;在进行回收过程时,不仅要输入作业名,还要输入作业大小,这在实际应用中是很不方便的。 2.测试样本数据如下: [1] 分配作业(作业名-作业大小)a-2,b-12,c-15,d-18 分配区内容 应进行控制,使界面整齐 应进行控制,使界面整齐 - 6 - [2] 分配作业e-58,回收作业a - 7 - 因篇幅问题不能全部显示,请点此查看更多更全内容