当前位置:文档之家› 磁盘存储空间的管理实践报告

磁盘存储空间的管理实践报告

目录1.相关知识 (4)1.1空闲盘块的组织 (4)1.2空闲盘块的分配与回收 (5)2.系统设计 (6)2.1算法及说明 (6)2.2算法流程图 (7)2.3数据结构及各子程序 (7)3.成果 (8)3.1磁盘存储空间的分配 (8)3.2磁盘存储空间的回收 (8)3.3结束 (9)4.总结 (10)4.1 个人总结勋 (10)4.2 个人总结史迎丰 (11)4.3 个人总结齐泓洋 (13)4.4 个人总结霖 (15)5.参考文献 (16)《操作系统》课程设计任务书1.相关知识1.1空闲盘块的组织(1)空闲盘块好栈用来存放当前可用的一组空闲的盘块好(最多含100个号),以及栈有的空闲盘块号数N。

顺便指出,N还兼作栈顶指针用。

(2)文件区中的所以空闲盘块被分成若干组,比如,将每100个盘块作为一组。

假定盘上共有1000个盘块,每块大小为1kb,其中201~7999号盘块用于存放文件,即作为文件区,这样,该区的最末一组盘块号应为7901~7999;次末组为7801~7900….;第二组盘块号为301~400;第一组为201~300(3)将每一组含有的盘块总数N和该组所有的盘块记入其前一组的第一个盘块的S.freee(0)~S.free(99)中。

这样,由各组的第一个盘块可链成一条链。

(4)将第一组的盘块总数和所有的盘块号记入空闲盘块号栈中,作为当前可供分配的空闲盘块号。

(5)最末一组只有99个盘块,其盘块号分别记入其前一组的S.freee(1)~S.free(99)中,而在S.freee(0)中则存放“0”,作为空闲盘块链的结束标志。

1.2空闲盘块的分配与回收当系统要为用户分配文件所需的盘块时,须调用盘块分配过程来完成。

该过程首先检查空闲盘块号栈是否上锁,如未上锁,便从栈顶取出一空闲盘块号,将与之对应的盘块分配给用户,然后将栈顶指针下移一格。

若该盘块号已是栈底,即S.freee(0),这是当前栈中最后一格可分配的盘块号。

由于在该盘块号所对应的盘块号记有下一组可用的盘块号,因此,须调用磁盘读过程,将栈底盘块号所对应的盘块的容读入栈中,作为新的盘块号栈的容,并把原栈底对应的盘块分配出去。

然后,再分配一相应的缓冲区。

最后,把栈中的空闲盘块数减1并返回。

在系统回收空闲盘块时,须调用盘块回收过程进行回收。

它是将回收盘块的盘块号记入空闲盘块号栈的顶部,并执行空闲盘块数加1操作。

当栈中空闲盘块号数目已达100时,表示栈已满,便将现有栈中的100盘块号记入新回收的盘块中,再将其盘块号作为新栈底。

、2.系统设计2.1算法及说明首先定义磁盘分配数组并初始化,9个一维数组分别表示9个空闲块,程序运行时,先将专用块A〔0〕复制到存中,然后进行功能选择,分配时,查MA,从中找出空闲块号,当一组的空闲块只剩第一块时,应把该块中指出的下一组的空闲块数和块号复制专用块这,然后把该块分配给申请者,当一组的空闲块分配完后则把专用块容(下一组情况)复制到存,再为申请者分配。

回收时,输入待回收的块号,查找该块是否已被分配,若未分配,退出,否则,当前组不满规定块数时,将归还块登记入该组,若当前组已满,则另建一新组,这时归还块作为新一组的第一块,应把存中登记的一组情况MA复制到归还块中,然后在MA这重新登记一个新组。

显示分组情况。

2.2算法流程图2.3数据结构及各子程序(1) int MA; /*空闲块数组*/(2) int A[9][6]={{5,1,2,3,4,5},{5,6,7,8,9,10},{0,0,0,0,0,0},{0,0,0,0,0,0},{0,0,0,0,0,0},{0,0,0,0,0,0},{5,0,11,12,13,14},{0,0,0,0,0,0},{0,0,0,0,0,0}};/*磁盘空间*/(3) int mark[9]; /*存放已分配的块*/int No=0; /*已分配的块数*/(4) void display() /*显示分组情况*/(5) void assign() /*分配空闲块*/(6) void callback() /*回收空闲块*/(7) void menu() /*功能选择函数*/3.成果3.1磁盘存储空间的分配运行后,显示文件区中的所有空闲盘块号,将其分为三组,每组5个盘块。

则第一组为1~5号盘块,第二组为6~10号盘块,第三组即最末一组为11~14号盘块。

(注:最后一组的盘块数为5是因为这是指可供使用的空闲盘块,在S.free(0)中存放的0为空闲盘块的结尾标志。

)之后键盘输入,输入1分配磁盘存储空间(每次仅分配一个存储空间)。

