模拟UNIX系统成组链接法 实现磁盘存储空间的管理_第1页
模拟UNIX系统成组链接法 实现磁盘存储空间的管理_第2页
模拟UNIX系统成组链接法 实现磁盘存储空间的管理_第3页
模拟UNIX系统成组链接法 实现磁盘存储空间的管理_第4页
模拟UNIX系统成组链接法 实现磁盘存储空间的管理_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、要求:模拟UNIX系统的空闲块成组链接法,实现磁盘存储空间的管理。提示:(1) 假定磁盘存储空间已被划分成长度为n的等长块,共有M块可供使用。UNIX系统中采用空闲块成组链接的方法 来管理磁盘存储空间,将磁盘中的每N个空闲块(N<M)分成一组,最后一组可以不足N块,每组的第一块中登记了下一组空闲块的块数和块号,第一组的块数和块号登记在专用块中,登记的格式如下:0空闲块数k1空闲块号12空闲块号2MMMMK空闲块号kMMMM当第一项内容为“0”时,则第二项起指出的空闲块是最后一组。(2) 现模拟UNIX系统的空闲块成组链接,假定共有8块可供使用,每3块为一组,则空闲块成组链接的初始状态为:

2、开始时,空闲块号是顺序排列的,但经若干次的分配和归还操作后,空闲块的链接就未必按序排列了。用二维数组A:array 0M-1 of array 0n-1来模拟管理磁盘空间,用Ai表示第I块,第0块A0作为专用块。  (3) 成组链接的分组情况记录在磁盘物理块中,为了查找链接情况,必须把它们读入主存,故当磁盘初始化后,系统先将专用块内容复制到主存中。定义一个数组MA存放专用块内容,即MA: =A0。申请一块磁盘空间时,查MA,从中找出空闲块号,当一组的空闲块只剩第一块时,则应把该块中指出的下一组的空闲块数和块号复制到专用块中,然后把该块分配给申请者。当一组的空闲块分配完后则把

3、专用块内容(下一组链接情况)复制到主存,再为申请者分配。分配算法如下图。  采用成组链接的分配算法(4) 归还一块时给出归还的块号,若当前组不满规定块数时,将归还块登记入该组;若当前组已满,则另建一新组,这时归还块作为新一组的第一块,应把主存中登记的一组链接情况MA复制到归还块中,然后在MA重新登记一个新组。归还一块的算法如下图。  采用成组链接的回收算法(5) 设计分配和归还磁盘空间的程序,能显示或打印分配的磁盘空间的块号,在完成一次分配或归还后能显示或打印各空闲块组的情况(各组的空闲块数和块号)。本实习省去了块号与物理地址之间的转换工作,而在实际的系统中必须进行块号与物

4、理地址的转换工作。(6) 运行你所设计的程序,假定空闲块链接的初始状态如提示(2),现先分配4块,再依次归还第2块和第6块。把执行后分配到的块号依次显示或打印出来,且显示或打印空闲块组的情况。  实验报告设计者日期测试者日期功能描述模拟UNIX系统的空闲块成组链接法,实现磁盘存储空间的管理。算法描述或流程图1. 基本思想:  首先定义磁盘分配数组并初始化,9个一维数组分别表示9个空闲块,程序运行时,先将专用块A0复制到内存中,然后进行功能选择,分配时,查MA,从中找出空闲块号,当一组的空闲块只剩第一块时,应把该块中指出的下一组的空闲块数和块号复制到专用块这,然后把

5、该块分配给申请者,当一组的空闲块分配完后则把专用块内容(下一组链接情况)复制到内存,再为申请者分配。  回收时,输入待回收的块号,查找该块是否已被分配,若未分配,退出,否则,当前组不满规定块数时,将归还块登记入该组,若当前组已满,则另建一新组,这时归还块作为新一组的第一块,应把内存中登记的一组链接情况MA复制到归还块中,然后在MA这重新登记一个新组。显示分组情况。   2. 程序流程:    建立磁盘分配并初始化          调用功能选择函数进行分配

