预习报告
一、实验内容
主存储器空间的分配和回收。
二、实验目的
一个好的计算机系统不仅要有一个足够容量的、存取速度高的、稳定可靠的主存储器,而且要能合理地分配和使用这些存储空间。当用户提出申请存储器空间时,存储管理必须根据申请者的要求,按一定的策略分析主存空间的使用情况,找出足够的空闲区域分配给申请者。当作业撤离或主动归还主存资源时,则存储管理要收回作业占用的主存空间或归还部分主存空间。主存的分配和回收的实现与主存储器的管理方式有关的,通过本实验帮助学生理解在可变分区管理方式下应怎样实现主存空间的分配和回收。
三、实验原理
模拟在可变分区管理方式下采用最先适应算法实现主存分配和回收。
(1)可变分区方式是按作业需要的主存空间大小来分割分区的。当要装入一个作业时,根据作业需要的主存量查看是否有足够的空闲空间,若有,则按需要量分割一个分区分配给该作业;若无,则作业不能装入。随着作业的装入、撤离,主存空间被分成许多个分区,有的分区被作业占用,而有的分区是空闲的。例如:
为了说明哪些区是空闲的,可以用来装入新作业,必须要有一张空闲区说明表,格式如下:
起 址 | 长 度 | 状 态 | |
第一栏 | 14 K | 12 K | 未 分 配 |
第二栏 | 32 K | 96 K | 未 分 配 |
M | M | M | M |
其中,起址——指出一个空闲区的主存起始地址。
长度——指出从起始地址开始的一个连续空闲的长度。
状态——有两种状态,一种是“未分配”状态,指出对应的由起址指出的某个长度的区域是空闲区。
(2) 当有一个新作业要求装入主存时,必须查空闲区说明表,从中找出一个足够大的空闲区。有时找到的空闲区可能大于作业需要量,这时应把原来的空闲区变成两部分:一部分分给作业占用;另一部分又成为一个较小的空闲区。为了尽量减少由于分割造成的空闲区,而尽量保存高地址部分有较大的连续空闲区域,以利于大型作业的装入。为此,在空闲区说明表中,把每个空闲区按其地址顺序登记,即每个后继的空闲区其起始地址总是比前者大。
(3) 采用最先适应算法分配主存空间。
按照作业的需要量,查空闲区说明表,顺序查看登记栏,找到第一个能满足要求的空闲区。当空闲区大于需要量时,一部分用来装入作业,另一部分仍为空闲区登记在空闲区说明表中。
由于本实验是模拟主存的分配,所以把主存区分配给作业后并不实际启动装入程序装入作业,而用输出“分配情况”来代替。
(4) 当一个作业执行结束撤离时,作业所占的区域应该归还,归还的区域如果与其它空闲区相邻,则应合成一个较大的空闲区,登记在空闲区说明表中。
(5) 请按最先适应算法设计主存分配和回收的程序。假设初始时主存中没有作业,现按下面序列进行内存的申请与释放:
作业1申请300K,作业2申请100K,作业1释放300K,作业3申请150K,
作业4申请30K, 作业5申请40K, 作业6申请60K, 作业4释放30K。
请你为它们进行主存分配和回收,把空闲区说明表的初值以及每次分配或回收后的变化显示出来或打印出来。
实验
一、实验内容
主存储器空间的分配和回收。
二、实验目的
一个好的计算机系统不仅要有一个足够容量的、存取速度高的、稳定可靠的主存储器,而且要能合理地分配和使用这些存储空间。当用户提出申请存储器空间时,存储管理必须根据申请者的要求,按一定的策略分析主存空间的使用情况,找出足够的空闲区域分配给申请者。当作业撤离或主动归还主存资源时,则存储管理要收回作业占用的主存空间或归还部分主存空间。主存的分配和回收的实现与主存储器的管理方式有关的,通过本实验帮助学生理解在可变分区管理方式下应怎样实现主存空间的分配和回收。
三、实验原理
模拟在可变分区管理方式下采用最先适应算法实现主存分配和回收。
(1)可变分区方式是按作业需要的主存空间大小来分割分区的。当要装入一个作业时,根据作业需要的主存量查看是否有足够的空闲空间,若有,则按需要量分割一个分区分配给该作业;若无,则作业不能装入。随着作业的装入、撤离,主存空间被分成许多个分区,有的分区被作业占用,而有的分区是空闲的。例如:
操作系统 |
作业1 |
作业3 |
空闲区 |
作业2 |
空闲区 |
为了说明哪些区是空闲的,可以用来装入新作业,必须要有一张空闲区说明表,格式如下:
起 址 | 长 度 | 状 态 | |
第一栏 | 14 K | 12 K | 未 分 配 |
第二栏 | 32 K | 96 K | 未 分 配 |
M | M | M | M |
其中,起址——指出一个空闲区的主存起始地址。
长度——指出从起始地址开始的一个连续空闲的长度。
状态——有两种状态,一种是“未分配”状态,指出对应的由起址指出的某个长度的区域是空闲区。
(2) 当有一个新作业要求装入主存时,必须查空闲区说明表,从中找出一个足够大的空闲区。有时找到的空闲区可能大于作业需要量,这时应把原来的空闲区变成两部分:一部分分给作业占用;另一部分又成为一个较小的空闲区。为了尽量减少由于分割造成的空闲区,而尽量保存高地址部分有较大的连续空闲区域,以利于大型作业的装入。为此,在空闲区说明表中,把每个空闲区按其地址顺序登记,即每个后继的空闲区其起始地址总是比前者大。
(3) 采用最先适应算法分配主存空间。
按照作业的需要量,查空闲区说明表,顺序查看登记栏,找到第一个能满足要求的空闲区。当空闲区大于需要量时,一部分用来装入作业,另一部分仍为空闲区登记在空闲区说明表中。
由于本实验是模拟主存的分配,所以把主存区分配给作业后并不实际启动装入程序装入作业,而用输出“分配情况”来代替。
(4) 当一个作业执行结束撤离时,作业所占的区域应该归还,归还的区域如果与其它空闲区相邻,则应合成一个较大的空闲区,登记在空闲区说明表中。
(5) 请按最先适应算法设计主存分配和回收的程序。假设初始时主存中没有作业,现按下面序列进行内存的申请与释放:
作业1申请300K,作业2申请100K,作业1释放300K,作业3申请150K,
作业4申请30K, 作业5申请40K, 作业6申请60K, 作业4释放30K。
请你为它们进行主存分配和回收,把空闲区说明表的初值以及每次分配或回收后的变化显示出来或打印出来。
四、算法流程图
- 源程序及注释
#include<stdio.h>
int cl[100][3],top=1;
int in(int size){
int m,n;
for(m=1;m<=top;m++){
if(cl[m][1]>=size&&cl[m][2]==0){
for(n=top+1;n>m+1;n--){
cl[n][2]=cl[n-1][2];
cl[n][1]=cl[n-1][1];
cl[n][0]=cl[n-1][0];
}
cl[m+1][0]=cl[m][0]+size;
cl[m+1][1]=cl[m][1]-size;
cl[m+1][2]=0;
cl[m][1]=size;
cl[m][2]=1;
top++;
break;
}
}
for(m=1;m<=top;m++){
printf("\t%d\t%d\t",cl[m][0],cl[m][1]);
if(cl[m][2]==0) printf("未分配\n");
else printf("已分配\n");
}
}
int out(int size){
int m,n,l;
for(m=1;m<=top;m++){
if(cl[m][1]==size&&cl[m][2]==1){
if(cl[m-1][2]==0&&cl[m+1]==0){
cl[m-1][1]+=cl[m][1]+cl[m+1][1];
for(n=m;n<=top-2;n++){
for(l=0;l<3;l++)
cl[n][l]=cl[n+2][l];
}
top-=2;
}
else if(cl[m-1][2]==1&&cl[m+1][2]==0){
cl[m][2]=0;
cl[m][1]+=cl[m+1][1];
for(n=m+1;n<=top-1;n++){
for(l=0;l<3;l++)
cl[n][l]=cl[n+1][l];
}
top--;
}
else if(cl[m-1][2]==0&&cl[m+1][2]==1){
cl[m-1][1]+=cl[m][1];
for(n=m;n<=top-1;n++){
for(l=0;l<3;l++)
cl[n][l]=cl[n+1][l];
}
top--;
}
else
cl[m][2]=0;
break;
}
}
for(m=1;m<=top;m++){
printf("\t%d\t%d\t",cl[m][0],cl[m][1]);
if(cl[m][2]==0) printf("未分配\n");
else printf("已分配\n");
}
}
int main(){
cl[0][2]=1;
cl[1][1]=800;
printf("作业1申请300K:\n");in(300);
printf("作业2申请100K:\n");in(100);
printf("作业1释放300K:\n");out(300);
printf("作业3申请150K:\n");in(150);
printf("作业4申请30K:\n");in(30);
printf("作业5申请40K:\n");in(40);
printf("作业6申请60K:\n");in(60);
printf("作业4释放30K:\n");out(30);
return 0;
}
- 打印的程序运行时初值和运行结果
- 作业1申请300K的空间
- 作业2申请100K的空间
- 作业3释放300K的空间
- 作业3申请150K的空间
- 作业4申请30K的空间
- 作业5申请40K的空间
- 作业6申请60K的空间
- 作业4申请30K的空间
七、实验小结
本次实验在进行之前,先了解了主存储器分配和回收的原理,尤其是一个大块的空间如何划分为两小块,一块用于分配一块用于未分配。还需要根据申请存储器空间的情况按一定的策略分析主存空间的使用情况,找出足够的空闲区域分给申请者。当作业撤离或主动归还主存资源时,存储管理要收回作业占用的主存空间。当原理明白了之后,程序的思路也清晰了起来,所以实验过程较为顺利。
查看空闲分区说明表,第一个可满足且未被分配的分区起址为400K,长度也为400K,大于100K的所需空间大小,所以可以满足。