ImageVerifierCode 换一换
格式:DOCX , 页数:24 ,大小:437.83KB ,
资源ID:20983055      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/20983055.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(磁盘存储空间的分配和回收.docx)为本站会员(b****1)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

磁盘存储空间的分配和回收.docx

1、磁盘存储空间的分配和回收实习六 磁盘存储空间的分配和回收一、 实习内容模拟磁盘空闲空间的表示方法,以及模拟实现磁盘空间的分配和回收。二、 实习目的磁盘初始化时把磁盘存储空间分成许多块 (扇区),这些空间可以被多个用户共享。用户作业在执行期间常常要在磁盘上建立文件或把已经建立在磁盘上的文件删去, 这就涉及到磁盘存储空间的分配和回收。一个文件存放到磁盘上,可以组织成顺序文件(连续文件)、 链接文件(串联文件)、索引文件等,因此,磁盘存储空间的分配有两种方式,一种是分配 连续的存储空间,另一种是可以分配不连续的存储空间。 怎样有效地管理磁盘存储空间是操作系统应解决的一个重要问题,通过本实习使学生掌握

2、磁盘存储空间的分配和回收算法。三、 实习题目本实习模拟三种磁盘存储空间的管理方法。第一题:连续的磁盘存储空间的分配和回收。提示:(1)要在磁盘上建立顺序文件时, 必须把按序排列的逻辑记录依次存放在磁盘的连续存 储空间中。可假定磁盘初始化时,已把磁盘存储空间划分成若干等长的块(扇区),按柱面 号和盘面号的顺序给每一块确定一个编号。 随着文件的建立、删除、磁盘存储空间被分成许多区(每一区包含若干块),有的区存放着文件,而有的区是空闲的。当要建立顺序文件时 必须找到一个合适的空闲区来存放文件记录, 当一个文件被删除时, 则该文件占用的区应成为空闲区。为此可用一张空闲区表来记录磁盘存储空间中尚未占用的

3、部分,格式如下:序号起始空闲 块号空闲块个 数状态156未 分配2143未 分配32130未 分配4空 表目F1F1(2) 要建立文件时,先查找空闲区表,从状态为“未分配”的登记栏目中找出一个块数能满足要求的区,由起始空闲块号能依次推得可使用的其它块号。 若不需要占用该区的所有块时,则剩余的块仍应为未分配的空闲块, 这时要修改起始空闲块号和空闲块数。 若占用了该区的所有块,则相应登记栏中的状态修改成“空表目”。删除一个文件时,从空闲区表中 找一个状态为“空表目”的登记栏目,把归还的起始块号和块数填入对应的位置。磁盘存储空间的分配和回收算法类似于主存储器的可变分区方式的分配和回收。 同学们可参考

4、实习四的第一题。(3) 当找到空闲块后,必须启动磁盘把信息存放到指定的块中,启动磁盘必须给出由三个参数组成的物理地址: 柱面号、磁道号和物理记录号。 故必须把找到的空闲块号换算成磁盘的物理地址。为了减少移臂次数,磁盘上的信息按柱面上各磁道顺序存放。 现假定一个盘组共有 200个柱面,(编号 0-199)每个柱面有20个磁道(编号0-19 ,同一柱面上的各磁道分布在各 盘面上,故磁道号即盘面号。),每个磁道被分成等长的 6个物理记录(编号 0-5,每个盘面被分成若干个扇区,故每个磁道上的物理记录号即为对应的扇区号。)。那么,空闲块号 与磁盘物理地址的对应关系如下:m= 空闲块号 6假设M= I-

5、空闲块号6则物理记录号 =m 磁道号= M 20柱面号=M 20(4)删除一个文件时, 从文件目录表中可得到该文件在磁盘上的起始地址和逻辑记录个 数,假定每个逻辑记录占磁盘上的一块, 则可推算出归还后的起始空闲块号和块数, 登记到 空闲区表中。换算关系如下:起始空闲块号=(柱面号 20+磁道号)6+物理记录号 空闲块数=逻辑记录数(5)请设计磁盘存储空间的分配和回收程序, 要求把分配到的空闲块转换成磁盘物理地址,把归还的磁盘空间转换成空闲块号。假定空闲区表的初值如提示(1)中指出,现有一文件要占用 10块,运行你所设计的分 配程序,显示或打印分配后的空闲区表以及分配到的磁盘空间的起始物理地址。

