可变分区存储管理+实验报告+程序+设计思路和感悟

可变分区存储管理+实验报告+程序+设计思路和感悟
可变分区存储管理+实验报告+程序+设计思路和感悟

实验题目:可变分区存储管理

一、实验目的

可变分区存储管理方式是操作系统中存储管理的重要方式,其主要思想是

用户作业进行连续存储,每次按照用户的请求,如果内存中有能满足用户作业大小的空闲区,就采用不同的算法分配给用户,否则,不分配,可变分区容易产生外零头。分区分配算法包括最佳适应算法、最坏适应算法、首次适应算法

等。

通过本实验可加深学生对存储器管理方式的把握以及分配算法的理解,并提高程序设计的能力。

二、实验环境

个人PC机WindowsXP操作系统I5-2400CPU 3.10Ghz 2GB内存

C-Free C语言程序设计软件

三、实验的重点和难点

可变分区的的收回

四、实验内容

利用C语言或C++语言或Java语言实现可变分区存储管理,具体要求如下:

1. 以一个一维数组模拟内存,数组类型为整型,共计1000个元素;

2. 用一个单链表表示可变分区空闲表,链表每个结点表示一个空闲区,每

个结点信息包括起始地址、大小。

3. 分区分配算法采用最佳适应算法、首次适应算法,并将算法用函数实现。

4. 自己假设几个作业,包括作业的名称、大小,进入系统的顺序。

5. 初始内存中没有任何作业,随着用户输入的每一个作业的到来,动态为

其分配内存。

6. 使用的算法用户要能够随时更换。

五、实验结果或实验代码

(1) 可变式分区管理是指在处理作业过程中建立分区,使分区大小正好适合作业的需要,并且分区个数可以调整。当要装入一个作业时,根据作业需要的内存量,查看是否有足够的空闲空间,若有,则按需求量分割一部分给作业;若没有,则作业等待。随着作业的装入、完成,内存空间被分割成许多大大小小的分区。有的分区被作业占用,有的分区空闲。例如,某时刻内存空间占用情况如图1所示。

为了说明那些分区是空闲的,可以用来装入新作业,必须要有一张空闲区说明表,如表1所示。

表1 空闲区说明表

图1 内存空间占用情况

6

2

2

41

其中,起始地址指出个空闲区的内存起始地址,长度指出空闲区的大小。

状态(未分配:该栏目记录的是有效空闲区)

状态(空表目:没有登记信息)

由于分区个数不定,所以空闲区说明表中应该有足够的空表目项。否则造成溢出,无法登记。

同样,再设一个已分配表,记录作业或进程的内存占用情况。

(2) 当有一个新作业要求装入内存时,必须查空闲区说明表,从中找出一个足够大的空闲区。有时找到的空闲区可能大于作业需求量,这时应将空闲区一分为二。一个分给作业,另外一个作为空闲区留在空闲区表中。为了尽量减少由于分割造成的碎片,尽可能分配低地址部分的空闲区,将较大空闲区留在高地址端,以利于大作业的装入。为此在空闲区表中,按空闲区首地址从低到高进行登记。为了便于快速查找,要不断地对表格进行紧缩,即让“空表目”项留在表的后部。其分配框图如图2所示。

图 2 首次适应算法分配框

(3) 当一个作业执行完成时,作业所占用的分区应归还给系统。在归还时要考虑相邻空闲区合并的问题。作业的释放区与空闲区的邻接分以下4种情况考虑:

●释放区下邻(低地址邻接)空闲区;

●释放区上邻(高地址邻接)空闲区;

●释放区上下都与空闲区邻接;

●释放区与空闲区不邻接。

首次适应算法回收框图如图3所示。

(4) 请按首次适应算法设计内存分配和回收程序。以表2当前使用的基础,初始化空闲区和已分配区说明表值。设计一个作业申请队列以及作业完成后的释放顺序,实现内存的分配与回收。把空闲区说明表的变化情况以及各作业的申请、释放情况显示或打印出来。

表2 空闲区说明表

程序代码

#include "iostream.h"

#include "stdio.h"

#include "stdlib.h"

#include "conio.h"

#define n 10 //假定系统允许的最大作业数量为n

#define m 10 //假定系统允许的空闲区表最大为m

#define minisize 1000

struct

{

float address; //已分分区起始地址

float length; //已分分区长度,单位为字节

int flag; //已分分区表登记栏标志,用"0"表示空栏目,实验中只支持一个字符的作业名

}used_table[n]; //已分分区表

struct

{

float address; //空闲区起始地址

float length; //空闲区长度,单位为字节

int flag; //空闲区表登记栏标志,用"0"表示空栏目,用"1"表示未分配

}free_table[m]; //空闲区表

int allocate(char J,float xk) //采用最有分配法分配xk大小的空间

//char J;

//float xk;

