武汉理工大学操作系统磁盘调度实验报告

武汉理工大学

实验课程名称       计算机操作系统       

开 课 学 院     计算机科学与技术学院   

指导老师姓名                            

学 生 姓 名                             

学生专业班级                            

—    学年  第  一  学期

实验项目名称:  磁盘调度        

 

第二篇:操作系统 磁盘空间管理的实验报告

实验五  磁盘存储空间的管理

一、实验目的

磁盘格式化时,系统把磁盘存储空间分成许多磁道。每个磁道又分成若干个扇区(又叫做磁盘块)。之后用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",&sector);

              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",&sector);  

       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;

              }  

       }  

}五、结果图

由结果图可以看出函数可实现磁盘空间的分配与回收。

六、实验心得

这个实验模拟实现磁盘空间的分配与回收,使我对磁盘空间的管理有一个较深入的理解,使我学会了磁盘空间的分配与回收。

相关推荐