文件系统存储空间管理模拟实验报告

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

课程名称计算机操作系统实验名称文件系统存储空间管理模拟姓名学号专业班级实验日期成绩指导老师一、实验目的根据提出的文件分配和释放请求,动态显示磁盘空闲空间的态以及文件目录的变化,以位示图和索引分配为例:每次执行请求后要求显示或打印位示图的修改位置、分配和回收磁盘的物理块地址、更新的位示图、目录。二、实验原理用数组表示位示图,其中的每一位对应磁盘一个物理块的状态,0表示、空闲,1表示分配;当请求分配一个磁盘块时,寻找到数组中为0的位,计算相对磁盘块号,并计算其在磁盘中的物理地址(柱面号、磁道号、物理块号),并将其状态由0变到1。当释放某一物理块时,已知其在磁盘中的物理地址,计算其相对磁盘块号,再找到位示图数组中的相应位,将其状态由1变为0。三、主要仪器设备PC机(含有VC)四、实验内容与步骤实验内容:1.模拟文件空间分配、释放过程,可选择连续分配、链式分配、索引分配方法;2.文件空闲空间管理,可采用空白块链、空白目录、位示图方法;步骤如下:1.输入磁盘基本信息参数,计算位示图大小,并随机初始化位示图;(1)磁盘基本信息:磁盘柱面数m,每柱面磁道数p,每磁道物理块数q;(2)假设采用整数数组存放位示图,则数组大小为:Size=ceil((柱面数*每柱面磁道数*每磁道物理块数)/(sizeof(int)*8))(3)申请大小为size的整数数组map,并对其进行随机初始化。例如:假设m=2,p=4,q=8,共有64个磁盘块,若sizeof(int)=2,则位示图大小为4,map[4]如下:1514131211109876543210map[0]0011010011001010map[1]1010110000110000map[2]011001110011001map[3]1000100001100110位示图中每一位对应的相对磁盘块号如下图,磁盘块号由小到大对应于数组的低地址到高地址位上。即map[0]的第0位到第15位分别对应0号磁盘块到15号磁盘块的状态,map[1]的第0位到第15位对应16号磁盘块到31号磁盘块的状态,以此类推。1514131211109876543210map[0]1514131211109876543210map[1]31302928272625242322212019181716map[2]47464544434241403938373635343332map[3]63626160595857565554535251504948如上表所示,29号磁盘的状态存在map[1]中,对应于第13位;2.输出初始位示图信息;3.输入文件分配或释放请求,(1)格式:“+文件名申请块数”或“-文件名”“+”表示申请文件分配,“-”表示删除文件如:+F154.根据请求完成相应操作。(1)若为分配申请x个盘块,则在位示图中找到x个为0的位,将其修改为“1”,计算相应具体物理设备的柱面号C、磁道号H和物理块号R,并将CHR地址或相对磁盘块号记录在文件目录中。输出位示图修改位置、分配的磁盘块CHR地址、修改后的目录和位示图信息。否则,空间不够,退出执行下一条请求;计算公式如下:a.已知位示图中的下标i,j,计算相对块号Block=i*sizeof(int)*8+jb.已知相对块号计算柱面、磁道、物理块号如下:柱面号C=相对块号/(每柱面磁道数*每磁道物理块数)磁道号H=相对块号%(每柱面磁道数*每磁道物理块数)/每磁道物理块数物理块号R=相对块号%每磁道物理块数文件目录如下(以索引表分配为例):文件名首个物理块CHR地址块个数索引表beta(0,0,0)2(0,0,0)(0,0,1)Alpha(2,3,0)3(2,3,0)Toyota43(4912)…(Sony文件名首个物理块地址(相对)块个数索引表beta02(0,2,3)…Alpha33(3,6,7)…Toyota83(8,9,12)…(2)若为删除申请,则从目录中找到要删除的文件所在的目录项,读取索引表,依次读取文件相应的盘块CHR地址,计算该盘块的相对磁盘块号,再计算其相应信息在位示图中的位置(i,j),将位示图中的相应位有“1”改为“0”,并从目录中删除该目录项。输出删除的磁盘块CHR地址、相应位示图修改位置、修改过的位示图和目录。计算过程如下:相对磁盘块号=柱面号*每柱面磁道数*每磁道物理块数+磁道号*每磁道物理块数+物理块号i=相对磁盘块号/(sizeof(int)*8)j=相对磁盘块号%(sizeof(int)*8)五、实验流程图图一文件空闲区分配算法图二文件空闲区回收算法六、实验代码#includestdio.h#includestdlib.h#includeconio.h#includestring.hintphysic[100];//文件地址缓冲区intstyle=1;//文件的类型charcur_dir[10]=root;//当前目录structcommand{charcom[10];}cmd[13];structblock{intn;//空闲的盘快的个数intfree[50];//存放空闲盘快的地址inta;//模拟盘快是否被占用}memory[20449];structblock_super{intn;//空闲的盘快的个数intfree[50];//存放进入栈中的空闲块intstack[50];//存放下一组空闲盘快的地址}super_block;structnode//i结点信息{intfile_style;//i结点文件类型intfile_length;//i结点文件长度intfile_address[100];//i结点文件的物理地址}i_node[640];structdir//目录项信息{charfile_name[10];//文件名inti_num;//文件的结点号chardir_name[10];//文件所在的目录}root[640];voidformat()//格式化{inti,j,k;super_block.n=50;for(i=0;i50;i++)//超级块初始化{super_block.free[i]=i;//存放进入栈中的空闲块super_block.stack[i]=50+i;//存放下一组的盘块}for(i=0;i640;i++)//i结点信息初始化{for(j=0;j100;j++){i_node[i].file_address[j]=-1;//文件地址}i_node[i].file_length=-1;//文件长度i_node[i].file_style=-1;//文件类型}for(i=0;i640;i++)//根目录区信息初始化{strcpy(root[i].file_name,);root[i].i_num=-1;strcpy(root[i].dir_name,);}for(i=0;i20449;i++)//存储空间初始化{memory[i].n=0;//必须有这个memory[i].a=0;for(j=0;j50;j++){memory[i].free[j]=-1;}}for(i=0;i20449;i++)//将空闲块的信息用成组链接的方法写进每组的最后一个块中{//存储空间初始化if((i+1)%50==0){k=i+1;for(j=0;j50;j++){if(k20450){memory[i].free[j]=k;//下一组空闲地址memory[i].n++;//下一组空闲个数注意在memory[i].n++之前要给其赋初值k++;}else{memory[i].free[j]=-1;}}memory[i].a=0;//标记为没有使用continue;//处理完用于存储下一组盘块信息的特殊盘块后,跳过本次循环}for(j=0;j50;j++){memory[i].free[j]=-1;}memory[i].n=0;}printf(已经初始化完毕\n);printf(进入UNIX文件模拟............\n\n);}voidwrite_file(FILE*fp)//将信息读入系统文件中{inti;fp=fopen(system,wb);for(i=0;i20449;i++){fwrite(&memory[i],sizeof(structblock),1,fp);}fwrite(&super_block,sizeof(structblock_super),1,fp);for(i=0;i640;i++){write(&i_node[i],sizeof(structnode),1,fp);}for(i=0;i640;i++){fwrite(&root[i],sizeof(structdir),1,fp);}fclose(fp);}voidread_file(FILE*fp)//读出系统文件的信息{inti;fp=fopen(system,rb);for(i=0;i20449;i++){fread(&memory[i],sizeof(structblock),1,fp);}fread(&super_block,sizeof(structblock_super),1,fp);for(i=0;i640;i++){fread(&i_node[i],sizeof(structnode),1,fp);}for(i=0;i640;i++){fread(&root[i],sizeof(structdir),1,fp);}fclose(fp);}voidcallback(intlength)//回收磁盘空间{inti,j,k,m,q=0;for(i=length-1;i=0;i--){k=physic[i];//需要提供要回收的文件的地址m=49-super_block.n;//回收到栈中的哪个位置if(super_block.n==50)//注意当super_block.n==50时m=-1;的值{//super_block.n==50的时候栈满了,要将这个栈中的所有地址信息写进下一个地址中for(j=0;j50;j++){memory[k].free[j]=super_block.free[j];}super_block.n=0;memory[k].n=50;}memory[k].a=0;if(m==-1){m=49;//将下一个文件地址中的盘块号回收到栈底中,这个地址中存放着刚才满栈的地址的信息}super_block.free[m]=physic[i];//将下一个文件地址中的盘块号回收到栈中super_block.n++;}}voidallot(intlength)//分配空间{inti,j,k,m,p;for(i=0;ilength;i++){k=50-super_block.n;//超级块中表示空闲块的指针m=super_block.free[k];//栈中的相应盘块的地址p=super_block.free[49];//栈中的最后一个盘块指向的地址if(m==-1||memory[p].a==1)//检测是否还有下一组盘块{printf(内存不足,不能够分配空间\n);callback(length);break;}if(super_block.n==1){memory[m].a=1;//将最后一个盘块分配掉physic[i]=m;super_block.n=0;for(j=0;jmemory[m].n;j++)//从最后一个盘块中取出下一组盘块号写入栈中{super_block.free[j]=memory[m].free[j];super_block.n++;}continue;//要跳过这次循环,下面的语句在IF中已经执行过}physic[i]=m;//栈中的相应盘块的地址写进文件地址缓冲区memory[m].a=1;super_block.n--;}}voidcreate_file(charfilename[],intlengt

1 / 17
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功