{

int i,k;

float ad;

k=-1;

for(i=0;i

if(free_table[i].length>=xk&&free_table[i].flag==1)

if(k==-1||free_table[i].length

k=i;

if(k==-1) //未找到可用空闲区,返回

{

cout<<"无可用空闲区"<

return 0;

}

//找到可用空闲区,开始分配:若空闲区大小与分配的空间差小于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

{

i++;

if(i>=n)

{

cout<<"无表目填写已分分区,错误"<

//修正空闲区表

if(free_table[k].flag==0) //前面找到的是整个空闲区

free_table[k].flag=1;

else //前面找到的是某个空闲区的一部分free_table[k].length=free_table[k].length+xk;

return 0;

}

else

{

used_table[i].address=ad;

used_table[i].length=xk;

used_table[i].flag=J;

}

return 1;

}//内存分配函数结束

}

int reclaim(char J) //回收作业名为J的作业所占内存空间

//char J;

{

int i,k,j,s,t;

float S,L;

//寻找已分分区表中对应登记项

s=0;

while((used_table[s].flag!=J||used_table[s].flag==0)&&s

s++;

if(s>=n) //在已分分区表中找不到名字为J的作业

{

cout<<"找不到该作业"<

return 0;

}

//修改已分分区表

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

{

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;

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

t++;

if(t>=m) //空闲区表满,回收空间失败,将已分分区表复原

{

cout<<"内存空闲表没有空间,回收空间失败"<

used_table[s].flag=J;

return 0;

}

free_table[t].address=S;

free_table[t].length=L;

free_table[t].flag=1;

}

return 1;

} //内存归还函数结束

void main()

{

int i,a;

float xk;

char J;

//空闲区表初始化

free_table[0].address=10240;

free_table[0].length=102400;

free_table[0].flag=1;

for(i=1;i

free_table[i].flag=0;

//已分分区表初始化

for(i=0;i

used_table[i].flag=0;

while(1)

{

cout<<"选择功能项(0-推出,1-分配内存,2-回收内存,3-显示内存)"<

cout<<"选择功项(0~3):";

cin>>a;

switch(a)

{

case 0: exit(0); //a=0程序结束

case 1: //a=1 分配内存空间

cout<<"输入作业名J和作业所需长度xk:";

cin>>J>>xk;

allocate(J,xk); //分配内存空间

break;

case 2: //a=2回收内存空间

cout<<"输入要回收分区的作业名";

cin>>J;

reclaim(J); //回收内存空间

case 3: //a=3显示内存情况,输出空闲区表和已分分区表

cout<<"输出空闲区表:"<

cout<<" 起始地址分区长度标志"<

for(i=0;i

cout<

cout<<"按任意键,输出已分分区表"<

getch();

cout<<"输出已分分区表:"<

cout<<" 起始地址分区长度标志"<

for(i=0;i

if(used_table[i].flag!=0)

cout<

else

cout<

break;

default:

cout<<"没有该选项"<

}

}

}

为可变分区管理方式的工作过程画出流程图;

六、实验过程遇到的问题及其解决

当系统实现分配系统资源时,应该首先判断与本作业相匹配的空间资源大小,这样才能使得系统的资源利用率提高。然后再进行系统资源分配。初始使用的资源没有按照这种分配思路,而是直接在系统中查找到首先与之相匹配的空块,导致系统的资源利用率大大减小。

七、实验总结

通过这次关于可变分区存储管理的操作系统实验,我了解了操作系统关于内存共享、分页的过程、未分页合并内存与分页合并内存的管理以及如何提高分页的效率。关于概念性的内容有了更深层次的理解例如:分页就是将信息从主内存移动到磁盘进行临时存储的过程。应用程序经常需要彼此通信和共享信息。为了提供这种能力,Windows必须允许访问某些内存空间而不危及它和其他应用程序的安全性和完整性。使我对操作系统的作业功能有了更加深化一步的认识。

计算机操作系统内存管理系统可变分区存储管理方式的内存分配回收

精心整理课程设计2 可变分区存储管理方式的内存分配回收 一、课程设计目的 深入了解采用可变分区存储管理方式的内存分配回收的实现。 二、预备知识 存储管理中可变分区的管理方式。 给作业。但最优适应算法容易出现找到的一个分区可能只比作业所需求的长度略大一点的情行,这时,空闲区分割后剩下的空闲区就很小以致很难再使用,降低了内存的使用率。为解决此问题,设定一个限值minsize,如果空闲区的大小减去作业需求长度得到的值小于等于minsize,不再将空闲区分成己分分区和空闲区两部分,而是将整个空闲区都分配给作业。 内存分配与回收所使用的结构体:

为便于对内存的分配和回收,建立两张表记录内存的使用情况。一张为记录作业占用分区的“内存分配表”,内容包括分区起始地址、长度、作业名/标志(为0时作为标志位表示空栏目);一张为记录空闲区的“空闲分区表”,内容包括分区起始地址、长度、标志(0表空栏目,1表未分配)。两张表都采用顺序表形式。 关于分配留下的内存小碎片问题: 当要装入一个作业时,从“空闲分区表”中查找标志为“1”(未分配)且满足作业所需内存大小的最小空闲区,若空闲区的大小与作业所需大小的差值小于或等于minsize,把该分区全部分 “0” 下邻(1 的作业名 }used_table[n]; //已分配区表 (2)空闲分区表的定义: struct {float address; //空闲区起始地址

float length; //空闲区长度,单位为字节 int flag; //空闲区表登记栏标志,用"0"表示空栏目,用"1"表示未分配}free_table[m]; //空闲区表 (3)全局变量 float minsize=5; // { // { } { 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;

可变分区存储管理方式的内存分配和回收实验报告

一.实验目的 通过编写和调试存储管理的模拟程序以加深对存储管理方 案的理解,熟悉可变分区存储管理的内存分配和回收。 二.实验内容 1.确定内存空间分配表; 2.采用最优适应算法完成内存空间的分配和回收; 3.编写主函数对所做工作进行测试。 三.实验背景材料 实现可变分区的分配和回收,主要考虑的问题有三个:第一,设计记录内存使用情况的数据表格,用来记录空闲区和作业占用的区域;第二,在设计的数据表格基础上设计内存分配算法;第三,在设计的数据表格基础上设计内存回收算法。 首先,考虑第一个问题,设计记录内存使用情况的数据表格,用来记录空间区和作业占用的区域。 由于可变分区的大小是由作业需求量决定的,故分区的长度是预先不固定的,且分区的个数也随内存分配和回收变动。总之,所有分区情况随时可能发生变化,数据表格的设计必须和这个特点相适应。由于分区长度不同,因此设计的表格应该包括分区在内存中的起始地址和长度。由于分配时空闲区有时会变成两个分区:空闲区和已分分区,回收内存分区时,可能会合并空闲分区,这样如果整个内存采用一张表格记录己分分区和空闲区,就会使表格操作繁琐。分配内存时查找空闲区进行分配,然后填写己分

配区表,主要操作在空闲区;某个作业执行完后,将该分区变成空闲区,并将其与相邻的空闲区合并,主要操作也在空闲区。由此可见,内存的分配和回收主要是对空闲区的操作。这样为了便于对内存空间的分配和回收,就建立两张分区表记录内存使用情况,一张表格记录作业占用分区的“己分分区表”;一张是记录空闲区的“空闲区表”。这两张表的实现方法一般有两种:一种是链表形式,一种是顺序表形式。在实验中,采用顺序表形式,用数组模拟。由于顺序表的长度必须提前固定,所以无论是“已分分区表”还是“空闲区表”都必须事先确定长度。它们的长度必须是系统可能的最大项数。 “已分分区表”的结构定义 #definen10//假定系统允许的最大作业数量为n struct {floataddress;//已分分区起始地址 floatlength;//已分分区长度、单位为字节 intflag;//已分分区表登记栏标志,“0”表示空栏目,实验中只支持一个字符的作业名 }used_table[n];//已分分区表 “空闲区表”的结构定义 #definem10//假定系统允许的空闲区最大为m struct {floataddress;//空闲区起始地址

实验三动态分区存储管理方式的主

实验三动态分区存储管理方式的主存分配回收 一、实验目的 深入了解动态分区存储管理方式主存分配回收的实现。 二、实验预备知识 存储管理中动态分区的管理方式。 三、实验内容 编写程序完成动态分区存储管理方式的主存分配回收的实现。实验具体包括: 首先确定主存空间分配表;然后采用最优适应算法完成主存空间的分配和回收;最后编写主函数对所做工作进行测试。 四、提示与讲解 动态分区管理方式预先不将主存划分成几个区域,而把主存除操作系统占用区域外的空间看作一个大的空闲区。当作业要求装入主存时,根据作业需要主存空间的大小查询主存内各个空闲区,当从主存空间中找到一个大于或等于该作业大小的主存空闲区时,选择其中一个空闲区,按作业需求量划出一个分区装入该作业。作业执行完后,它所占的主存分区被收回,成为一个空闲区。如果该空闲区的相邻分区也是空闲区,则需要将相邻空闲区合并成一个空闲区。 实现动态分区的分配和回收,主要考虑的问题有三个: 第一,设计记录主存使用情况的数据表格,用来记录空闲区和作业占用的区域;第二,在设计的数据表格基础上设计主存分配算法;第三,在设计的数据表格基础上设计主存回收算法。 首先,考虑第一个问题: 设计记录主存使用情况的数据表格,用来记录空闲区和作业占用的区域。 由于动态分区的大小是由作业需求量决定的,故分区的长度是预先不固定的,且分区的个数也随主存分配和回收变动。总之,所有分区情况随时可能发生变化,数据表格的设计必须和这个特点相适应。由于分区长度不同,因此设计的表格应该包括分区在主

存中的起始地址和长度。由于分配时空闲区有时会变成两个分区: 空闲区和已分分区,回收主存分区时,可能会合并空闲分区,这样如果整个主存采用一张表格记录已分分区和空闲区,就会使表格操作繁琐。主存分配时查找空闲区进行分配,然后填写已分配区表,主要操作在空闲区;某个作业执行完后,将该分区变成空闲区,并将其与相邻的空闲区合并,主要操作也在空闲区。 由此可见,主存的分配和回收主要是对空闲区的操作。这样为了便于对主存空间的分配和回收,就建立两张分区表记录主存使用情况,一张表格记录作业占用分区的 “已分配区表”;一张是记录空闲区的“空闲区表”。这两张表的实现方法一般有两种,一种是链表形式,一种是顺序表形式。在实验中,采用顺序表形式,用数组模拟。由于顺序表的长度必须提前固定,所以无论是“已分配区表”还是“空闲区 表”都必须事先确定长度。它们的长度必须是系统可能的最大项数,系统运行过程中才不会出错,因而在多数情况下,无论是“已分配区表”还是“空闲区表”都有空闲栏目。已分配区表中除了分区起始地址、长度外,也至少还要有一项“标志”,如果是空闲栏目,内容为“空”,如果为某个作业占用分区的登记项,内容为该作业的作业名;空闲区表中除了分区起始地址、长度外,也要有一项“标志”,如果是空闲栏目,内容为“空”,如果为某个空闲区的登记项,内容为“未分配”。在实际系统中,这两表格的内容可能还要多,实验中仅仅使用上述必须的数据。为此, “已分配区表”和“空闲区表”在实验中有如下的结构定义。 已分配区表的定义: #define n 10// 假定系统允许的最大作业数量为n struct {float address;// 已分分区起始地址 float length; // 已分分区长度,单位为字节 int flag;// 已分配区表登记栏标志, “0表”示空栏目,实验中只支持一个字符的作业名}used_table[n];// 已分配区表 空闲区表的定义:

动态分区式存储管理

可变分区存储管理 设计思路: 整体思路: 可变分区管理方式将内存除操作系统占用区域外的空间看做一个大的空闲区。当作业要求装入内存时,根据作业需要内存空间的大小查询内存中的各个 空闲区,当从内存空间中找到一个大于或等于该作业大小的内存空闲区时,选择其中一个空闲区,按作业需求量划出一个分区装人该作业,作业执行完后,其所占的内存分区被收回,成为一个空闲区。如果该空闲区的相邻分区也是空闲区,则需要将相邻空闲区合并成一个空闲区。 设计所才用的算法: 采用最优适应算法,每次为作业分配内存时,总是把既能满足要求、又是最小的空闲分区分配给作业。但最优适应算法容易出现找到的一个分区可能只比作业所需求的长度略大一点的情行,这时,空闲区分割后剩下的空闲区就很小以致很难再使用,降低了内存的使用率。为解决此问题,设定一个限值min size,如果空闲区的大小减去作业需求长度得到的值小于等于min size,不再将空闲区分成己分分区和空闲区两部分,而是将整个空闲区都分配给作业。 内存分配与回收所使用的结构体: 为便于对内存的分配和回收,建立两张表记录内存的使用情况。一张为记录作业占用分区的“内存分配表”,内容包括分区起始地址、长度、作业名/标志(为0时作为标志位表示空栏目);一张为记录空闲区的“空闲分区表”,内容包括分区起始地址、长度、标志(0表空栏目,1表未分配)。两张表都采用顺序表形式。 关于分配留下的内存小碎片问题: 当要装入一个作业时,从“空闲分区表”中查找标志为“ 1”(未分配)且满足作业所需内存大小的最小空闲区,若空闲区的大小与作业所需大小的差值小于或等于min size,把该分区全部分配给作业,并把该空闲区的标志改为“0”(空栏目)。同时,在已分配区表中找到一个标志为“ 0”的栏目登记新装人作业所占用分区的起始地址,长度和作业名。若空闲区的大小与作业所需大小的差值大于

存储管理实验报告

实验三、存储管理 一、实验目的: ? 一个好的计算机系统不仅要有一个足够容量的、存取速度高的、稳定可靠的主存储器,而且要能合理地分配和使用这些存储空间。当用户提出申请存储器空间时,存储管理必须根据申请者的要求,按一定的策略分析主存空间的使用情况,找出足够的空闲区域分配给申请者。当作业撤离或主动归还主存资源时,则存储管理要收回作业占用的主存空间或归还部分主存空间。主存的分配和回收的实现虽与主存储器的管理方式有关的,通过本实验理解在不同的存储管理方式下应怎样实现主存空间的分配和回收。 在计算机系统中,为了提高主存利用率,往往把辅助存储器(如磁盘)作为主存储器的扩充,使多道运行的作业的全部逻辑地址空间总和可以超出主存的绝对地址空间。用这种办法扩充的主存储器称为虚拟存储器。通过本实验理解在分页式存储管理中怎样实现虚拟存储器。 在本实验中,通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解。熟悉虚存管理的各种页面淘汰算法通过编写和调试地址转换过程的模拟程序以加强对地址转换过程的了解。 二、实验题目: 设计一个可变式分区分配的存储管理方案。并模拟实现分区的分配和回收过程。 对分区的管理法可以是下面三种算法之一:(任选一种算法实现) 首次适应算法 循环首次适应算法 最佳适应算法 三.实验源程序文件名:cunchuguanli.c

执行文件名:cunchuguanli.exe 四、实验分析: 1)本实验采用可变分区管理,使用首次适应算法实现主存的分配和回收 1、可变分区管理是指在处理作业过程中建立分区,使分区大小正好适合作业的需求,并 且分区个数是可以调整的。当要装入一个作业时,根据作业需要的主存量查看是否有足够的空闲空间,若有,则按需要量分割一个分区分配给该作业;若无,则作业不能装入,作业等待。随着作业的装入、完成,主存空间被分成许多大大小小的分区,有的分区被作业占用,而有的分区是空闲的。 为了说明那些分区是空闲的,可以用来装入新作业,必须有一张空闲说明表 ? 空闲区说明表格式如下:? 第一栏 第二栏 其中,起址——指出一个空闲区的主存起始地址,长度指出空闲区的大小。 长度——指出从起始地址开始的一个连续空闲的长度。 状态——有两种状态,一种是“未分配”状态,指出对应的由起址指出的某个长度的区域是空闲区;另一种是“空表目”状态,表示表中对应的登记项目是空白(无效),可用来登记新的空闲区(例如,作业完成后,它所占的区域就成了空闲区,应找一个“空表目”栏登记归还区的起址和长度且修改状态)。由于分区的个数不定,所以空闲区说明表中应有适量的状态为“空表目”的登记栏目,否则造成表格“溢出”无法登记。 2、当有一个新作业要求装入主存时,必须查空闲区说明表,从中找出一个足够大的空闲区。 有时找到的空闲区可能大于作业需要量,这时应把原来的空闲区变成两部分:一部分分

实验五 动态分区存储管理

实验五动态分区存储管理 一、实验目的 深入了解采用动态分区存储管理方式的内存分配回收的实现。通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解,熟悉动态分区存储管理的内存分配和回收。 二、实验内容 编写程序完成动态分区存储管理方式的内存分配回收。 具体包括:确定内存空间分配表; 采用最优适应算法完成内存空间的分配和回收; 编写主函数对所做工作进行测试。 三、设计思路 整体思路: 动态分区管理方式将内存除操作系统占用区域外的空间看成一个大的空闲区。当作业要求装入内存时,根据作业需要内存空间的大小查询内存中的各个空闲区,当从内存空间中找到一个大于或等于该作业大小的内存空闲区时,选择其中一个空闲区,按作业需求量划出一个分区装人该作业,作业执行完后,其所占的内存分区被收回,成为一个空闲区。如果该空闲区的相邻分区也是空闲区,则需要将相邻空闲区合并成一个空闲区。 设计所采用的算法: 采用最优适应算法,每次为作业分配内存时,总是把既能满足要求、又是最小的空闲分区分配给作业。但最优适应算法容易出现找到的一个分区可能只比作业所需求的长度略大一点的情行,这时,空闲区分割后剩下的空闲区就很小以致很难再使用,降低了内存的使用率。为解决此问题,设定一个限值minsize,如果空闲区的大小减去作业需求长度得到的值小于等于minsize,不再将空闲区分成己分分区和空闲区两部分,而是将整个空闲区都分配给作业。 内存分配与回收所使用的结构体: 为便于对内存的分配和回收,建立两张表记录内存的使用情况。一张为记录作业占用分 区的“内存分配表”,内容包括分区起始地址、长度、作业名/标志(为0时作为标志位表示空栏目);一张为记录空闲区的“空闲分区表”,内容包括分区起始地址、长度、标志(0表空栏目,1表未分配)。两张表都采用顺序表形式。

固定分区存储管理

理工大学信息工程与自动化学院学生实验报告 ( 2013 —2014 学年第一学期) 课程名称:操作系统开课实验室:信自楼444 2013年 11月28 日 注:报告容按下列的要求进行。 一、实验目的 通过编写固定分区存储管理的模拟程序,加深对操作系统存储管理功能中的固定分区管理方式、主存分配表等相应知识的理解。 通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解,熟悉可变分区存储管理的存分配和回收。 二、实验题目 1.设计一个固定分区分配的存储管理方案。并模拟实现分区的分配和回收过程。 2.必须建立分区表,记录空闲区与占用区的状况。 3.流程图按选定的算法自己完成。

三、算法设计的思想或流程图 本系统将存用户空间划分为五个大小不固定的分区,其分区大小由用户输入决定。在每个分区只装入一道作业,这样把用户空间划分为几个分区,便允许几道作业并发运行。当有一个空闲分区时,便可以从外存的后备队列中选择一个适当大小的作业装入该分区,当该作业结束时又可以从后备作业队列中找出另一作业调入该分区。 每个存空间是一个Node型的对象。Node类有一个三个参数的构造函数。分别为:分区号、起始地址、大小。然后就是一些属性的get、set方法和一个打印其属性的函数。四个数据域分别为:属性m_No用来表示该存空间的序号。属性m_Addr用来表示存分区的起始地址。属性m_Size用来表示存空间的大小。属性m_State表示存空间的是否已分配的状态标志。若该存空间已分配,m_TaskNo表示占有该存空间的任务序号。否则没有实际意义。 在用户申请任务的存空间时,提示用户输入任务号和其需要的存空间大小。 流程图 主程序:

实验五动态分区存储管理模拟

实验五动态分区存储管理模拟 一、实验目的 深入了解可变分区存储管理式主存分配回收的实现。 二、实验预备知识 可变分区存储管理式不预先将主存划分成几个区域,而把主存除操作系统占用区域外的空间看作一个大的空闲区。当进程要求装入主存时,根据进程需要主存空间的大小查询主存各个空闲区,当从主存空间找到一个大于或等于该进程大小要求的主存空闲区时,选择其中一个空闲区,按进程需求量划出一个分区装入该进程。进程执行完后,它所占的主存分区被回收,成为一个空闲区。如果该空闲区的相邻分区也是空闲区,则需要将相邻空闲区合并成一个空闲区。 这个实验主要需要考虑三个问题: (1)设计记录主存使用情况的数据表格,用来记录空闲区和进程占用的区域; (2)在设计的数据表格基础上设计主存分配算法; (3)在设计的数据表格基础上设计主存回收算法。 首先,考虑第一个问题:设计记录主存使用情况的数据表格,用来记录空闲区和进程占用的区域。 由于可变分区的大小是由进程需求量决定的,故分区的长度是预先不固定的,且分区的个数也随主存分配和回收而变动。总之,所有分区情况随时可能发生变化,数据表格的设计必须和这个特点相适应。由于分区长度不同,因此设计的表格应该包括分区在主存中的起始地址和长度。由于分配时空闲区有时会变成两个分区:空闲区和已分分区,回收主存分区时,可能会合并空闲分区,这样如果整个主存采用一表格记录已分分区和空闲区,就会使表格操作繁琐。主存分配

时查找空闲区进行分配,然后填写已分分区表,主要操作在空闲区;某个进程执行完成后,将该分区变成空闲区,并将其与相邻空闲区合并,主要操作也在空闲区。由此可见,主存分配和回收主要是对空闲区的操作。 这样,为了便于对主存空间的分配和回收,就建立两分区表记录主存使用情况,一表格记录进程占用分区的“已分分区表”;一是记录空闲区的“空闲区表”。这两表的实现法一般有两种,一种是链表形式,一种是顺序表形式。在实验中,采用顺序表形式,用数组模拟。由于顺序表的长度必须提前固定,所以无论是“已分分区表”还是“空闲区表”都必须事先确定长度。它们的长度必须是系统可能的最大项数,系统运行过程中才不会出错,因而在多数情况下,无论是“已分分区表”还是“空闲区表”都有空闲栏目。已分分区表中除了分区起始地址、长度外,也至少还要有一项“标志”,如果是空闲栏目,容为“空”,如果为某个进程占用分区的登记项,容为该进程的进程名;空闲区表中除了分区起始地址、长度外,也要有一项“标志”,如果是空闲栏目,容为“空”,如果为某个空闲区的登记项,容为“未分配”。在实际系统中,这两个表格的容可能还要更多,实验中仅仅使用上述必须的数据。为此,“已分分区表”和“空闲区表”在实验中有如下的结构定义: 已分分区表的定义: #define n 10 //假定系统允的进程数量最多为n struct { float address; //已分分区起始地址 float length; //已分分区长度,单位为字节

操作系统可变分区存储管理模拟

操作系统实验(三)可变分区存储管理模拟实验 作者:顾熙杰 准考证号:4 报到号:177 实验地点:浙工大计算机中心 1)实验目的 理解操作系统中可变分区管理的算法, 掌握分配和回收算法 掌握空闲分区的合并方法 掌握不同的适应算法 2)实验内容 建立数据结构 建立空闲分区队列 根据不同的适应算法建立队列 编写分配算法 编写回收算法 3)数据结构 Private Type MEM_tp fenqu_shouzhi As Integer '分区首地址 fenqu_changdu As Integer '分区长度 fenqu_zhuangtai As Integer '分区状态-1表示不存在,0表示空闲分区,1表示已经分配的分区 fenqu_huodongjincheng As Integer '该分区正在活动的进程代号 End Type 4)程序流程图 面向对象程序设计由事件驱动,画流程图比较困难。 (1)分配新的分区 最先适应按地址找 最优适应,找最小可以满足的 最坏适应,找最大可以满足的 (2)分区回收 既无上邻又无下邻 既有上邻又有下邻 只有上邻 只有下邻 5)实验中需要改进的地方 由于没有使用链表,程序结构比较混乱,需要大大改进,提高可阅读性。 6)程序代码(VB)