6、或回收操作。3. 数据结构及各子程序(1)int MA4;     /*空闲块数组*/(2)int A94=3,1,2,3,3,4,5,6,0,0,0,0,0,0,0,0,3,0,7,8,             0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;  /*磁盘空间*/(3)int mark9;       /*存放已分配的块*/int N

7、o=0;              /*已分配的块数*/(4)void display( ):显示分组情况    形参:无    返回参数:无;(5)void assign( ):分配空闲块    形参:无    返回参数:无;(6)void callback( ):回收空闲块    形参:无  &

8、#160; 返回参数:无;(7)void menu( ):功能选择函数    形参:无    返回参数:无; 附:源程序#include<stdio.h>int MA4;     /*空闲块数组*/int A94=3,1,2,3,3,4,5,6,0,0,0,0,0,0,0,0,3,0,7,8,             0,0,0,0,0,0,0,0,0,0

9、,0,0,0,0,0,0;  /*磁盘空间*/int mark9;       /*存放已分配的块*/int No=0;              /*已分配的块数*/void display1()   int i,j,temp,count;    No=0;    if(MA1!=0)  

10、0;       i=MA0;           printf("ngroup1:");           for(j=1;j<=i;j+)                 printf("

11、%d   ",MAj);                   mark+No=MAj;                            

12、;              temp=MA1;           count=2;           while(Atemp1!=0)                

13、; printf("ngroup%d:",count);                  i=Atemp0;                  for(j=1;j<=i;j+)       &

14、#160;                printf("%d   ",Atempj);                         mark+No=Atempj;  

15、;                                         count+;            

16、0;     temp=Atemp1;                         printf("ngroup%d:",count);           i=Atemp0;     

17、      for(j=2;j<=i+1;j+)              if(Atempj>0)                    printf("%d   ",Atempj);  

18、0;                  mark+No=Atempj;                                else  &#

19、160;       i=MA0;           if(i=1)              printf("nThe blocks are all assigned");           else  

20、                  printf("ngroup1:");           for(j=2;j<=i;j+)                  

21、      printf("%d   ",MAj);                         mark+No=MAj;              

22、60;                                   void display()  /*显示分组情况*/   int i,j;    if(MA0!=0)      

23、 display1();    else          i=MA1;           for(j=0;j<=3;j+)              MAj=Aij;        

24、;    display1();               void assign()      /*分配空闲块*/   int s,i;    if(MA0>1)       /*若该组不止一个空闲块*/       &

25、#160;  i=MA0;           s=MAi;           MA0-;           printf("nnumber of the block:%d",s);        

26、;        else if(MA0=1)      /*只剩一个空闲块*/          if(MA1!=0)           /*还有其它空闲块组*/            

27、     s=MA1;                  for(i=0;i<=3;i+)                     A0i=Asi;    

28、;              MA0-;                  printf("nnumber of the block:%d",s);            

29、;                else                    /*没有其它空闲块组*/              

30、60;  printf("nThere isn't any space");                  return;                        

31、0;   else                    /*当前组已分配完*/          for(i=0;i<=3;i+)              MAi=A0i

32、;           assign();              display();         /*显示分组情况*/ void callback()         /*回收空闲块*/   int

33、i,j,temp;    printf("ninput the No. of the block you want to callback:");    scanf("%d",&j);    getchar();             /*得到待回收的空闲块号*/    for(temp=1;temp<

34、=No;temp+)          if(marktemp=j)              break;           if(temp<No+1)        /*若该空闲块已在,退出*/  

35、        printf("nThe block is in the disk");    return;              if(MA0<3)         /*当前组不满3块*/         

36、 i=MA0;           MAi+1=j;           MA0+;           else              /*已有3块*/  

37、;        for(i=0;i<=3;i+)              Aji=MAi;           MA0=1;           MA1=j;                 display();      /*显示*/ void menu()               

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论