实验四 主存储器空间的分配和回收

更新时间:2023-09-05 02:04:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

漳 州 师 范 学 院

实 验 报 告

班 级 11网络2班 学号 姓名 座号 15 同组人

实 验 内 容 与 具 体 步 骤

源代码 如下:#include <stdio.h> #include <stdlib.h> #include <iostream.h> #define n 10 //模拟实验中,允许的最大作业数目 #define m 10 //模拟实验中,允许的最大空间分区数目 #define minisize 100 /*该空闲区低于该值,可视为碎片。分配分区时,若寻找到的最小适合空间相对 作业请求的 空间来说仍大于该数值,则要分割该分区 ,但是分割后,空闲为很小,变成碎片,则不分 割。*/ struct { float address; //已分配分区起始地址 float length; //已分配分区长度,单位为字符 int flag; //0 表明为空闲的。否则为已分配,记录作业的名称。 }used_table[n];//已分配分区表 struct { float address; float length; int flag;//0 表示是空表目,否则 1 表示空闲分区为"未分配" }free_table[m]; void allocate(char job,float xk) { //该内存分配算法,采用是最优适应算法, int i,k; float ad; k=-1; for(i=0;i<=m;i++) if(free_table[i].length>=xk&&free_table[i].flag==1) //通过该循环,先找到最小分区 if(k==-1||free_table[i].length<free_table[k].length) k=i;//用变量 k 来存放最小的分区的下标 if(k==-1) { printf("Allocation failure!\n"); return; } if(free_table[k].length-xk<=minisize) {//不需分割的情况,用 变量 ad 和 xk 存放将分配出去空闲区的地址和长度 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<n) i++; if(i>=n ) {//若已分配分区表已经满,则不给予分配,若有进行分割,则取消分割操作 printf("the used_table is full!\n"); 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=job; } return; } //主存回收函数,回收作业 job 所占用的分区空间 void reclaim(char job) {//根据所给流程图补充该函数。。。 int i,k,j,s,t; float S,L;//S 将要被回收的起始地址,L 将要被回收的长度 //寻找已分配分区表中对应的登记项 s=0; while((used_table[s].flag!=job||used_table[s].flag==0)&&s<n) s++; if(s>=n)//

在已分配分区表中,未找到作业 job 登记占用的分区空间 { printf("Can not find the job!\n"); return; } used_table[s].flag=0; //取得回收分区的起始地址 S 和长度 L S=used_table[s].address; L=used_table[s].length; j=-1; k=-1; i=0; for(;i<m;i++) { if(free_table[i].address+free_table[i].length==S) k=i; if(S+L==free_table[i].address) j=i; } if(k!=-1&&j==-1) { free_table[k].length=free_table[k].length+L; used_table[s-1].flag=0; } if(j!=-1&&k==-1) { free_table[j].length=free_table[j].length+L; used_table[s+1].flag=0; } if(j!=-1&&k!=-1) { free_table[k].length=free_table[j].length+L+free_table[k].length; used_table[s+1].flag=0; used_table[s-1].flag=0; } if(j==-1&&k==-1) { free_table[i].length=L; } //寻找回收空间的上、下相邻分区,上邻分区表目 k,下邻分区表目 j //有上邻还有下邻

//只有上邻 free_table[i].address+length==S // 是:free_table[i].length=free_table[i].length+L // Use_table[s-1].flag=0; //只有下邻 S+L==free_Table[i].address //是:free_table[i].length=free_table[i].length+L // free_table[i].address=S //没有上邻也没有下邻 } //主函数 void main() { int i,a; float xk; char job; 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; while(1) { printf("Menu:0-exit;1-allocation;2-reclaim;3-list\n"); printf("Please choose(0-3):"); scanf("%d",&a); getchar(); switch(a) { //a=0 程序结束 case 0: exit(0); //a=1,分配主存空间 case 1: printf("Please enter the job and the memory length you want:"); scanf("%c%f",&job,&xk); allocate(job,xk); // printf("test xk=%f\n",xk); break; //a=2,回收主存空间 case 2: printf("please enter the job you want to reclaim memory:"); //scanf("%c",&job); cin>>job; //job=getchar(); reclaim(job); break; //a=3,输出空间分区表和已分配分区表 case 3:printf("The free_table:\naddress length flag\n"); for(i=0;i<m;i++) printf("%6.0f%9.0f%6d\n\n",free_table[i].address,free_table[i].length, free_table[i].flag); printf("The used_table:\n address length flag\n"); for(i=0;i<n;i++) if(used_table[i].flag!=0) printf("%6.0f%9.0f%6c\n",used_table[i].address,used_table[i].length, used_table[i].flag); else printf("%6.0f%9.0f%6d\n",used_table[i].address,used_table[i].length, used_table[i].flag); break; default:printf("No this choose!\n"); } } }

1)初始状态10240 空闲区 102400

2)分配给作业 c 的一个空间,长度为 20k

10240 空闲区 102380

112620

作业 C

3)回收作业 C,并与其上邻空间合并

10240 空闲区 102400

漳 州 师 院 实 验 报 告

实验中存在的问题及解决办法: 这次实验比较复杂,用了很多时间,但同时也收获了很多,理解了在不同的存储 管理方式下应怎样进行存储空间的分配和回收,对主存空间分配认识加深了很多,同 时在程序编写方面有了进一步提

高,做到理论与实践相结合。

实 验 心 得

注:如果填写内容超出表格,自行添加附页。

本文来源:https://www.bwwdw.com/article/hi6i.html

Top