6、 然后,有一文件被删除,它占用的磁盘空间为: 1号柱面2号磁道,0号物理记录开始的 4块,运行你 所设计的回收程序,显示或打印回收后的空闲区表。第二题:用位示图管理磁盘存储空间提示:(1)为了提高磁盘存储空间的利用率,可在磁盘上组织成链接文件、索引文件,这类文件可以把逻辑记录存放在不连续的存储空间。 为了表示哪些磁盘空间已被占用, 哪些磁盘空间是空闲的,可用位示图来指出。位示图由若干字节构成, 每一位与磁盘上的一块对应, “1状态表示相应块已占用,“ 0”状态表示该块为空闲。位示图的形式与实习四中的位示图一样,但要注意,对于主存储空间和磁盘存储空间应该用不同的位示图来管理,绝不可混用。(2)申

7、请一块磁盘空间时,由分配程序查位示图,找出一个为“ 0”的位,计算出这一位对应块的磁盘物理地址, 且把该位置成占用状态 “ 1”。假设现在有一个盘组共 80个柱面, 每个柱面有两个磁道, 每个磁道分成4个物理记录。那么,当在位示图中找到某一字节的某 一位为“ 0”时,这个空闲块对应的磁盘物理地址为:柱面号=字节号磁道号=位数 4物理记录号=位数4(3)归还一块磁盘空间时,由回收程序根据归还的磁盘物理地址计算出归还块在位示图 中的对应位,把该位置成“ 0”。按照(2)中假设的盘组,归还块在位示图中的位置计算如 下:字节号=柱面号位数=磁道号4+物理记录号(4)设计申请一块磁盘空间和归还一块磁盘空

8、间的程序。 要求能显示或打印程序运行前和运行后的位示图;分配时把分配到的磁盘空间的物理地址显示或打印出来, 归还时把归还块对应于位示图的字节号和位数显示或打印出来。(5)假定已有如表6-1的磁盘空间被占用了, 现在要申请五块磁盘空间, 运行分配程序,按(4)中要求显示或打印运行的结果。 然后再归还如表 6-2的空间,运行回收程序,按(4)中的要求显示或打印运行结果。表6-1柱面 号磁道 号物理记录号00 1002010013100112表6-2柱面 号磁道 号物理记录号002010101第三题:模拟 UNlX系统的空闲块成组链接法,实现磁盘存储空间的管理。提示:(1)假定磁盘存储空间已被划分成

9、长度为 n的等长块,共有M块可供使用。UNlX系统中采用空闲块成组链接的方法 来管理磁盘存储空间,将磁盘中的每 N个空闲块(NM)分成一组,最后一组可以不足 N块,每组的第一块中登记了下一组空闲块的块数和块号,第一组的块数和块号登记在专用块中,登记的格式如下:当第一项内容为“ 0”时,则第二项起指出的空闲块是最后一组。(2)现模拟UNlX系统的空闲块成组链接,假定共有 8块可供使用,每3块为一组,则空闲块成组链接的初始状态为:空闲块的链接就未开始时,空闲块号是顺序排列的, 但经若干次的分配和归还操作后,必按序排列了。用二维数组 A : array 0 M-1 Of array 0n-1来模拟管

10、理磁盘空间,用 Ai表示第I块,第O块A0作为专用块。(3)成组链接的分组情况记录在磁盘物理块中,为了查找链接情况,必须把它们读入主 存,故当磁盘初始化后,系统先将专用块内容复制到主存中。定义一个数组 MA存放专用块内容,即MA: =A0。申请一块磁盘空间时,查 MA ,从中找出空闲块号,当一组的空闲块只剩第一块时,则应把该块中指出的下一组的空闲块数和块号复制到专用块中, 然后把该块分配给申请者。当一组的空闲块分配完后则把专用块内容 (下一组链接情况)复制到主存,再为申请者分配。分配算法如图 6-1。图6-1采用成组链接的分配算法(4)归还一块时给出归还的块号,叵当前组不满规定块数时,将归还块

