磁盘存储空间的管理 实践报告.docx
《磁盘存储空间的管理 实践报告.docx》由会员分享,可在线阅读,更多相关《磁盘存储空间的管理 实践报告.docx(18页珍藏版)》请在冰豆网上搜索。
磁盘存储空间的管理实践报告
《操作系统》课程设计任务书
指导教师姓名
成晓静
教研室
信计
课程设计题目
磁盘存储空间的管理
人数
4
学时
1周
设计目的、任务和要求
(一)目的
要求学生运用适当的编程语言,模拟UNIX系统中的成组链接法。
从而对操作系统有更深入的认识与理解。
(二)任务
在UNIX系统中,以组为单位,用空闲块自己管理自己。
要求用成组链接法实现磁盘空间的分配和回收(假定每组管理5个磁盘块)。
建立一个文件目录,管理已经建立的文件的情况,按照给定的文件名进行空间回收
(三)要求
学生3个人组成一个小组,要求根据上述任务,通过查找资料,完成程序设计,并撰写分析报告,报告要体现工作过程、测试结果、分析等内容。
设计的方法和步骤
查阅资料,展开充分理论分析,在掌握算法原理后进行软件设计,完成下列任务:
1、熟悉此次设计的目标,查阅相关资料;
2、对算法理论进行剖析,论证算法实现的可行性;
3、根据可行的算法设计,进行软件程序实现,并最终解决实际问题。
设计工作计划
本案例时间为5天,具体安排如下
熟悉课设目标,查阅相关资料:
1天
算法理论进行剖析,论证算法实现的可行性:
1天
根据可行的算法设计,进行软件程序实现:
2天
对所设计的程序解决实际问题并分析,撰写分析报告:
1天
主要参考资料
《计算机操作系统》汤小丹西安电子科技大学出版社
《操作系统课程设计》李善平季江民浙江大学出版社
教研室签字:
年月日
院签字:
年月日
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)intMA;/*空闲块数组*/
(2)intA[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)intmark[9];/*存放已分配的块*/
intNo=0;/*已分配的块数*/
(4)voiddisplay()/*显示分组情况*/
(5)voidassign()/*分配空闲块*/
(6)voidcallback()/*回收空闲块*/
(7)voidmenu()/*功能选择函数*/
3.成果
3.1磁盘存储空间的分配
运行后,显示文件区中的所有空闲盘块号,将其分为三组,每组5个盘块。
则第一组为1~5号盘块,第二组为6~10号盘块,第三组即最末一组为11~14号盘块。
(注:
最后一组的盘块数为5是因为这是指可供使用的空闲盘块,在S.free(0)中存放的0为空闲盘块的结尾标志。
)
之后键盘输入,输入1分配磁盘存储空间(每次仅分配一个存储空间)。
3.2磁盘存储空间的回收
输入y表示继续。
接着继续输入2可以将已分配的磁盘存储空间进行回收。
3.3结束
若在选择continueornot?
时选择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
intMA[6]={5,1,2,3,4,5};
/*空闲块数组*/
intA[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}};
/*磁盘空间*/
intmark[9];
/*存放已分配的块*/
intNo=0;
/*已分配的块数*/
voiddisplay1()
{
inti,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("\nTheblocksareallassigned");
else
{
printf("\ngroup1:
");
for(j=2;j<=i;j++)
{
printf("%d",MA[j]);
mark[++No]=MA[j];
}
}
}
}
voiddisplay()
/*显示分组情况*/
{
inti,j;
if(MA[0]!
=0)
display1();
else
{
i=MA[1];
for(j=0;j<=5;j++)
MA[j]=A[i][j];
display1();
}
}
voidassign()
/*分配空闲块*/
{
ints,i;
if(MA[0]>1)
/*若该组不止一个空闲块*/
{
i=MA[0];
s=MA[i];
MA[0]--;
printf("\nnumberoftheblock:
%d",s);
}
else
if(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("\nnumberoftheblock:
%d",s);
}
else
/*没有其它空闲块组*/
{
printf("\nThereisn'tanyspace");
return;
}
}
else
/*当前组已分配完*/
{
for(i=0;i<=5;i++)
MA[i]=A[0][i];
assign();
}
display();
/*显示分组情况*/
}
voidcallback()
/*回收空闲块*/
{
inti,j,temp;
printf("\ninputtheNo.oftheblockyouwanttocallback:
");
scanf("%d",&j);
getchar();
/*得到待回收的空闲块号*/
for(temp=1;temp<=No;temp++)
{
if(mark[temp]==j)
break;
}
if(temp/*若该空闲块已在,退出*/
{
printf("\nTheblockisinthedisk");
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();
/*显示*/
}
voidmenu()
/*功能选择函数*/
{
intchoice;
charjudge;
printf("\ninputyourchoice:
(1--assign,2--callback):
");
scanf("%d",&choice);
getchar();
if(choice==1)
assign();
else
if(choice==2)
callback();
else
printf("\ninvalidcommand!
");
printf("\ncontinueornot?
(y--Yes,n--Not):
");
scanf("%c",&judge);
getchar();
if(judge=='y')
menu();
else
{
printf("\nNowthegraphis:
");
display();
printf("\npressanykeytoquit");
getchar();
}
}
voidmain()
{
inti;
for(i=0;i<=5;i++)
MA[i]=A[0][i];
display();
menu();
}