Option Explicit Private Declare Function ShellExecute Lib "Shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lp String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long '表示内存分区的结构信息类型的变量类型 Private Type MEM_tp fenqu_shouzhi As Integer '分区首地址 fenqu_changdu As Integer '分区长度 fenqu_zhuangtai As Integer '分区状态-1表示不存在,0表示空闲分区,1表示已经分配的分区 fenqu_huodongjincheng As Integer '该分区正在活动的进程代号 End Type '定义最多640个,总共640K内存数组 Dim MEM(1 To 640) As MEM_tp '表示可以使用的进程代号 Dim jincheng(1 To 640) As Integer '0表示该进程号可以使用 '.>=1表示该进程号不可以使用 '表示分配方法 Dim fenPEI_fangfa As Integer '0=最先分配 '1=最优分配 '2=最坏分配 Function get_jincheng() As Integer '取可以使用的进程号 Dim i As Integer For i = 1 To 640 If jincheng(i) = 0 Then jincheng(i) = 1 get_jincheng = i Exit Function End If Next get_jincheng = 0 End Function Function get_FENQU() As Integer '取可以使用的为了表示分区的存储空间,模拟c语言的指针 Dim i As Integer For i = 1 To 640

可变分区存储管理方案模拟

#include #include #include #define MAX 10 struct data1 /*空闲区表*/ { int address; int length; int flag; }; struct data2 /*已分配区表*/ { int address; int length; char name[20]; }; struct data1 empty[MAX]; //定义了两个结构体数组(各含Max 个元素),分别用来存放空闲分区表和已分配分区表 struct data2 busy[MAX]; void initialize( ); //将empty 和busy 数组中的元素置"空"值 int read_data( );/*从文件中读出数据*/ void display_empty_table(int); /*显示空闲区表*/ void display_busy_table(int); /*显示已分配区表*/ void badest_fit( int *,int *,char *name,int s );/*最坏适应算法*/ void first_fit( int *,int *,char *name,int s ); /*最先适应算法*/ void best_fit( int *,int *,char *name,int s ); /*最佳适应算法*/ void main( ) { int num1,num2,size; /*num1 用于统计空闲表的,num2 用于统计分配区表*/ char name[20]; num2=0; initialize( ); if( num1==0 ) /*初始花空闲区表和分配区表*/ /*表示文件中没有数据*/ num1=read_data( ); /*将空闲分区信息读入empty 数组,并返回空闲分区个数*/ printf("there has no data in empty table\n"); printf("the initialial empty table is:\n"); display_empty_table( num1 ); /*显示空闲区表*/ while(1) { printf("\n---------------------------------------"); printf("\nplease input job's name and job's size\n"); puts("input exit to exit");

