1、合肥学院计算机科学与技术系课程设计报告200112012 学年第 1 学期课程名称 操作系统原理课程设计名称模拟实现用位示图法管理文件存储空间的分配与回收专 业 班 级学 生 姓 名学 生 学 号指 导 教 师 20011 年 11 月实验题目 模拟用位示图法管理文件存储空间的分配与回收一、实验目的:1) 理解文件存储空间的分配与回收的基本概念,掌握产生文件存储空间的分配与回收的几种方法,体会位示图算法是管理文件存储空间的分配与回收的一种行之有效的方法。2) 通过编写程序实现位示图算法,进一步理解位示图算法的原理和执行过程,掌握位示图算法的描述和应用,进一步熟练掌握文件存储空间的分配与回收的方
2、法。二、实验内容:(1)首先对位示图算法原理进行深刻的理解和掌握;(2)程序首先要给出位示图初态。分配时,参数为文件名及需要分配的块数。回收时,参数为文件名。(3)回答信息:分配时,能够分配时,给出文件名和分配的具体块号。否则,给出无法分配的信息。显示位示图。(4)回收时:给出回收的具体块号。显示位示图。三、实验环境Windows 系统,在的环境下来运行这儿程序四、实验主要步骤1、初始化及使用数据结构对数组 WST元素初始化为 0。定义以下 3 个链表并初始化。空闲区结构体定义free_link、申请空间作业结构体定义 office、相关位示图操作的结构体定义 work。位示图算法是利用二进制
3、的一位来表示磁盘中的一个盘块的使用情况。在外存上建立一张位示图(bitmap) ,记录文件存储器的使用情况。每一位仅对应文件存储器上的一个物理块,取值 0 和 1 分别表示空闲和占用。文件存储器上的物理块依次编号为:0、1、2、。定义为一维数组 WST,操作起来更为方便。下表号与盘块号对应。在输出的时候控制输出为二维形式。0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 150 1 1 0 0 0 1 1 1 0 0 1 0 1 1 1 01 0 0 0 1 1 1 1 1 1 0 0 0 0 1 1 12 1 1 1 0 0 0 1 1 1 1 1 1 0 0 0 031
4、5位示图2、申请空间算法首先要输入文件名和大小,查找与已存在的文件是否重名。没有,则比较空闲区中空闲块数是否大于欲分配的块数。有的话分配。分配的时候该作业要记录下自己所占盘块的其实盘号和所占用的盘快数。并修改对应盘块的位示图的值。m=r-start_location;/空闲区的起始地址s-begin_location=r-start_location;/作业从空闲区的起始地址开始分配r-start_location=r-start_location+s-office_number;/改变空闲区空闲块数的起始地址r-free_number=r-free_number-s-office_numbe
5、r;/改变空间区块数的大小n=(r-start_location-1);/新的空间区的起始地址-1for(i=m;ibegin_location-1=0/*空闲区结构体定义start_location 空闲区对象变量的开始位置free_number 空闲区块数目next 指向下一个空闲区的指针*/typedef struct nodeint start_location;int free_number;struct node*next;free_link;/*申请空间作业结构体定义office 作业名begin_location 作业申请空间后的开始位置office_number 作业申请空间
6、区的数目next 指向下一个申请空闲区的作业指针*/typedef struct linkchar office20;int begin_location;int office_number;struct link *next;office;/*相关位示图操作的结构体定义p 空间区链表指针q 作业链表指针*/typedef struct free_link *p;office *q;work;/*程序菜单*/void menu()printf(“ 文件的存取和回收n“);printf(“ 1-分配文件n“);printf(“ 2-回收文件n“);printf(“ 3-退出nt“);printf
7、(“ 请输入选项: “);/*置空位示图进行初始化*/void zero_wst()int i;for(i=0;iq;q=q-next;if(q!=NULL)printf(“已有文件:n“);while(q!=NULL)printf(“t%s:%d-%dn“,q-office,q-begin_location,q-begin_location+q-office_number-1);q=q-next;/*位示图操作的初始化包括:空闲区链表的初始化作业链表的初始化*/work *start()free_link *p;office *q;work *w;w=(work *)malloc(sizeo
8、f(work);p=(free_link*)malloc(sizeof(free_link);p-start_location=0;p-free_number=256;p-next=NULL;q=(office *)malloc(sizeof(office);q-next=NULL;w-p=p;w-q=q;return w;/*申请空间操作*/work *request(work *w,int WST256)int i,m,n,flag=0;free_link *p,*r,*e;/r-free_number 用于查找空闲区的块数office *q,*s,*t,*u;/s 创建新节点 ,存储新建
9、文件的信息 ,n 用于查找是否有重复节点p=w-p;r=p;q=w-q;t=q;u=q-next;printf(“请输入文件名和块数:“);s=(office*)malloc(sizeof(office);s-next=NULL;while(t-next!=NULL)t=t-next;scanf(“%s%d“,while(u!=NULL)if(strcmp(s-office,u-office)=0)flag=1;printf(“对不起,该文件已存在!n“);free(s);break;u=u-next;if(flag=0)while(r!=NULL)if(r-free_number)=(s-o
10、ffice_number)/用于查找空闲区中空闲块数是否大于欲分配的块数break;r=r-next;if(r=NULL)printf(“对不起,没有足够的空间分配失败!n“);free(s);elset-next=s;m=r-start_location;/空闲区的起始地址s-begin_location=r-start_location;/作业从空闲区的起始地址开始分配r-start_location=r-start_location+s-office_number;/改变空闲区空闲块数的起始地址r-free_number=r-free_number-s-office_number;/改变
11、空间区块数的大小n=(r-start_location-1);/新的空间区的起始地址-1for(i=m;ifree_number=0)if(p=r)/p=r 说明内存中只有一个整块的空闲区free(r);p=NULL;elsee=p;while(e!=NULL)if(e-next=r)break;e=e-next;e-next=r-next;free(r);w-p=p;w-q=q;return w;/*回收空间操作*/work *delect(work *w,int WET)char name20;int i;free_link *p,*r,*t;office *q,*s,*e;p=w-p;r
12、=p;t=p;q=w-q;s=q;e=q;s=s-next;if(s=NULL)printf(“没有可以回收的文件!n“);else printf(“请输入文件名:“);cinname;while(s!=NULL)if(strcmp(s-office,name)=0)break;s=s-next;if(s=NULL)coutbegin_location-1=0r=r-next;r-free_number=r-free_number+s-office_number;if(WSTs-begin_location-1=1r=r-next;r-start_location=r-start_locati
13、on-s-office_number;r-free_number=r-free_number+s-office_number;if(WSTs-begin_location-1=0break;r=r-next;r-free_number=r-free_number+s-office_number+t-free_number;free(t);if(WSTs-begin_location-1=1t-next=NULL;t-start_location=s-begin_location;t-free_number=s-office_number;if(r=NULL)p=t;if(r!=NULLelse
14、t-next=r;p=t;if(r!=NULLr=r-next;t-next=r-next;r-next=t;for(i=s-begin_location;ibegin_location+s-office_number);i+)WSTi=0;while(e!=NULL)if(e-next=s)break;e=e-next;e-next=s-next;free(s);w-p=p;w-q=q;return w;/*主函数*/void main()int flag;work *w;zero_wst();w=start();while(1)system(“cls“);print_wst(WST);print_office(w);menu();cinflag;switch(flag)case 1:w=request(w,WST);break;case 2:w=delect(w,WST);break;case 3:exit(0);default:printf(“输入错误,请重新输入!n“);break;