



下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、.实习六磁盘存储空间的分配和回收一、实习容模拟磁盘空闲空间的表示方法,以及模拟实现磁盘空间的分配和回收。二、实习目的磁盘初始化时把磁盘存储空间分成许多块(扇区) ,这些空间可以被多个用户共享。用户作业在执行期间常常要在磁盘上建立文件或把已经建立在磁盘上的文件删去,这就涉及到磁盘存储空间的分配和回收。一个文件存放到磁盘上,可以组织成顺序文件(连续文件)、文件(串联文件)、索引文件等,因此,磁盘存储空间的分配有两种方式,一种是分配连续的存储空间, 另一种是可以分配不连续的存储空间。 怎样有效地管理磁盘存储空间是操作系统应解决的一个重要问题,通过本实习使学生掌握磁盘存储空间的分配和回收算法。三、实习
2、题目本实习模拟三种磁盘存储空间的管理方法。第一题:连续的磁盘存储空间的分配和回收。提示:(1) 要在磁盘上建立顺序文件时, 必须把按序排列的逻辑记录依次存放在磁盘的连续存储空间中。可假定磁盘初始化时,已把磁盘存储空间划分成若干等长的块(扇区),按柱面号和盘面号的顺序给每一块确定一个编号。 随着文件的建立、 删除、磁盘存储空间被分成许多区(每一区包含若干块),有的区存放着文件,而有的区是空闲的。当要建立顺序文件时必须找到一个合适的空闲区来存放文件记录, 当一个文件被删除时, 则该文件占用的区应成为空闲区。为此可用一空闲区表来记录磁盘存储空间未占用的部分,格式如下:序起始空闲空闲块个状号块号数态1
3、56未分配2143未分配32130未分配4空表目(2)要建立文件时,先查找空闲区表,从状态为 “未分配” 的登记栏目中找出一个块数能满足要求的区, 由起始空闲块号能依次推得可使用的其它块号。若不需要占用该区的所有块时, 则剩余的块仍应为未分配的空闲块,这时要修改起始空闲块号和空闲块数。若占用了该区的所有块,则相应登记栏中的状态修改成“空表目”。删除一个文件时,从空闲区表中找一个状态为“空表目”的登记栏目,把归还的起始块号和块数填入对应的位置。磁盘存储空间的分配和回收算法类似于主存储器的可变分区方式的分配和回收。同学们可参考实习四的第一题。.(3) 当找到空闲块后, 必须启动磁盘把信息存放到指定
4、的块中, 启动磁盘必须给出由三个参数组成的物理地址: 柱面号、 磁道号和物理记录号。 故必须把找到的空闲块号换算成磁盘的物理地址。为了减少移臂次数, 磁盘上的信息按柱面上各磁道顺序存放。现假定一个盘组共有 200个柱面,(编号0-199 )每个柱面有20 个磁道(编号0-19 ,同一柱面上的各磁道分布在各盘面上,故磁道号即盘面号。),每个磁道被分成等长的6 个物理记录(编号0-5 ,每个盘面被分成若干个扇区,故每个磁道上的物理记录号即为对应的扇区号。)。那么,空闲块号与磁盘物理地址的对应关系如下:假设 M=空闲块号,m= 空闲块号66则物理记录号= m磁道号 = M20柱面号 = M20(4)
5、 删除一个文件时, 从文件目录表中可得到该文件在磁盘上的起始地址和逻辑记录个数,假定每个逻辑记录占磁盘上的一块,则可推算出归还后的起始空闲块号和块数,登记到空闲区表中。换算关系如下:起始空闲块号=(柱面号20+磁道号)6+物理记录号空闲块数 =逻辑记录数(5) 请设计磁盘存储空间的分配和回收程序, 要求把分配到的空闲块转换成磁盘物理地址,把归还的磁盘空间转换成空闲块号。假定空闲区表的初值如提示(1)中指出,现有一文件要占用10 块,运行你所设计的分配程序, 显示或打印分配后的空闲区表以及分配到的磁盘空间的起始物理地址。然后,有一文件被删除,它占用的磁盘空间为:1 号柱面 2 号磁道, 0 号物
6、理记录开始的4 块,运行你所设计的回收程序,显示或打印回收后的空闲区表。第二题:用位示图管理磁盘存储空间提示:(1) 为了提高磁盘存储空间的利用率, 可在磁盘上组织成文件、 索引文件, 这类文件可以把逻辑记录存放在不连续的存储空间。为了表示哪些磁盘空间已被占用, 哪些磁盘空间是空闲的,可用位示图来指出。位示图由若干字节构成,每一位与磁盘上的一块对应,“1”状态表示相应块已占用,“ 0”状态表示该块为空闲。位示图的形式与实习四中的位示图一样,但要注意,对于主存储空间和磁盘存储空间应该用不同的位示图来管理,绝不可混用。(2)申请一块磁盘空间时,由分配程序查位示图,找出一个为“0”的位,计算出这一位
7、对应块的磁盘物理地址,且把该位置成占用状态“ 1”。假设现在有一个盘组共80 个柱面,每个柱面有两个磁道, 每个磁道分成 4 个物理记录。 那么, 当在位示图中找到某一字节的某一位为“ 0”时,这个空闲块对应的磁盘物理地址为:柱面号 =字节号磁道号 = 位数4物理记录号 = 位数4(3) 归还一块磁盘空间时, 由回收程序根据归还的磁盘物理地址计算出归还块在位示图中的对应位,把该位置成“ 0”。按照( 2)中假设的盘组,归还块在位示图中的位置计算如下:字节号 =柱面号位数 =磁道号4+物理记录号(4)设计申请一块磁盘空间和归还一块磁盘空间的程序。要求能显示或打印程序运行前.和运行后的位示图;分配
8、时把分配到的磁盘空间的物理地址显示或打印出来,归还时把归还块对应于位示图的字节号和位数显示或打印出来。(5) 假定已有如表 6-1 的磁盘空间被占用了, 现在要申请五块磁盘空间, 运行分配程序,按( 4)中要求显示或打印运行的结果。然后再归还如表6-2 的空间, 运行回收程序, 按( 4)中的要求显示或打印运行结果。表 6-1柱面磁道物理记录号号号001002010013100112表 6-2柱面磁道物理记录号号号002010101第三题:模拟UNIX系统的空闲块成组法,实现磁盘存储空间的管理。提示:(1) 假定磁盘存储空间已被划分成长度为n 的等长块,共有 M块可供使用。 UNIX 系统中采
9、用空闲块成组的方法来管理磁盘存储空间, 将磁盘中的每 N个空闲块( N<M)分成一组,最后一组可以不足N块,每组的第一块中登记了下一组空闲块的块数和块号,第一组的块数和块号登记在专用块中,登记的格式如下:0 空闲块数 k1 空闲块号 12 空闲块号 2K 空闲块号 k当第一项容为“0”时,则第二项起指出的空闲块是最后一组。(2)现模拟 UNIX 系统的空闲块成组,假定共有8 块可供使用,每3 块为一组,则空闲块成组的初始状态为:.开始时, 空闲块号是顺序排列的,但经若干次的分配和归还操作后,空闲块的就未必按序排列了。用二维数组 A: array 0 M-1 of array 0 n-1
10、来模拟管理磁盘空间,用 Ai 表示第 I 块,第 0 块 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 *next; struct filetowrite char name10;/文件名int size;/文件大小int addr_cylinder;/装入磁盘的首地址_柱面号int addr_track;/装入磁盘的首地址_磁道号int addr_note;/装入磁盘的首
13、地址_物理记录号struct filetowrite *next; .六、源代码及注释1、题一源代码:#include<stdlib.h>#include<stdio.h>int getmalloc()/分配磁盘空间int flag=0;struct freeblock *p=FBhead;struct filetowrite *File;File=(struct filetowrite *)malloc(sizeof(struct filetowrite);printf("输入要装入的文件名:");scanf("%s",File
14、->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;File->addr_track=(p->FBbegin)/6)%20;File->addr_note=(p->FBbegin)%6;Fil
15、e->next=Filehead->next;/加入文件链表Filehead->next=File;if(File->size)<(p->num)/修改该快的 起始地址和块数p->FBbegin=p->FBbegin+File->size;p->num=p->num-File->size;else p->state='U'break;if(flag=0)printf("抱歉 ! 目前没有足够的磁盘空间分配给该文件.n");elseprintf("分配磁盘成功!n该文件的物
16、理地址: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",&name);for(p=Filehead;p->next!=NULL;p=p->ne
17、xt)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->
18、next;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=qnod
19、e->num+p->next->size;funion=1;break;elseqnode->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
20、 freeblock *)malloc(sizeof(struct freeblock);snode->FBbegin=addr;snode->num=p->next->size;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->n
21、ext=p->next->next;free(q);break;if(flag=0)printf("没有该文件 !n");else printf("文件删除成功 !n"); int dispfree()/显示磁盘空闲区表int i=1;struct freeblock *p=FBhead;printf("n磁盘空闲区表n");printf(" 序号 t 起始空闲块号 t 空闲块个数 t 状态 n"); for(p=FBhead->next;p!=NULL;p=p->next) if(p-&g
22、t;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->next;p!=NULL;p=p->next)if(strcm
23、p(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=(
24、struct freeblock *)malloc(sizeof(struct freeblock);FBhead->next=NULL;printf("输入磁盘空闲区个数:");scanf("%d",&n);for(i=1;i<=n;i+)pnew=(struct freeblock *)malloc(sizeof(struct freeblock);pnew->next=NULL;pnew->next=FBhead->next;FBhead->next=pnew;.printf("起始空闲块号:&
25、quot;);scanf("%d",&pnew->FBbegin);printf("空闲块个数: ");scanf("%d",&pnew->num);pnew->state='F'pnew=pnew->next;Filehead=(struct filetowrite *)malloc(sizeof(struct filetowrite);Filehead->next=NULL;dosystem("cls");printf("ntt*主菜单 *
26、nn");printf("ttt1.新建文件 n");printf("ttt2.删除文件 n");printf("ttt3.查看磁盘 n");printf("ttt4.查看文件 n");printf("ttt5.退出 n");printf("请选择: ");scanf("%c",&ch);switch(ch)case '1':getmalloc();system("pause");break;case
27、'2':deletelfree();system("pause");break;case '3':dispfree();system("pause");break;case '4':dispfile();system("pause");break;case '5':exit(1);break;default:printf("输入错误 ! 请重新输入 .n");printf("n");getchar();while(ch!=4);re
28、turn 0;2、题二源代码:#include <stdio.h>#include <process.h>void Initbitmap(int map88) int cylinder,track,sector;char choice='Y'printf("初始化位视图.n");while(choice='y'|choice='Y') printf("柱面号 :");scanf("%d",&cylinder);printf("磁道号 :"
29、;);scanf("%d",&track);printf("物理记录号 :");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;i<8;i+) for(j=0;j
30、<8;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("分配到的柱面号、磁道号、物理记录数");printf("%dt%dt%d",cylinder,track,sector);printf("n"); else printf("空间不足,分配失败!"); void reclaim(int map88) int cylinder,track,sector;
31、 printf(" 柱面号 :"); scanf("%d",&cylinder); printf(" 磁道号 :"); scanf("%d",&track); printf(" 物理记录号 :"); scanf("%d",§or);if(mapcylinder4*track+sector=0)printf("此块为未分配块!回收出错!");getchar();elsemapcylinder4*track+sector=0;p
32、rintf("回收块对应的字节号:%4dt位数:%4dn",cylinder,4*track+sector); void main() int bitmap88; int i,j; int choice;or(i=0;i<8;i+)for(j=0;j<8;j+)bitmapij=0; Initbitmap(bitmap);while(1) printf("n请输入选择 :");printf("1-分配, 2- 回收, 3- 显示位示图, 0- 退出 n");scanf("%d",&choice)
33、;switch(choice)case 1:allocate(bitmap);break;case 2:reclaim(bitmap);break;case 3:for(i=0;i<8;i+)for(j=0;j<8;j+)printf("%8d",bitmapij);printf("n");break;case 0:exit(0);default:printf("错误选择! ");break; .3、第三题源程序:#include<stdio.h>int MA4;/*空闲块数组 */intA94=3,1,2,3
34、,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=MA0; printf("ngroup1:");for(j=1;j<=i;j+) printf("%d ",MAj);mark+No=MAj;temp=MA1;count=2;while(Atemp1!=0)
35、printf("ngroup%d:",count); i=Atemp0; for(j=1;j<=i;j+) printf("%d ",Atempj);mark+No=Atempj;count+;temp=Atemp1;printf("ngroup%d:",count);i=Atemp0;for(j=2;j<=i+1;j+)if(Atempj>0)printf("%d",Atempj);mark+No=Atempj;elsei=MA0;if(i=1)printf("nThe blocks
36、are all assigned");elseprintf("ngroup1:");for(j=2;j<=i;j+)printf("%d",MAj);mark+No=MAj; void display() /*显示分组情况*/int i,j;if(MA0!=0)display1();elsei=MA1;for(j=0;j<=3;j+)MAj=Aij;.display1();void assign()/*分配空闲块 */int s,i;if(MA0>1)/*若该组不止一个空闲块*/i=MA0;s=MAi;MA0-;printf("nnumber of the block:%d",s);else if(MA0=1)/*只剩一个空闲块*/if(MA1!=0)/*还有其它空
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 快递员计件合同协议
- 和4s店签合同协议
- 2025商场摊位租赁合同示范文本
- 快递工资月结合同协议
- 母婴工厂代加工合同协议
- 快递劳务承揽合同协议
- 欠款房产证抵押合同协议
- 商标出租合同协议
- 楼道大件搬运合同协议
- 商品房更名合同协议
- 小红书搜索推广营销师认证考试题库(附答案)
- GB/T 30595-2024建筑保温用挤塑聚苯板(XPS)系统材料
- TSG+11-2020锅炉安全技术规程
- 幼儿园优质公开课:小班语言《小兔乖乖》课件
- 北师大版高中英语选择性必修四全册课文及翻译(中英文Word)
- 胃外科手术记录
- 梅杰氏综合征的治疗和医疗护理
- 机器学习导论教案
- 临边洞口防护设施安全验收表
- 2021年北京亦庄国际投资发展有限公司校园招聘笔试试题及答案解析
- 餐饮商户三关一闭检查表
评论
0/150
提交评论