实验三 文件系统空闲空间管理模拟
一、实验内容及要求
要求打印或显示程序运行前和运行后的位示图,以及分配和回收磁盘的物理地址过程; 二、基本原理
用数组表示位示图,其中的每一位对应磁盘一个物理块的状态,0表示空闲,1表示分配;当请求分配一个磁盘块时,寻找到数组中为0的位,计算相对磁盘块号,并计算其在磁盘中的物理地址(柱面号、磁道号、物理块号),并将其状态由0变到1。
当释放某一物理块时,已知其在磁盘中的物理地址,计算其相对磁盘块号,再找到位示图数组中的相应位,将其状态由1变为0。 三、实验相关公式: 计算公式如下:
(1) 已知位示图中的下标i , j, 计算相对块号 Block= I * sizeof( int )+j
(2)已知相对块号计算柱面、磁道、物理块号如下: 柱面号 C= 相对块号/(每柱面磁道数*每磁道物理块数)
磁道号 H= 相对块号%(每柱面磁道数*每磁道物理块数)/ 每磁道物理块数 物理块号 R= 相对块号%每磁道物理块数
4. 提出申请磁盘块或释放磁盘块的要求,根据要求完成操作。
若申请盘块,则在位示图中找到为0的位,计算相对磁盘块号,再计算相应具体物理设备的柱面号C、磁道号H和物理块号R,计算方法如步骤3;输出分配的CHR地址,并将位示图相应位由0变为1,输出位示图;
若释放盘块,则从已分配磁盘块表中随机选择一个盘块释放,此时,已知CHR地址,计算该盘块的相对磁盘块号,再计算其相应信息在位示图中的位置( i,j)。计算过程如下:
相对磁盘块号 = 柱面号*每柱面磁道数*每磁道物理块数+
磁道号*每磁道物理块数+ 物理块号
i = 相对磁盘块号/ sizeof(int) j = 相对磁盘块号% sizeof(int)
四、实验程序清单: #include
#include
struct bitmapinfo {
int bitmapstore[COUNT]; //内存映射状态 char filename[COUNT][32]; int need; };
bitmapinfo info;
int fenpei()//计算位示图的大小 {
int total;
printf(\请输入柱面个数:\\n\scanf(\
printf(\请输入柱面磁道个数:\\n\scanf(\
printf(\请输入每个磁道扇区个数:\\n\scanf(\
total = zhumianhao*cidaohao*shanquhao; if(0 ==total%(sizeof(int)*8)) { } else { }
size = total/(sizeof(int)*8)+1;
printf(\数组的大小为:%d\\n\return size;
size = total/(sizeof(int)*8);
printf(\数组的大小为:%d\\n\return size;
srand((unsigned)time(NULL));
}
int showbitmap(int n)//显示位示图信息
{ // }
int i;
int count = 0; for(i=0;i //显示随机数字 for(i=0;i printf(\printf(\ } for(i=0;i int j; int t; int m = 0x00000001; for(j = 0;j < 32;j++) { printf(\if( t== 0) count+=1; if((j+1)%8 == 0) printf(\ } printf(\ } printf(\ printf(\空闲块有:%d\\n\return count; void disklocal(int number,int n) { //由用户输入需要的物理块数: int i; int j; int y;//计数 int neednum; printf(\输入需要分配的块数:\\n\ scanf(\ info.need = neednum; printf(\输入文件名:\\n\ scanf(\ if( number { printf(\没有足够的空闲磁盘,分配失败!\\n\ } else { for(i=0;i { int t; int m = 0x00000001; for(j = 0;j < 32;j++) { if(neednum == 0) { } break; t = ((bitmap[i]>>j)&m); if(t == 0) { bitmap[i] = (bitmap[i]|(m< info.bitmapstore[y] = 1; strcpy(info.filename[y] , filename); printf(\ printf(\分配块物理地址为:第%d个柱面,\\t第%d个磁道,\\t第%d个扇区\\n\ for(j = 0;j < 32;j++) { printf(\if((j+1)%8 == 0) } } neednum--; } printf(\分配成功\\n\ for(i=0;i int t; int m = 0x00000001; printf(\ } printf(\ } } system(\ } void diskreturn(int n) { char filereturn[32]; int i; int j; int y; int m = 0x00000001; printf(\输入要回收的文件名\\n\ scanf(\ for( i =0;i { for( j=0;j<32;j++) { if(info.need == 0) { } break; y = i*32+j; if(!strcmp(info.filename[y],filereturn)) { bitmap[i] = (bitmap[i]^(m< printf(\回收块物理地址为:第%d个柱面,\\t第%d个磁道,\\t第%d个扇区\\n\ } info.need--; } } for(i=0;i { int t; int m = 0x00000001; for(j = 0;j < 32;j++) { } printf(\if((j+1)%8 == 0) printf(\ printf(\ } system(\