武汉理工大学
学生实验报告书
实验课程名称 计算机操作系统
开 课 学 院 计算机科学与技术学院
指导老师姓名
学 生 姓 名
学生专业班级
— 学年 第 一 学期
实验项目名称: 磁盘调度
实验五 磁盘存储空间的管理
一、实验目的
磁盘格式化时,系统把磁盘存储空间分成许多磁道。每个磁道又分成若干个扇区(又叫做磁盘块)。之后用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;
}
}
}五、结果图
由结果图可以看出函数可实现磁盘空间的分配与回收。
六、实验心得
这个实验模拟实现磁盘空间的分配与回收,使我对磁盘空间的管理有一个较深入的理解,使我学会了磁盘空间的分配与回收。
学生实验报告书实验课程名称开课学院指导教师姓名学生姓名学生专业班级200200学年第学期实验教学管理基本规范实验是培养学生动手能力…
武汉理工大学学生实验报告书实验课程名称XXXX开课学院计算机科学与技术学院指导老师姓名学生姓名学生专业班级20xx20xx学年第一…
学生实验报告书实验课程名称开课学院指导教师姓名学生姓名学生专业班级200200学年第学期实验报告填写规范1实验是培养学生动手能力分…
武汉理工大学学生实验报告书实验课程名称操作系统开课学院计算机科学与技术学院指导老师姓名学生姓名学生专业班级201201学年第学期实…
操作系统实验报告课程名称计算机操作系统实验项目名称磁盘调度实验时间班级姓名学号实验目的对操作系统的磁盘调度基础理论和重要算法的理解…
磁盘调度算法磁盘调度一实验目的磁盘是高速大容量旋转型可直接存取的存储设备它作为计算机系统的辅助存储器担负着繁重的输入输出工作在现代…
1操作系统课程设计磁盘调度算法操作系统实验报告磁盘调度实验六磁盘调度算法一实验目的复习模拟实现一种磁盘调度算法进一步加深对磁盘调度…
武汉理工大学学生实验报告书实验课程名称计算机操作系统开课学院计算机科学与技术学院指导老师姓名蔡菁学生姓名常云鹏学生专业班级计算机1…
课程设计报告题目磁盘调度算法设计课程名称操作系统课程设计院部名称信息技术学院专业11计算机科学与技术班级11计算计科学与技术(2)…