操作系统实验之内存管理实验报告

学生学号 实验课成绩 武汉理工大学 学生实验报告书 实验课程名称 计算机操作系统 开 课 学 院 计算机科学与技术学院 指导老师姓名 学 生 姓 名 学生专业班级 2016 — 2017 学年第一学期

实验三 内存管理 一、设计目的、功能与要求 1、实验目的 掌握内存管理的相关内容,对内存的分配和回收有深入的理解。 2、实现功能 模拟实现内存管理机制 3、具体要求 任选一种计算机高级语言编程实现 选择一种内存管理方案:动态分区式、请求页式、段式、段页式等 能够输入给定的内存大小,进程的个数,每个进程所需内存空间的大小等 能够选择分配、回收操作 内购显示进程在内存的储存地址、大小等 显示每次完成内存分配或回收后内存空间的使用情况 二、问题描述 所谓分区,是把内存分为一些大小相等或不等的分区,除操作系统占用一个分区外,其余分区用来存放进程的程序和数据。本次实验中才用动态分区法,也就是在作业的处理过程中划分内存的区域,根据需要确定大小。 动态分区的分配算法:首先从可用表/自由链中找到一个足以容纳该作业的可用空白区,如果这个空白区比需求大,则将它分为两个部分,一部分成为已分配区,剩下部分仍为空白区。最后修改可用表或自由链,并回送一个所分配区的序号或该分区的起始地址。 最先适应法:按分区的起始地址的递增次序,从头查找,找到符合要求的第一个分区。

