安徽师范大学
学院实验报告
专业名称 软件工程
实 验 室 2#201
实验课程 操作系统实验
实验名称 内存储器空间的管理
姓 名
学 号
同组人员
实验日期 2013/6/7
第二篇:操作系统 磁盘空间管理的实验报告
实验五 磁盘存储空间的管理
一、实验目的
磁盘格式化时,系统把磁盘存储空间分成许多磁道。每个磁道又分成若干个扇区(又叫做磁盘块)。之后用fdisk命令对硬盘进行分区,即使只有一个分区,也必须用fdisk命令进行分区。分区的目的,就是制作文件卷,形成文件系统。一个文件卷一般都被划分成引导扇区、文件系统管理区和文件数据区。其中,文件数据区用来存放系统文件和用户文件。用户可以通过文件系统提供的API,创建、打开、关闭和对文件进行读写。当用户的文件不再需要时,就应该删除。把一个文件放到磁盘上时,可以组织成连续文件、链接文件或索引文件等。因此,磁盘空间的分配方法也有两种,一种是连续空间的分配,一种是不连续空间的分配(又叫动态分配)。如何充分有效地利用磁盘空间,是操作系统应解决的重要课题之一。
本实验模拟实现磁盘空间的分配与回收,使学生对磁盘空间的管理有一个较深入的理解。
二、实验要求
书写实验报告,应该包括以下几项内容:
(1)实验题目;
(2)程序中使用的数据结构及主要符号说明;
(3)程序流程图和带有详细注释的源程序;
(4)执行程序名,并打印程序运行时的初值和运行结果;
(5)通过实验后的收获与体验及对实验的改进意见和见解
三、实验内容
(1)假定现有一个磁盘组,共有40个柱面。每个柱面4个磁道,每个磁道又划分成4个物理记录。磁盘的空间使用情况用位示图表示。位示图用若干个字构成,每一位对应一个磁盘道。“1”表示占用,“0”表示空闲。为了简单,假定字长为16位,一个字可用来模拟磁盘的一个柱面,其位示图如图5—1所示。系统设置一个变量S记录当前的空闲磁盘块个数。位示图的初始状态由户自己设定。
图5-1 位示图
(2)申请一个磁盘块时,由磁盘块分配程序查位示图,找出一个为0的位,并计算磁盘的物理地址(即求出它的柱面号、磁道号和扇区号)。
①由位示图计算磁盘的相对块号的公式如下:
相对块号=字号*16+位号
②再将相对块号转换成磁盘的物理地址:
柱面号=(相对块号/16)的商,也即柱面号=字号
磁道号=((相对块号/16的余数)/4)的商,也即(位号/4)的商
物理块号=(((相对块号/16)的余数)/4)的余数,也即(位号/4)的余数
(3)当释放一个相对物理块时,运行回收程序,计算该块在位示图中的位置,再把相应由“1”改为“0”。计算公式如下:
先由磁盘的三维地址柱面号、磁道号和扇区号计算相对块号:
相对块号=柱面号*16+磁道号*4+物理块号
再计算字号和位号:
字号=相对块号/16的商,也即字号=柱面号
位号=磁道号*(物理块数/每磁道)+物理块号
(4)分配算法和回收算法流程分别如图5—2和5—3所示。
图5-2 磁盘空间分配的流程
图5-3 磁盘空间回收的流程
四、源程序
#include <stdio.h>
#include <process.h>
void Initbitmap(int map[8][8])
{
int cylinder,track,sector;
char choice='Y';
printf("初始化位视图...\n");
while(choice=='y'||choice=='Y')
{
printf("柱面号:");
scanf("%d",&cylinder);
printf("磁道号:");
scanf("%d",&track);
printf("物理记录号:");
scanf("%d",§or);
map[cylinder][4*track+sector]=1;
printf("contiune?");
getchar();
scanf("%c",&choice);
}
}
void allocate(int map[8][8])
{
int i,j;
int flag=0;
int cylinder,track,sector;
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
if(map[i][j]==0) {map[i][j]=1;flag=1;break;}
if(flag==1) break;
}
if(flag==1)
{
cylinder=i;
track=j/4;
sector=j%4;
printf("分配到的柱面号、磁道号、物理记录数");
printf("%d\t%d\t%d",cylinder,track,sector);
printf("\n");
}
else printf("空间不足,分配失败!");
}
void reclaim(int map[8][8])
{
int cylinder,track,sector;
printf("柱面号:");
scanf("%d",&cylinder);
printf("磁道号:");
scanf("%d",&track);
printf("物理记录号:");
scanf("%d",§or);
if(map[cylinder][4*track+sector]==0)
{
printf("此块为未分配块!回收出错!");
getchar();
}
else
{
map[cylinder][4*track+sector]=0;
printf("回收块对应的字节号:%4d\t位数:%4d\n",cylinder,4*track+sector);
}
}
void main()
{
int bitmap[8][8];
int i,j;
int choice;
for(i=0;i<8;i++)
for(j=0;j<8;j++)
bitmap[i][j]=0;
Initbitmap(bitmap);
while(1)
{
printf("\n请输入选择:");
printf("1--分配,2---回收,3--显示位示图,0--退出\n");
scanf("%d",&choice);
switch(choice)
{
case 1:allocate(bitmap);break;
case 2:reclaim(bitmap);break;
case 3:for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
printf("%8d",bitmap[i][j]);
printf("\n");
}
break;
case 0:exit(0);
default:printf("错误选择!");
break;
}
}
}五、结果图
由结果图可以看出函数可实现磁盘空间的分配与回收。
六、实验心得
这个实验模拟实现磁盘空间的分配与回收,使我对磁盘空间的管理有一个较深入的理解,使我学会了磁盘空间的分配与回收。