磁盘空间管理模拟实验之Linux磁盘空间管理

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

目录

摘要 (2)

前言 (3)

正文 (4)

1. 实验目的 (4)

2. 设计思想 (4)

3. 实验结构图 (5)

4. 各模块的伪码算法 (5)

5. 测试分析 (10)

6. 测试结果 (11)

7. 源程序 (14)

总结 (24)

参考文献 (25)

致谢 (26)

摘要

要把文件信息存放在存储介质上,必须先找出存储介质上可供使用的空闲块。存储介质上某个文件不再需要时,又要收回它所占的存储空间作为空闲块。用户作业在执行期间经常要求建立一个新文件或撤消一个不再需要的文件,因此,文件系统必须要为它们分配存储空间或收回它所占的存储空间。如何实现存储空间的分配和收回,取决于对空闲块的管理方法,主要有两种对磁盘存储空间的分配和收回的方法:位示图法(用一张位示图(简称位图)来指示磁盘存储空间的使用情况),空闲块链接法(在UNIX操作系统中,把磁盘存储空间的空闲块成组链接)。

关键词:磁盘的分配和回收管理;位示图;成组链接。

前言

通过该题目的设计过程,掌握磁盘存储管理的原理、软件开发方法并提高解决实际问题的能力。学习使用位示图管理磁盘空间的分配与回收,了解程序运行前和回收磁盘的物理地址过程。学会用模拟UNIX系统的成组链接法实现磁盘空间的管理。了解UNIX的命令及使用格式,熟悉UNIX/LINUX的常用基本命令,练习并掌握UNIX提供的vi编辑器来编译C程序,学会利用gcc、gdb编译、调试C程序。希望通过本次设计过程可以提高自己的分析问题的能力和实际动手的能力,将学到的知识用于实践中。

正文

1. 实验目的

磁盘格式化时,系统把磁盘存储空间分成许多磁道。每个磁道又分成若干个扇区(又叫做块)。这些空间就是用来存放用户文件的。当用户的文件不再需要时,就应该删除。把一个文件存放到磁盘上时,可以组织成连续文件,链接文件,索引文件等。因此,磁盘空间的分配方法也有两种,一种是连续空间的分配;一种是不连续空间的分配(又叫动态分配)。如何充分有效的利用磁盘空间,是操作系统应解决的重要课题之一。通过本实验,使学生对磁盘空间的分配与回收有一个较深入的理解。

2. 设计思想

位示图法:

一个简单的管理方法是用一张位示图(简称位图)来指示磁盘存储空间的使用情况。一个盘组的分块确定后,根据分配的总块数决定位图由多少个字组成,位图中的每一位与盘组分块一一对应。位示图是一张可以反映磁盘空间是否被占有的模拟图,用一个二维数组表示磁盘的空间,数组内每一个元素表示磁盘内相应的分块,数组元素为“1”表示该块已被占,“0”表示该块为空。数组元素位置与磁盘分块一一对应,即可描述出磁盘空间的利用情况。

成组链接法:

首先定义磁盘分配数组并初始化,9个一维数组分别表示9个空闲块,程序运行时,先将专用块A〔0〕复制到内存中,然后进行功能选择,分配时,查MA,从中找出空闲块号,当一组的空闲块只剩第一块时,应把该块中指出的下一组的空闲块数和块号复制到专用块这,然后把该块分配给申请者,当一组的空

闲块分配完后则把专用块内容(下一组链接情况)复制到内存,再为申请者分配。回收时,输入待回收的块号,查找该块是否已被分配,若未分配,退出,否则,当前组不满规定块数时,将归还块登记入该组,若当前组已满,则另建一新组,这时归还块作为新一组的第一块,应把内存中登记的一组链接情况MA复制到归还块中,然后在MA这重新登记一个新组。显示分组情况。系统初始化时先将专用块内容读入内存,当有申请空闲块要求时,就直接在内存专用块中找到哪些块是空闲的,每分配一块后把空闲块数减1。但要把一组中第一块分配出去之前,可以先把登记在该块中的下一组的块号保存在专用块中(此时,原专用块中的信息巳经无用了,因它指示的一组空闲块都已分配掉)。当中文组空闲块分配完后,则将下一组内容读入内存专用块中,以便继续分配时查找。

3. 实验结构图

4. 各模块的伪码算法1)对位示图法

申请磁盘块

查看位示图找位号等

是否找到

是:由字位号计算相对块号和柱面号,磁道号,物理记录号,并输出这些相应参数否:返回,磁盘已满,本次无法分配

置位示图相应位为1 返回

定义分配函数:

void assign()

{

unsigned int n=0,i,s=1,j,k,q,m,sq,zhm,cid;

for(i=0 ,k=0;i<5;i++)

{q=size[i] ;

j=0;

while(1)

{

j++ ;

if((q%2)==0)

{ if(j==1) size[i]+=1;

else

{for(m=1;m

s*=2 ;

size[i]+=s;}

k=1;

break ;/*完成后退出*/

}

q=q/2;

}

if(k==1) /*将找到的位示图位转换成物理地址*/

{ if((j-1)/8==1)

{zhm=2*i+1;

cid=(j-9)/4;

sq=(j-9)%4;}

else

{zhm=2*i;

cid=(j-1)/4;

sq=(j-1)%4;

}

n=1;

break;/*退出for循环*/

}

}

if(n==0)

printf("没有空间可分配!\n");

else

{printf("分配成功!\n");/*输出物理地址*/

printf("柱面号为: %d\n",zhm);

printf("磁道号为: %d\n",cid);

printf("扇区号为: %d\n",sq);

}

printf("分配后的位示图为:\n");

out();

}

定义回收函数:

void callback()/*回收函数*/

{ unsigned int i,j,s=1,q,m,sq,zhm,cid;

printf("确定要回收块的柱面号、磁道号、扇区号:\n");

printf("请输入柱面号:");

scanf("%d",&zhm);

printf("\n请输入磁道号:");

scanf("%d",&cid);

printf("\n请输入扇区号:");

scanf("%d",&sq);

相关文档
最新文档