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

动态分区存储管理方式的主存分配回收

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

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

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

三、实验步骤实现动态分区的分配和回收,主要考虑的问题有三个:第一,设计记录主存使用情况的数据表格,用来记录空闲区和作业占用的区域;第二,在设计的数据表格基础上设计主存分配算法:第三,在设计的数据表格基础上设计主存回收算法。

首先,考虑第—个问题:设计记录主存使用情况的数据表格,用来记录空闲区和作业占用的区域。

由于动态分区的大小是由作业需求量决定的,故分区的长度是预先不固定的,且分区的个数也随主存分配和回收变动。

总之,所有分区情况随时可能发生变化,数据表格的设计必须和这个特点相适应。

由于分区长度不同,因此设计的表格应该包括分区在主存中的起始地址和长度。

个作业占用分区的登记项,内容为该作业的作业名;空闲区表中除了分区起始地址、长度外,也要有一项“标志”,如果是空闲栏目,内容为“空”,如果为某个空闲区的登记项,内容为“未分配”。

在实际系统中,这两表格的内容可能还要多,实验中仅仅使用上述必须的数据。

为此,“已分配区表”和“空闲区表”可变分区管理方式将内存除操作系统占用区域外的空间看做一个大的空闲区。

当作业要求装入内存时,根据作业需要内存空间的大小查询内存中的各个空闲区,当从内存空间中找到一个大于或等于该作业大小的内存空闲区时,选择其中一个空闲区,按作业需求量划出一个分区装人该作业,作业执行完后,其所占的内存分区被收回,成为一个空闲区。

如果该空闲区的相邻分区也是空闲区,则需要将相邻空闲区合并成一个空闲区。

四、实验结果程序代码:#include <iostream.h>#include <iomanip.h>float minsize=5;int count1=0;int count2=0;#define m 10#define n 10struct{float address;float length;int flag;}used_table[n];struct{float address;float length;int flag;}free_table[m];void initialize(void);int distribute(int, float);int recycle(int);void show();void initialize(void){int a;for(a=0; a<=n-1; a++)used_table[a].flag=0;free_table[0].address=1000;free_table[0].length=1024;free_table[0].flag=1;}int distribute(int process_name, float need_length) {int i, k=-1;float ads, len;int count=0;i=0;while(i<=m-1){if(free_table[i].flag==1 && need_length <=free_table[i].length){count++;if(count==1||free_table[i].length < free_table[k].length)k=i;}i=i+1;}if(k!=-1){if((free_table[k].length-need_length)<=minsize){free_table[k].flag=0;ads=free_table[k].address;len=free_table[k].length;}else{ads=free_table[k].address;len=need_length;free_table[k].address+=need_length;free_table[k].length-=need_length;}i=0;while(used_table[i].flag!=0){i=i+1;}if(i<=n-1){used_table[i].address=ads;used_table[i].length=len;used_table[i].flag=process_name;count1++;}else{if(free_table[k].flag == 0){free_table[k].flag=1;free_table[k].address=ads;free_table[k].length=len;}else{free_table[k].address=ads;free_table[k].length+=len;}cout<<"内存分配区已满,分配失败!\n";return 0;}}else{cout <<"无法为该作业找到合适分区!\n";return 0;}return process_name;}int recycle(int process_name){int y=0;float recycle_address, recycle_length;int i, j, k;int x;while(y<=n-1&&used_table[y].flag!=process_name){ y=y+1;}if(y<=n-1){recycle_address=used_table[y].address;recycle_length=used_table[y].length;used_table[y].flag=0;count2++;}else{cout<<"该作业不存在!\n";return 0;}j=k=-1;i=0;while(!(i>=m||(k!=-1&&j!=-1))){if(free_table[i].flag==1){ if((free_table[i].address+free_table[i].length)==recycle_address) k=i;if((recycle_address+recycle_length)==free_table[i].address)j=i;}i=i+1;}if(k!=-1){if(j!=-1){free_table[k].length+=free_table[j].length+recycle_length;free_table[j].flag=0;}elsefree_table[k].length+=recycle_length;}else if(j!=-1){free_table[j].length+=recycle_length;free_table[j].address=recycle_address;}else{x=0;while(free_table[x].flag!=0)x=x+1;if(x<=m-1){free_table[x].length=recycle_length;free_table[x].flag=1;}else{used_table[y].flag=process_name;cout<<"空闲区已满,回收失败!\n";return 0;}}return process_name;}void show(){cout<<" 空闲区\n";for(int i=0;i<=count2;i++)cout<<"地址:"<<free_table[i].address<<" "<<"作业长度:"<<free_table[i].length<<" "<<"状态:"<<free_table[i].flag<<endl;cout<<"已分配区\n";for(int j=0;j<count1;j++)cout<<"地址:"<<used_table[j].address<<" "<<"作业长度:"<<used_table[j].length<<" "<<"作业名:"<<used_table[j].flag<<endl;}void main(){int choice;int job_name;float need_memory;bool exitFlag=false;cout<<" 动态分区分配方式的模拟\n";initialize();while(!exitFlag){cout<<"1: 分配内存2: 回收内存\n";cout<<"3: 查看分配0: 退出\n";cin>>choice;switch(choice){case 0:exitFlag=true;break;case 1:cout<<"请输入作业名和所需内存:";cin>>job_name>>need_memory;distribute(job_name, need_memory);break;case 2:int ID;cout<<"请输入您要释放的分区号:";cin>>ID;recycle(ID);break;case 3:show();break;}}}内存分配回收实现截图(1)、假定系统内存分配表允许的最大作业项为10,当分配超过10时,提示“内存分配区已满,分配失败”。

(2)、回收作业所占内存时,当输入的作业名不存在,回收失败,提示“该作业不存在”。

(3)、当要释放某个作业时,将已分配表中此作业的标志置为‘0’,并在空闲区做相应登记。

相关主题