11、登记入该组;若 当前组已满,则另建一新组,这时归还块作为新一组的第一块, 应把主存中登记的一组链接情况MA复制到归还块中,然后在 MA重新登记一个新组。归还一块的算法如图 6-2。图6-2 采用成组链接的回收算法(5)设计分配和归还磁盘空间的程序,能显示或打印分配的磁盘空间的块号,在完成一次分配或归还后能显示或打印各空闲块组的情况 (各组的空闲块数和块号)。本实习省去了块号与物理地址之间的转换工作,而在实际的系统中必须进行块号与物理地址的转换工作。(6)运行你所设计的程序,假定空闲块链接的初始状态如提示( 2),现先分配 4块,再依次归还第2块和第6块。把执行后分配到的块号依次显示或打印出来,

12、 且显示或打印空闲块组的情况。在上次执行的基础上继续分配 3块,然后归还第1块,再申请5块,显示或打印依次分配到的块号及空闲块组情况。四、相关数据结构及说明StrUCt freeblock int FBbegin;起始空闲块号int num;/空闲块数Char state;/状态StrUCt freeblock *n ext; StrUCt filetowrite Char n ame10;/ 文件名int size;/文件大小int addr_cylinder;/装入磁盘的首地址_柱面号 int addr_track;/装入磁盘的首地址 _磁道号 int addr_ note;/装入磁盘的首

13、地址物理记录号 StrUCt filetowrite *n ext; 六、源代码及注释1、题一源代码:#include#includeint getmalloc()/ 分配磁盘空间 int flag=0;struct freeblock *p=FBhead;struct filetowrite *File;File=(struct filetowrite *)malloc(sizeof(struct filetowrite);printf( 输入要装入的文件名: );scanf(%s,File-name);printf( 输入所需的磁盘空间大小: );scanf(%d,&File-size);

14、 for(p=FBhead-next;p!=NULL;p=p-next) if(File-size)num)/ 分配空间flag=1;File-addr_cylinder=(p-FBbegin)/6)/20;File-addr_track=(p-FBbegin)/6)%20;File-addr_note=(p-FBbegin)%6;File-next=Filehead-next;/ 加入文件链表Filehead-next=File;if(File-size)num)/ 修改该快的起始地址和块数p-FBbegin=p-FBbegin+File-size;p-num=p-num-File-size

15、; else p-state=U;break; if(flag=0)printf( 抱歉 ! 目前没有足够的磁盘空间分配给该文件 .n);else printf( 分配磁盘成功 !n 该文件的物理地址: n 柱面号 t 磁道号 t 物理块号 n ); printf( %dt %dt %dn,File-addr_cylinder,File-addr_track,File-addr_note); int deletelfree()/ 回收磁盘空间 char name10; int flag=0;struct filetowrite *p;printf( 输入要删除的文件名: );scanf(%s,

16、&name);for(p=Filehead;p-next!=NULL;p=p-next)if(strcmp(p-next-name,name)=0)/ 找到该文件flag=1;int funion=0,nunion=0;int m=p-next-addr_cylinder;int n=p-next-addr_track;int k=p-next-addr_note;int addr=(m*20+n)*6+k;/ 起始空闲块号int tail=p-next-size+addr;struct freeblock *pnode,*qnode,*tnode,*snode;pnode=FBhead-ne

17、xt;while(pnode!=NULL)/ 先考虑和后面的部分或许有合并的情况if(pnode-FBbegin)=tail)pnode-FBbegin=addr; pnode-num=pnode-num+p-next-size;nunion=1;break; pnode=pnode-next; qnode=FBhead-next;while(qnode!=NULL)/ 再考虑是否和前面的可以合并 if(qnode-FBbegin+qnode-num)=addr)if(nunion=0)qnode-num=qnode-num+p-next-size;funion=1;break; else q