最佳适应法:按照分区大小的递增次序,查找,找到符合要求的第一个分区。 最坏适应法:按分区大小的递减次序,从头查找,找到符合要求的第一个分区。 三、数据结构及功能设计 1、数据结构 定义空闲分区结构体,用来保存内存中空闲分区的情况。其中size属性表示空闲分区的大小,start_addr表示空闲分区首地址,next指针指向下一个空闲分区。 //空闲分区 typedef struct Free_Block { int size; int start_addr; struct Free_Block *next; } Free_Block; Free_Block *free_block; 定义已分配的内存空间的结构体,用来保存已经被进程占用了内存空间的情况。其中pid作为该被分配分区的编号,用于在释放该内存空间时便于查找。size表示分区的大小,start_addr表示分区的起始地址,process_name存放进程名称,next指针指向下一个分区。 //已分配分区的结构体 typedef struct Allocate_Block { int pid; int size; int start_addr; char process_name[PROCESS_NAME_LEN]; struct Allocate_Block *next; } Allocate_Block; 2、模块说明 2.1 初始化模块 对内存空间进行初始化,初始情况内存空间为空,但是要设置内存的最大容量,该内存空间的首地址,以便之后新建进程的过程中使用。当空闲分区初始化

可变分区存储管理方式的内存分配回收