3.2磁盘存储空间的回收输入y表示继续。

接着继续输入2可以将已分配的磁盘存储空间进行回收。

3.3结束若在选择continue or not?时选择n,则结束程序。

4.总结4.1 个人总结勋在一的课设中,我对操作系统中的磁盘存储空间的管理有了更深的认识,同时对其中的算法“成组法”进行了深入的理解与运用,在VC6.0平台上运用C/C++语言对磁盘存储空间的管理进行了编程实现,在实践过程中也遇到了多的困难,但是在小组共同努力,共同合作的基础上,我们还是圆满的完成了任务。

同时深刻的理解了所学的知识。

对知识的理解程度要看你运用的好不好,实践时检验真理的标准,我也从中学到了很多东西。

在一的过程中,大家都付出了努力和汗水。

一起交流,一起共同进步。

同时我也了解到了团队合作的重要,一家都分工明确,各司其职,最终编写出完整可运行的程序。

磁盘存储空间一般可有空闲表法和空闲链表法来管理,但是空闲表法和空闲链表法都不适用于大型文件系统,因为这会使空闲表和空闲链表太长。

在UNIX 系统中采用的是成组法,这是将上述两种法相结合而形成的一种空闲盘快管理法,他兼备了上述两种法的优点而克服了两种法均有的表太长的缺点。

对成组法进行了编程实现让我更好的了解了该法的各项原理,同时也对我后续的课程乃至毕业后找工作都有很大的帮助。

总之,我很高兴能顺利完成任务并且学到很多东西。

4.2 个人总结史迎丰通过一的课设,我对操作系统有了进一步的了解,尤其是对成组法有了更深的学习和运用。

我更深刻地领会了操作系统工作原理和操作系统实现法,并提高了程序设计能力,虽然实验的过程中遇到一些困难,但及时发现仔细研究解决使我更能深刻的理解所学知识。

一过得很快,但是我们组很好的完成了任务,大家都付出了努力和汗水。

一起交流,一起共同进步。

我学会了团队的合作是多么重要,不管你个人是多么的厉害,如果是只要你一个人去完成这次课程,那都是很有难度的,但如果整个团队齐心协力的去完成它,那么就会达到事半功倍的效果。

我们分工明确,每个人都非常认真的去完成自己的任务。

这次课设,我受益匪浅,不仅学习到了知识,还学会了团队合作。

同时,这次课设由c语言来完成,我发现我的c语言基础不是很扎实,不过通过同学的指导,我的c语言能力有了显著的提升。

认识来源于实践,实践是认识的动力和最终目的,实践是检验真理的唯一标准。

所以这次课设对我们的作用是非常大的,我从中学会了很多平时上课学不到的东西。

这次课设虽然有些辛苦,但是我们能完美的完成任务,我感到很高兴,而且学到了很多。

4.3 个人总结齐泓洋时间如梭,一的操作系统课设即将结束,时间虽短,但对于我来说,却是受益匪浅的,这期间,在老师和组员们的关心支持下,我逐步对成组法有了更深一步的了解。

空闲表法和空闲链表法都不适用于大型文件系统,因为这会使空闲表和空闲链表太长。

在UNIX系统中采用的是成组法,这是将上述两种法相结合而形成的一种空闲盘快管理法,他兼备了上述两种法的优点而克服了两种法均有的表太长的缺点。

在UNIX系统中,将空闲块分成若干组,每100个空闲块为一组,每组的第一空闲块登记了下一组空闲块的物理盘块号和空闲块总数。

如果一个组的第一个空闲块号等于0,则有特殊的含义,意味着该组是最后一组,即无下一个空闲块。

分配空闲块的时候,从前往后分配,先从第一组开始分配,第一组空闲的100块分完了,才进入第二组。

释放空闲块的时候正好相反,从后往前分配,先将释放的空闲块放到第一组,第一组满了,在第一组前再开辟一组,之前的第一组变成第二组。

做课程设计时,指导老师给了我们很大帮助,发现了很多我们没有想到的问题,提了很多改进系统的意见。

课程设计是培养学生综合运用所学知识,发现、提出、分析和解决实际问题,锻炼实践能力的重要环节,这次课程设计虽然很累,但我学到了不少东西,对软件的设计过程和法有了更深入的了解,培养了我们的团队精神,锻炼了我们的沟通和表达能力。

通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。

4.4 个人总结霖通过本学期的操作系统课程进程控制、请求分页存储器管理、设备管理、文件管理、进程调度等实验,模拟操作系统原理的实现,使我能更深刻地领会操作系统工作原理和操作系统实现法,并提高程序设计能力,虽然实验的过程中遇到一些困难,但及时发现仔细研究解决使我更能深刻的理解所学知识。

实验程序仍有诸多不足之处,但实验过程中收获颇多,也为以后的实验积累了经验,这也更能促使我进步。

