操作系统综合实验——位示图法管理文件存储空间的分配与回收实验组成员组长:葛加文成员:周颜安 翟秋明 崔建奎一、实验目的 磁盘初始化时把磁盘存储空间分成许多块(扇区),这些空间可以被多个用户共享用户作业在执行期间常常要在磁盘上建立文件或把已经建立在磁盘上的文件删去,这就涉及到磁盘存储空间的分配和回收一个文件存放到磁盘上,可以组织成顺序文件(连续文件)、链接文件(串联文件)、索引文件等,因此,磁盘存储空间的分配有两种方式,一种是分配连续的存储空间,另一种是可以分配不连续的存储空间怎样有效地管理磁盘存储空间是操作系统应解决的一个重要问题,通过本实验使学生掌握磁盘存储空间的分配和回收算法二、实验内容位示图法管理文件存储空间的分配与回收(1) 为了提高磁盘存储空间的利用率,可在磁盘上组织成链接文件、索引文件,这类文件可以把逻辑记录存放在不连续的存储空间为了表示哪些磁盘空间已被占用,哪些磁盘空间是空闲的,可用位示图来指出位示图由若干字节构成,每一位与磁盘上的一块对应,“1”状态表示相应块已占用,“0”状态表示该块为空闲位示图的形式与实习四中的位示图一样,但要注意,对于主存储空间和磁盘存储空间应该用不同的位示图来管理,绝不可混用。
2) 申请一块磁盘空间时,由分配程序查位示图,找出一个为“0”的位,计算出这一位对应块的磁盘物理地址,且把该位置成占用状态“1”为了程序编写方便,假设现在有一个盘组共8个柱面,每个柱面有两个磁道,每个磁道分成4个物理记录那么,当在位示图中找到某一字节的某一位为“0”时,这个空闲块对应的磁盘物理地址为:柱面号=字节号位数4磁道号=[ ]位数4物理记录号={ }(3) 归还一块磁盘空间时,由回收程序根据归还的磁盘物理地址计算出归还块在位示图中的对应位,把该位置成“0”按照(2)中假设的盘组,归还块在位示图中的位置计算如下:字节号=柱面号位数=磁道号´4+物理记录号(4) 设计申请一块磁盘空间和归还一块磁盘空间的程序要求能显示或打印程序运行前和运行后的位示图;分配时把分配到的磁盘空间的物理地址显示或打印出来,归还时把归还块对应于位示图的字节号和位数显示或打印出来如下表所示:柱面号磁道号物理记录号001002010013100112表1-1三、实验步骤1、任务分析: (1)给出位示图初态 (2)程序人口参数: 分配时:参数为文件名及需要分配的块数, 回收时:参数为文件名。
(3)回答信息: 分配时:能够分配时,给出文件名和分配的具体块号,否则,给出无法分配的信息显示位示图 回收时:给出回收的具体块号显示位示图2、设计概要: void ReadMe() 程序说明及注释 void Initbitmap() 位图初始化 void main() void allocate() 分配,自动 void reclaim() 回收,指定回收 void displaymap() 显示位示图 程序流程图如下所示:Readme()Inithitmap()meuncin>>choicechoice=1void allocate()输出入口参数、文件名和块数choice=2void reclaim()输出入口参数、文件名choice=3void displaymap()choice=0结束cout<<"错误选择!";YYYYNNNN开始 3、 详细设计a) 程序设计思路本程序的设计题目是采用位示图法来模拟管理存储空间的分配与回收。
而位示图采用一个二维数组来描述为了程序的编写方便,编者将存储空间分为8个柱面,每个柱面2个磁道,每个磁道上有4个物理记录号这样就形成了一个8*8的二维矩阵(这些参数都可在程序随时改动,为了修改简便,编者特地使用了宏定义来初始化这些参数)在程序中既是bitmap[8][8]的二维数组数组中的每一个元素只有俩个可选的真值,0或10表示该位所代表的物理记录号未被分配,是空闲的,而1表示此物理记录号已被分配,占用基于以上分析,就可以确定程序的设计思路详细流程见程序流程图)分配时,用户给出分配函数的参数,即要分配的文件名和要分配的物理块数,首先检查位示图中有没有满足剩余的物理块数足够与之分配,若有便在fbc表中建立一个fbc表项,建立相应的信息,如文件名、物理块数以及相应物理块数的参数信息,在位示图中找到相应的位置,连续的为之分配需要的物理块数;若没有足够的物理块数,则给出“空间不足,分配失败”的错误信息回收时,根据用户给出的文件名,在fbc表中查找是否有此文件名,若有则在fbc表中删除此表项;若没有查到,则给出“未找到相应的文件名,无法回收”的错误信息b) 程序架构设计设计时,初步为程序设计了如下几个函数:void delay();/*延时效果*/void ReadMe();/*本程序的一些说明信息*/int bitmapisok();/*计算程序中的可分配物理块数*/void Initbitmap();/*初始化位示图*/void allocate(char name[10],int n);/*分配*/void reclaim(char name[10]);/*回收*/ void displaymap();/*显示位示图*/各函数间的调用层次关系见概要设计。
在设计后期,编者根据需要又添加了一些内容并改进了部分内容,以达到更加完美的效果比如延时功能函数delay()和输出字体的颜色调整等本程序编者花费比较多的时间主要在于分配函数和回收函数的实现上不过没有遇到什么大问题,只有一些瑕疵,影响不大综上,程序架构如下: ReadMe(); Initbitmap(); while(1) { cout<<"\n请输入选择:"; cout<<"1--分配,2--回收,3--显示位示图,0--退出\n"; cin>>choice; switch(choice) { case 1: { cout<<"请输入文件名和需要分配的物理块数:"; cin>>name>>n; allocate(name,n); break; } case 2: { cout<<"给出要回收的文件名:"; cin>>name; reclaim(name); break; } case 3: displaymap(); break; case 0: exit(0); default: cout<<"错误选择!"; break; } }说明:程序使用switch—case语句实现多菜单选择。
这也是常用的菜单实现方法因为本程序总得来说还是比较简单的,所以供选择的功能不是很多,也没有二级菜单选择每一个case语句项对应一项主要功能,十分简单c) 核心函数设计本程序的核心函数只有三个,分别是分配函数void allocate(char name[10],int n);和回收函数void reclaim(char name[10]);以及void displaymap();而函数的设计思路在前面已经描述下面给出各函数的核心代码void allocate(char name[10],int n)//分配{ int i,j; int count=0;/*计数器*/ if(bitmapisok()
不过,事先调用了一个bitmapisok()函数,用于判断位示图中是否还有剩余的未分配物理块,如果没有足够的物理块则给出错误提示,反之则与之分配在分配过程中将会计算出对应分配的物理块的一些信息,以便于在显示位示图中显示void reclaim(char name[10])//回收{ int i,j,flag=0; for(i=0;i<=tablep;i++) { if(!strcmp(fbctable[i].name,name)) { for(j=0;j
\n"; } } if(flag==0) cout<<"\n未找到文件名为"<