实验报告 操作系统 可变分区存储管理方式的内存分配回收 班级:XXXXXXXXXXXX 学号:XXXXXXXXXXXX 姓名:XXXXXX 日期:XXXX.XX.XX

版本历史Revisions History

目录1引言4 1.1实验目的4 1.2参考文档4 2可变分区存储管理5 2.1实验原理分析5 2.2设计思路5 2.3源程序6 2.4重要结构体说明10 2.5重要变量说明10 2.6结果11 2.7测试方法对结果的分析11 2.8接口12 2.8.1接口设计说明12 2.9任务设计12 2.9.1流程图12

1 引言 1.1实验目的 通过首次适应算法、最佳适应算法和最坏适应算法实现主存空间的分配,可以使开发人员更好地理解存储分配算法。 1.2参考文档 1.操作系统 2. 3.1节空闲存储区表 2.操作系统2. 3.2节首次适应法(1.分配算法,2.回收算法)

2 可变分区存储管理 2.1实验原理分析 在可变分区模式下,在系统初启且用户作业尚未装入主存储器之前,整个用户区是 一个大空闲分区,随着作业的装入和撤离,主存空间被分成许多分区,有的分区被 占用,而有的分区时空闲的。为了方便主存空间的分配和去配,用于管理的数据结 构可由两张表组成:“已分配区表”和“未分配区表”。在“未分配表中”将空闲 区按长度递增顺序排列,当装入新作业时,从未分配区表中挑选一个能满足用户进 程要求的最小分区进行分配。这时从已分配表中找出一个空栏目登记新作业的起始 地址和占用长度,同时修改未分配区表中空闲区的长度和起始地址。当作业撤离时 已分配区表中的相应状态变为“空”,而将收回的分区登记到未分配区表中,若有 相邻空闲区再将其连接后登记。 2.2设计思路 1、分配算法: 采用首次适应法为作来分配大小为size的内存空间时,总是从表的起始端的低地址 部分开始查找,当第一次找到大于或等于申请大小的空闲区时,就按所需大小分配 给作业。如果分配后原空闲区还有剩余空间,就修改原存储区表项的m_size和 m_addr,使它记录余下的“零头”。如果作业所需空间正好等于该空闲区大小,那 么该空闲区表项的m_size就成为0,接下来要删除表中这个“空洞”,即将随后的 各非零表项依次上移一个位置。 2、回收算法: 当某一作业回收以前所分配到的内存时,就要将该内存区归还给系统,使其成为空 闲区而可被其它作来使用。回收时如释放区与邻近的空闲区相衔接,要将它们合并 成较大的空闲区,否则空闲区将被分割得超来越小,最终导致不能利用;另外,空 闲区个数越来越多,也会使空闲区登记表溢出。