18、node-num=qnode-num+pnode-num; t node=FBhead;while(tnode-next!=pnode) tnode=tnode-next;tnode-next=pnode-next;free(pnode); funion=1;break;qnode=qnode-next; if(funion=0&nunion=0)/ 若没有和前面的或后面的进行合并,则新建一个表目snode=(struct freeblock *)malloc(sizeof(struct freeblock); snode-FBbegin=addr;snode-num=p-next-size;

19、 snode-state=F;if(FBhead-next=NULL)FBhead-next=snode; snode-next=NULL;else snode-next=FBhead-next;FBhead-next=snode; struct filetowrite *q;q=p-next;/ 除该文件 p-next=p-next-next; free(q); break; if(flag=0) printf( 没有该文件 !n);else printf( 文件删除成功 !n); int dispfree()/ 显示磁盘空闲区表int i=1;struct freeblock *p=FBh

20、ead; printf(n 磁盘空闲区表 n);printf( 序号 t 起始空闲块号 t 空闲块个数 t 状态 n); for(p=FBhead-next;p!=NULL;p=p-next)if(p-state)=F)printf( %dt %dtt %dtt 未分配 n,i+,p-FBbegin,p-num); elseprintf( %dttttt 空表目 n,i+); int dispfile()char name10;struct filetowrite *p=Filehead; printf( 输入要查看的文件名: ); scanf(%s,&name);for(p=Filehead

21、-next;p!=NULL;p=p-next) if(strcmp(p-name,name)=0) printf( 该文件的物理地址: n 柱面号 t 磁道号 t 物理块号 n );printf( %dt %dt %dn,p-addr_cylinder,p-addr_track,p-addr_note); break; if(p=NULL)printf( 没有该文件 !n); int main() int n,i,AMAX,BMAX;/AMAX 表示起始空闲块号, BMAX 表示空闲块个数char ch;struct freeblock *pnew;FBhead=(struct freeblo

22、ck *)malloc(sizeof(struct freeblock);FBhead-next=NULL;printf( 输入磁盘空闲区个数: );scanf(%d,&n);for(i=1;inext=NULL;pnew-next=FBhead-next;FBhead-next=pnew;printf( 起始空闲块号: );scanf(%d,&pnew-FBbegin);printf( 空闲块个数: );scanf(%d,&pnew-num); pnew-state=F; pnew=pnew-next; Filehead=(struct filetowrite *)malloc(sizeof

23、(struct filetowrite); Filehead-next=NULL;do system(cls);printf(ttt5. 退出 n); printf( 请选择: );scanf(%c,&ch); switch(ch) case 1:getmalloc();system(pause);break; case 2:deletelfree();system(pause);break; case 3:dispfree();system(pause);break; case 4:dispfile();system(pause);break;case 5:exit(1);break; de

24、fault:printf( 输入错误 ! 请重新输入 .n); printf(n); getchar(); while(ch!=4); return 0;2、题二源代码:#include #include void Initbitmap(int map88) int cylinder,track,sector;char choice=Y; printf( 初始化位视图 .n); while(choice=y|choice=Y) printf( 柱面号 :); scanf(%d,&cylinder); printf( 磁道号 :); scanf(%d,&track); printf( 物理记录号

25、 :); scanf(%d,§or);mapcylinder4*track+sector=1; printf(contiune?);getchar();scanf(%c,&choice); void allocate(int map88) int i,j;int flag=0;int cylinder,track,sector; for(i=0;i8;i+) for(j=0;j8;j+) if(mapij=0)mapij=1;flag=1; break;if(flag=1) break;if(flag=1)cylinder=i; track=j/4; sector=j%4;printf

26、( 分配到的柱面号、磁道号、物理记录数 ); printf(%dt%dt%d,cylinder,track,sector); printf(n); else printf( 空间不足,分配失败 !); void reclaim(int map88) int cylinder,track,sector; printf( 柱面号 :);scanf(%d,&cylinder); printf( 磁道号 :); scanf(%d,&track); printf( 物理记录号 :); scanf(%d,§or); if(mapcylinder4*track+sector=0) printf( 此

27、块为未分配块!回收出错! ); getchar(); else mapcylinder4*track+sector=0;printf( 回收块对应的字节号 :%4dt 位数 :%4dn,cylinder,4*track+sector); void main() int bitmap88; int i,j; int choice;or(i=0;i8;i+) for(j=0;j8;j+)bitmapij=0; Initbitmap(bitmap);while(1) printf(n 请输入选择 :);printf(1- 分配, 2-回收, 3-显示位示图, 0-退出 n); scanf(%d,&c

28、hoice); switch(choice) case 1:allocate(bitmap);break;case 2:reclaim(bitmap);break;case 3:for(i=0;i8;i+) for(j=0;j8;j+) printf(%8d,bitmapij); printf(n); break;case 0:exit(0);default:printf( 错误选择! );break; 3、第三题源程序:#includeint 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,0,0,0,0,0,0; /* 磁盘空间 */int mark9; /* 存放已分配的块 */int No=0; /* 已分配的块数 */void display1() int i,j,temp,count, No=0; if(MA1!=0) i

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1