在UNIX系统中,将空闲块分成若干组,每100个空闲块为一组,每组的第一空闲块登记了下一组空闲块的物理盘块号和空闲块总数。

如果一个组的第一个空闲块号等于0,则有特殊的含义,意味着该组是最后一组,即无下一个空闲块。

分配空闲块的时候,从前往后分配,先从第一组开始分配,第一组空闲的100块分完了,才进入第二组。

释放空闲块的时候正好相反,从后往前分配,先将释放的空闲块放到第一组,第一组满了,在第一组前再开辟一组,之前的第一组变成第二组。

通过本次课程设计,让我对UNIX操作系统有了一定的了解,特别是掌握了一些基本的UNIX操作指令,对核的修改,调用,以及实现文件管理两面功能也加深了索引部分的认识,以前只是知道个原理性的东西,为接下来的UNIX学习打下了基础。

同时,也加深了对计算机操作系统这门课的部分知识点的理解。

也加强了我的调试能里,以及遇到问题能基本靠自己或上网检索的能力。

这个课设让我做使不那么死板,后来遇到问题我不会非得按照那个貌似正确的步骤一步一步来做,而是会去想它的原理,用自己的法从本质上把问题解决。

这个课设既有趣又让我学到了不少东西,感老师的指导!5.参考文献《计算机操作系统》汤小丹电子科技大学出版社《操作系统课程设计》善平季江民大学出版社C/C++源代码:#include<stdio.h>int MA[6]={5,1,2,3,4,5};/*空闲块数组*/int A[9][6]={{5,1,2,3,4,5},{5,6,7,8,9,10},{0,0,0,0,0,0},{0,0,0,0,0,0},{0,0,0,0,0,0},{0,0,0,0,0,0},{5,0,11,12,13,14},{0,0,0,0,0,0},{0,0,0,0,0,0}};/*磁盘空间*/int mark[9];/*存放已分配的块*/int No=0;/*已分配的块数*/void display1(){int i,j,temp,count;No=0;if(MA[1]!=0){ i=MA[0];printf("\ngroup1:");for(j=1;j<=i;j++){printf(" %d ",MA[j]);mark[++No]=MA[j];}temp=MA[1];count=2;while(A[temp][1]!=0){printf("\ngroup%d:",count);i=A[temp][0];for(j=1;j<=i;j++){printf(" %d ",A[temp][j]);mark[++No]=A[temp][j];}count++;temp=A[temp][1];}printf("\ngroup%d:",count);i=A[temp][0];for(j=2;j<=i+1;j++)if(A[temp][j]>0){printf(" %d ",A[temp][j]);mark[++No]=A[temp][j];}}else{i=MA[0];if(i==1)printf("\nThe blocks are all assigned"); else{printf("\ngroup1:");for(j=2;j<=i;j++){printf("%d",MA[j]);mark[++No]=MA[j];}}}}void display()/*显示分组情况*/{int i,j;if(MA[0]!=0)display1();else{i=MA[1];for(j=0;j<=5;j++)MA[j]=A[i][j];display1();}}void assign()/*分配空闲块*/{int s,i;if(MA[0]>1)/*若该组不止一个空闲块*/{i=MA[0];s=MA[i];MA[0]--;printf("\nnumber of the block:%d",s); }elseif(MA[0]==1)/*只剩一个空闲块*/{if(MA[1]!=0)/*还有其它空闲块组*/{s=MA[1];for(i=0;i<=5;i++)A[0][i]=A[s][i];MA[0]--;printf("\nnumber of the block:%d",s);}else/*没有其它空闲块组*/{printf("\nThere isn't any space");return;}}else/*当前组已分配完*/{for(i=0;i<=5;i++)MA[i]=A[0][i];assign();}display();/*显示分组情况*/}void callback()/*回收空闲块*/{int i,j,temp;printf("\ninput the No. of the block you want to callback:"); scanf("%d",&j);getchar();/*得到待回收的空闲块号*/for(temp=1;temp<=No;temp++){if(mark[temp]==j)break;}if(temp<No+1)/*若该空闲块已在,退出*/{printf("\nThe block is in the disk");return;}if(MA[0]<5)/*当前组不满5块*/{i=MA[0];MA[i+1]=j;MA[0]++;}else/*已有5块*/{for(i=0;i<=5;i++)A[j][i]=MA[i];MA[0]=1;MA[1]=j;}display();/*显示*/}void menu()/*功能选择函数*/{int choice;char judge;printf("\ninput your choice:(1--assign,2--callback):"); scanf("%d",&choice);getchar();if(choice==1)assign();elseif(choice==2)callback();elseprintf("\ninvalid command!");printf("\ncontinue or not?(y--Yes,n--Not):");scanf("%c",&judge);getchar();if(judge=='y')menu();else{printf("\nNow the graph is:");display();printf("\npress any key to quit");getchar();}}void main(){..w int i;for(i=0;i<=5;i++) MA[i]=A[0][i]; display();menu();}。

相关主题