1 / 15
文档名称:

实习3+磁盘存储空间的分配和回收.doc

格式:doc   大小:62KB   页数:15页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

实习3+磁盘存储空间的分配和回收.doc

上传人:wxc6688 2019/11/11 文件大小:62 KB

下载得到文件列表

实习3+磁盘存储空间的分配和回收.doc

相关文档

文档介绍

文档介绍:实****3磁盘存储空间的分配和回收实****三磁盘存储空间的分配和回收一、实****题目连续磁盘存储空间的分配和回收。二、实****目的磁盘初始化时把磁盘存储空间分成许多块(扇区),这些空间可以被多个用户共享。用户作业在执行期间常常要在磁盘上建立文件或把已经建立在磁盘上的文件删去,这就涉及到磁盘存储空间的分配和回收。一个文件存放到磁盘上,可以组织成顺序文件(连续文件)、链接文件(串联文件)、索引文件等,因此,磁盘存储空间的分配有两种方式,一种是分配连续的存储空间,另一种是可以分配不连续的存储空间。怎样有效地管理磁盘存储空间是操作系统应解决的一个重要问题,通过本实****使学生掌握磁盘存储空间的分配和回收算法。三、实****内容模拟磁盘空闲空间的表示方法,以及模拟实现磁盘空间的分配和回收。四、(1)要在磁盘上建立顺序文件时,必须把按序排列的逻辑记录依次存放在磁盘的连续存储空间中。可假定磁盘初始化时,已把磁盘存储空间划分成若干等长的块(扇区),按柱面号和盘面号的顺序给每一块确定一个编号。随着文件的建立、删除、磁盘存储空间被分成许多区(每一区包含若干块),有的区存放着文件,而有的区是空闲的。当要建立顺序文件时必须找到一个合适的空闲区来存放文件记录,当一个文件被删除时,则该文件占用的区应成为空闲区。为此可用一张空闲区表来记录磁盘存储空间中尚未占用的部分,格式如下:序号起始空闲块号空闲块个数状态156未分配2143未分配32130未分配4空表目1(2)建立文件时,先查找空闲区表,从状态为“未分配”的表项中找出一个块数能满足要求的区,由起始空闲块号能依次推得可使用的其它块号。若不需要占用该区的所有块时,则剩余的块仍应为未分配的空闲块,这时要修改起始空闲块号和空闲块数。若占用了该区的所有块,则相应登记栏中的状态修改成“空表目”。删除一个文件时,需要考虑空闲块的合并情况。磁盘存储空间的分配和回收算法类似于主存储器的可变分区方式的分配和回收。(3)当找到空闲块后,必须启动磁盘把信息存放到指定的块中,启动磁盘必须给出由三个参数组成的物理地址:盘面号、柱面号和物理记录号(即扇区号)。故必须把找到的空闲块号换算成磁盘的物理地址。为了减少移臂次数,磁盘上的信息按柱面上各磁道顺序存放。现假定一个盘组共有200个柱面,(编号0-199)每个柱面有20个磁道(编号0-19,同一柱面上的各磁道分布在各盘面上,故磁道号即盘面号。),每个磁道被分成等长的6个物理记录(编号0-5,每个盘面被分成若干个扇区,故每个磁道上的物理记录号即为对应的扇区号)。那么,空闲块号与磁盘物理地址的对应关系如下:则物理记录号=空闲块号%6磁道号=(空闲块号/6)%20柱面号=(空闲块号/6)/20(4)删除一个文件时,从文件目录表中可得到该文件在磁盘上的起始地址和逻辑记录个数,假定每个逻辑记录占磁盘上的一块,则可推算出归还后的起始空闲块号和块数,登记到空闲区表中。换算关系如下:起始空闲块号=(柱面号,20+磁道号),6+物理记录号空闲块数=逻辑记录数(5)请设计磁盘存储空间的分配和回收程序,要求把分配到的空闲块转换成磁盘物理地址,把归还的磁盘空间转换成空闲块号。{2intFBbegin;//起始空闲块号intnum;//空闲块数charstate;//状态structfreeblock*next;}structfiletowrite{charname[10];//文件名intsize;//文件大小intaddr_cylinder;//装入磁盘的首地址_柱面号intaddr_track;//装入磁盘的首地址_磁道号intaddr_note;//装入磁盘的首地址_物理记录号structfiletowrite*next;}()//分配磁盘空间{intflag=0;structfreeblock*p=FBhead;structfiletowrite*File;File=(structfiletowrite*)malloc(sizeof(structfiletowrite));printf("输入要装入的文件名:");scanf("%s",File->name);printf("输入所需的磁盘空间大小:");scanf("%d",&File->size);for(p=FBhead->next;p!=NULL;p=p->next)if((File->size)<=(p->num))//分配空间{flag=1;File->addr_cylinder=((p->FBbegin)/6)/20;3File->addr_track=((p->FBbegin)/6)%20;File->addr_note=(p->FBbegin