计算机操作系统内存分配实验报告记录

计算机操作系统内存分配实验报告记录

————————————————————————————————作者:————————————————————————————————日期:

一、实验目的 熟悉主存的分配与回收。理解在不同的存储管理方式下,如何实现主存空间的分配与回收。掌握动态分区分配方式中的数据结构和分配算法及动态分区存储管理方式及其实现过程。 二、实验内容和要求 主存的分配和回收的实现是与主存储器的管理方式有关的。所谓分配,就是解决多道作业或多进程如何共享主存空间的问题。所谓回收,就是当作业运行完成时将作业或进程所占的主存空间归还给系统。 可变分区管理是指在处理作业过程中建立分区,使分区大小正好适合作业的需求,并且分区个数是可以调整的。当要装入一个作业时,根据作业需要的主存量查看是否有足够的空闲空间,若有,则按需要量分割一个分区分配给该作业;若无,则作业不能装入,作业等待。随着作业的装入、完成,主存空间被分成许多大大小小的分区,有的分区被作业占用,而有的分区是空闲的。 实验要求使用可变分区存储管理方式,分区分配中所用的数据结构采用空闲分区表和空闲分区链来进行,分区分配中所用的算法采用首次适应算法、最佳适应算法、最差适应算法三种算法来实现主存的分配与回收。同时,要求设计一个实用友好的用户界面,并显示分配与回收的过程。同时要求设计一个实用友好的用户界面,并显示分配与回收的过程。 三、实验主要仪器设备和材料 实验环境 硬件环境:PC或兼容机 软件环境:VC++ 6.0 四、实验原理及设计分析 某系统采用可变分区存储管理,在系统运行当然开始,假设初始状态下,可用的内存空间为640KB,存储器区被分为操作系统分区(40KB)和可给用户的空间区(600KB)。 (作业1 申请130KB、作业2 申请60KB、作业3 申请100KB 、作业2 释放 60KB 、作业4 申请 200KB、作业3释放100KB、作业1 释放130KB 、作业5申请140KB 、作业6申请60KB 、作业7申请50KB) 当作业1进入内存后,分给作业1(130KB),随着作业1、2、3的进入,分别分配60KB、100KB,经过一段时间的运行后,作业2运行完毕,释放所占内存。此时,作业4进入系统,要求分配200KB内存。作业3、1运行完毕,释放所占内存。此时又有作业5申请140KB,作业6申请60KB,作业7申请50KB。为它们进行主存分配和回收。 1、采用可变分区存储管理,使用空闲分区链实现主存分配和回收。 空闲分区链:使用链指针把所有的空闲分区链成一条链,为了实现对空闲分区的分配和链接,在每个分区的起始部分设置状态位、分区的大小和链接各个分区的前向指针,由状态位指示该分区是否分配出去了;同时,在分区尾部还设置有一后向指针,用来链接后面的分区;分区中间部分是用来存放作业的空闲内存空间,当该分区分配出去后,状态位就由“0”置为“1”。 设置一个内存空闲分区链,内存空间分区通过空闲分区链来管理,在进行内存分配时,系统优先使用空闲低端的空间。 设计一个空闲分区说明链,设计一个某时刻主存空间占用情况表,作为主存当前使用基础。初始化空间区和已分配区说明链的值,设计作业申请队列以及作业完成后释放顺序,实现主存的分配和回收。要求每次分配和回收后显示出空闲内存分区链的情况。把空闲区说明

动态分区存储管理的模拟实现

计算机科学与工程学院学生实验报告 专业计算机科学与技术班级 学号姓名 课程名称操作系统课程类型专业必修课 实验名称动态分区存储管理的模拟实现 实验目的: 1.熟悉动态分区存储管理方式下,主存空间的分配和回收算法。 2.提高C语言编程能力。 实验内容: 假设主存当前状态如右表所示: 系统采用最佳适应分配算法为作业分配主存空间, 而且具有紧凑技术。请编程完成以下操作: (1). 输出此时的已分配区表和未分配区表; (2). 装入 Job3(15K),输出主存分配后的已分配 区表和未分配区表; (3). 回收 Job2所占用的主存空间,输出主存回收 后的已分配区表和未分配区表; (4).装入 Job4(130K),输出主存分配后的已分配 区表和未分配区表。 实验要求 1.数据结构参考定义如下,也可根据需要进行改进: (1)已分配区表: #define n 10 /*假定系统允许的最大作业数量为n,n值为10*/ struct {int number; /*序号*/ int address; /*已分配分区起始地址,单位为KB */ int length; /*已分配分区长度,单位KB*/ float flag; /*已分配区表登记栏标志,0:空表项,否则为作业名;*/

}used_table[n]; /*已分配区表*/ (2)未分配区表: #define m 10 /*假定系统允许的空闲区表最大为m,m值为10*/ struct {int number; /*序号*/ int address; /*空闲区起始地址,单位为KB */ int length; /*空闲区长度,单位为KB*/ int flag; /*空闲区表登记栏标志,0:空表项;1:空闲区*/ }free_table[m]; /*空闲区表*/ 2.以allocate命名主存分配所用的过程或函数(算法参考课件),要将各种情况考虑周全。 3.以reclaim命名主存回收所用的过程或函数(算法参考课件),要将各种情况考虑周全。 4.画出算法实现的N-S流程图。 5.程序调试、运行成功后,请老师检查。 实验步骤: 1.分配内存,结果如下图:

动态可变分区存储管理模拟系统解析

青岛农业大学 理学与信息科学学院 操作系统课程设计报告 设计题目仿真实现动态可变分区存储管理模拟系统 —最佳适应算法和最先适应算法 学生专业班级计算机科学与技术2011级03班 学生姓名(学号)张明珠(H20110684 ) 设计小组其他同学姓名(学号)刘玉婷(H20110661) 宋璇(H20110162) 指导教师牟春莲 完成时间 2014. 06.15 实习(设计)地点信息楼218 2014年6月16日

一、课程设计目的 操作系统的理论知识只有通过操作系统的实际操作和编程才能真正地理解 和掌握,没有实践操作系统的操作和编程,学习操作系统就是纸上谈兵。操作系统课程设计是在学习完《操作系统》课程后进行的一次全面、综合实习,是计算机科学与技术专业的重要实践性教学环节。通过课程设计,达到如下目的: 1、巩固和加深对操作系统原理的理解,提高综合运用本课程所学知识的能力。 2、培养学生选用参考书,查阅手册及文献资料的能力;培养独立思考、深 入研究、分析问题、解决问题的能力。 3、通过实际操作系统的分析设计、编程调试,掌握系统软件的分析方法和 工程设计方法。 4、能够按要求编写课程设计报告书,能正确阐述设计过程和实验结果、正 确绘制系统和程序框图。 5、通过课程设计,培养学生严谨的科学态度、严肃认真的工作作风和团队 协作精神。 二、设计任务 题目描述: 仿真实现动态可变分区存储管理模拟系统。内存调度策略可采用最先适应算法、最佳适应法等,并对各种算法进行性能比较。为了实现分区分配,系统中必须配置相应的数据结构,用来描述空闲区和已分配区的情况,为分配提供依据。常用的数据结构有两种形式:空闲分区表和空闲分区链。为把一个新作业装入内存,须按照一定的算法,从空闲分区表或空闲分区链中选出一个分区分配给该作业.设计要求: 1.采用指定算法模拟动态分区管理方式的主存分配。能够处理以下的情形: ⑴随机出现的进程i申请jKB内存,程序能判断是否能分配,如果能分配,要求输出分配的首地址Faddress,并要求输出内存使用情况和空闲情况。 内存情况输出的格式为:Faddress该分区的首地址;Eaddress该分区的尾地址Len 分区长度;Process 如果使用,使用的进程号,否则为0。 ⑵主存分配函数实现寻找空闲区、空闲区表的修改、已分配区表的修改功能。成员分工: 张明珠申请内存、查看进程之间的前后的区域状态、释放进程

可变分区存储管理方式的内存分配和回收

free_quantity++; fscanf(文件指针,格式字符串,输入表列); } return 1; } return 0; } void sort() { int i,j,p; for(i=0;i

动态分区存储管理系统分解

操作系统原理 课程设计报告 题目:动态分区分配存储管理系统 所在学院:计算机科学与技术学院 班级: 11级计算机科学与技术(非师) 学号: 20111202052 姓名:吴创连 指导教师:黄侠剑 2014年3月18

目录 1 引言 (1) 2 需求分析 (1) 3 概要设计 (1) 4 详细设计 (1) 4.1问题描述和分析 (1) 4.2程序流程图 (2) 4.3数据结构体分析 (3) 4.4主要程序代码分析 (4) 5 调试与操作说明 (11) 5.1初始界面 (11) 5.2模拟内存分配 (12) 5.3回收内存界面 (12) 5.4最佳适应算法的实现 (13) 5.5最坏适应算法的实现 (13) 6总结与体会 (13)

1 引言 操作系统是最重要的系统软件,同时也是最活跃的学科之一。我们通过操作系统可以理解计算机系统的资源如何组织,操作系统如何有效地管理这些系统资源,用户如何通过操作系统与计算机系统打交道。 存储器是计算机系统的重要组成部分,近年来,存储器容量虽然一直在不断扩大,但仍不能满足现代软件发展的需要,因此,存储器仍然是一种宝贵而又紧俏的资源。如何对它加以有效的管理,不仅直接影响到存储器的利用率,而且还对系统性能有重大影响。而动态分区分配属于连续分配的一种方式,它至今仍在内存分配方式中占有一席之地。 2 需求分析 动态分区分配是根据进程的实际需要,动态地为之分配内存空间。在实现动态分区分配时,将涉及到分区分配中所用的数据结构、分区分配算法和分区的分配和回收操作这样三个问题。常用的数据结构有动态分区表和动态分区链。在对数据结构有一定掌握程度的情况下设计合理的数据结构来描述存储空间,实现分区存储管理的内存分配功能,应该选择最合适的适应算法(最佳适应算法,最坏适应算法),在动态分区存储管理方式中主要实现内存分配和内存回收算法,在这些存储管理中间必然会有碎片的产生,当碎片产生时,进行碎片的拼接等相关的内容。 3 概要设计 本程序采用机构化模块化的设计方法,共分为两大模块。 1.最佳适应算法实现 它从全部空闲区中找出能满足作业要求的、且大小最小的空闲分区,这种方法能使碎片尽量小。为适应此算法,空闲分区表(空闲区链)中的空闲分区要按从小到大进行排序,自表头开始查找到第一个满足要求的自由分区分配。 2.最坏算法实现 最坏适应分配算法要扫描整个空闲分区或链表,总是挑选一个最大的空闲分区分割给作业使用。该算法要求将所有的空闲分区按其容量从大到小的顺序形成一空闲分区链,查找时只要看第一个分区能否满足作业要求。 4 详细设计 4.1 问题描述和分析 系统应利用某种分配算法,从空闲分区链表中找到所需大小的分区,如果空闲分区大小

相关文档
最新文档