说明书一份
三年级 记叙文 9799字 171人浏览 黑崎want

《操作系统原理》课程设计任务书

题目:磁盘空间管理模拟实现

学生姓名:刘亚红 学号:13740115 班级:13级软件工程(1)班 题目类型:软件工程(R ) 指导教师:陈文娟/马生菊

一、设计目的

学生通过该题目的设计过程,掌握磁盘存储管理的原理、软件开发方法并提高解决实际问题的能力。

二、设计任务

用位示图管理磁盘空间的分配与回收,要求显示程序运行前和回收磁盘的物理地址过程。

三、设计要求

1. 分析设计要求,给出解决方案(要说明设计实现所用的原理、采用的数据结构)。

2. 设计合适的测试用例,对得到的运行结果要有分析。

3. 设计中遇到的问题,设计的心得体会。

4. 文档:课程设计打印文档每个学生一份,并装在统一的资料袋中,资料袋前面要贴有学校统一的资料袋封面。

四、提交的成果

1. 课程设计说明书内容包括

(1) 封面(学院统一印制);

(2) 课程设计任务书;

(3) 中文摘要150字;关键词3-5个;

(4) 目录;

(5) 正文;(设计思想;各模块的伪码算法;函数的调用关系图;测试结果等)

(6) 设计总结;

(7) 参考文献;

(8) 致谢等。

注:每一部分是单独的一章,要另起一页写。

2. 排版要求

(1) 所有一级标题为宋体三号加粗(即上面写的2~8部分,单独一行,居中)

(2) 所有二级标题为宋体四号加粗(左对齐)

(3) 所有三级标题为宋体小四加粗(左对齐)

(4) 除标题外所有正文为宋体小四,行间距为固定值22磅,每个段落首行缩进2字符

(5) 目录只显示3级标题,目录的最后一项是无序号的“参考文献资料”。

3. 其他要求(班长负责,务必按照以下方式建文件夹 )

(1) 以班级为单位刻录光盘一张,光盘以班级命名,例如:“10级计算机科学与技术1班”;

(2) 光盘内每人一个文件夹,以学号姓名命名——如“10730101 陈映霞”,内容包括任务书、设计文档。

五、各阶段时间安排(共2周)

根据教学计划安排,于2014年12月8日~ 2014年12月19日安排为期二周的操作系统课程设计。

六、考勤、纪律及注意事项

1.每日准时教室设计,不得无故缺席、早退。 2.独立、按时完成课程设计任务,准时上交资料。

七、主要参考文献

1. 汤子瀛,哲凤屏. 《计算机操作系统》[M].西安:西安电子科技大学学出版社.1996年

2. 王万森. 《计算机操作系统原理》[M].北京:高等教育出版社.2001年 3. 周长林,左万历. 《计算机操作系统教程》[M].北京:高等教育出版社.1994年

4. 黄廷辉,王宇英. 《计算机操作系统实践教程》[M].北京:清华大学出版社. 2007年5月

5. 殷兆麟. 《计算机操作系统》[M].北京:清华大学出版社.2007年3月 6. 张尧学,史美林,张高. 《计算机操作系统教程》[M].北京:清华大学出版社.1993年

摘要

要把文件信息存放在存储介质上,必须先找出存储介质上可供使用的空闲块。存储介质上某个文件不再需要时,又要收回它所占的存储空间作为空闲块。用户作业在执行期间经常要求建立一个新文件或撤消一个不再需要的文件,因此,文件系统必须要为它们分配存储空间或收回它所占的存储空间。如何实现存储空间的分配和收回,取决于对空闲块的管理方法,此系统采用的对磁盘存储空间的分配和收回的方法是:位示图法(用一张位示图(简称位图)来指示磁盘存储空间的使用情况)。

关键词:磁盘的分配和回收管理;位示图;磁盘存储空间管理

目录

1. 绪论 ............................................................................................................ 1

1.1问题描述 ............................................................................................ 6

1.2设计目的 ............................................................................................ 6

1.3设计内容 ............................................................................................ 6

1.4设计思想 ............................................................................................ 7

1.5 小组分工 ........................................................................................... 7

2概要设计 ........................................................................................................ 9

2.1 函数调用关系图 ............................................................................... 9

3详细设计 ...................................................................................................... 11

3.1算法思想: ...................................................................................... 11

3.2算法流程图 ...................................................................................... 11

3.3位示图法各模块的伪码算法 .......................................................... 14

4. 调试与测试 ................................................................................................. 16

4.1程序测试结果 .................................................................................. 16

4.2系统优缺点分析 .............................................................................. 18

总结 ......................................................................................................................... 19

参考文献 ......................................................................................................... 20

致谢 ................................................................................................................. 21

附录(源程序) ............................................................................................. 22

1. 绪论

1.1问题描述

磁盘空间管理主要是当文件向磁盘写入时要求有合适当空间,则必须先找出存储介质上可供使用的空闲块,再向其中写入。而存储介质上某个文件不再需要时,又要收回它所占的存储空间作为空闲块。本问题主要时实现存储空间的分配和收回。

1.2设计目的 怎样有效地管理磁盘存储空间是操作系统应解决的一个重要问题,通过该题目的设计过程,掌握磁盘存储空间的分配和回收算法、磁盘存储管理的原理以及软件开发方法,并提高解决实际问题的能力。

1.3设计内容 模拟磁盘空闲空间的表示方法,以及模拟实现磁盘空间的分配和回收。本实习模拟用位示图管理磁盘存储空间的管理方法。设计申请一块磁盘空间和归还一块磁盘空间的程序。要求能显示或打印程序运行前和运行后的位示图;分配时把分配到的磁盘空间的物理地址显示或打印出来,归还时把归还块对应于位示图的字节号和位数显示或打印出来。

假定已有如表1-1的磁盘空间被占用了,现在要申请五块磁盘空间,运行分配程序,显示或打印运行的结果。然后再归还如表1-2的空间,运行回收程序,显示或打印运行结果。

表1-1

表1-2

1.4设计思想

在Windows XP,Windows 7等操作系统中对磁盘存储空间的管理是位示图法,位示图法:一个简单的管理方法,是用一张位示图(简称位图)来指示磁盘存储空间的使用情况。一个盘组的分块确定后,根据分配的总块数决定位图由多少个字组成,建筑位图中的每一位与盘组分块1-1对应, “1”状态表示相应块已占用,“0”状态表示该块空闲。在分配时先查看要分配的位置的数值,若其值为0,则分配,否则不予分配,输出此空间已被占用;在释放时分别找到柱面号,磁道号和扇区号所对应的在位示图中的位置,进行释放,若其值为0,则表示为分配,若其值为1,则变为0,回收完成。

1.5 小组分工

本次课程设计,我和我的同学也是我的室友李中玉一组。在课程设计中,我们俩每人负责一种算法设计,李中玉负责磁盘分配算法,我负责磁盘回收算法;

根据算法我们分别绘制出对应算法的程序流程图。我主要负责界面的设计与总体设计部分,李中玉主要负责资料查询与系统调试。在整个课程设计过程中我俩取长补短、互帮互助、共同探讨解决疑难问题,最终顺利完成了本次课程设计。

2概要设计

2.1 函数调用关系图

用位示图表示的磁盘空间可以很形象的反映出磁盘中空间的利用情况,不足之处在于每次分配与回收只可以对单一的分块进行操作,不能同时进行几个块的分配与回收,要进行多个块的分配时,只能单独分配,且块之间没有相互链接,对于大的空间分配只能在连续空间进行。采用简单的位示图法管理磁盘存储空间,本系统总共调用了4个函数,分别是:

(1)void out()/*输出位示图函数*/

形参:无

返回参数:无;

(2)void callback()/*回收函数*/

形参:无

返回参数:无;

(3)void assign()/*分配函数*/

形参:无

返回参数:无;

(4)void menu( ):功能选择函数

形参:无

返回参数:无;

具体情况如下图所示:

图2-1 函数调用关系图

位示图是一张可以反映磁盘空间是否被占有的模拟图,用一个二维数组表示磁盘的空间,数组内每一个元素表示磁盘内相应的分块,数组元素为“1”表示该块已被占,“0”表示该块为空。数组元素位置与磁盘分块一一对应,即可描述出磁盘空间的利用情况。

3详细设计

3.1算法思想:

磁盘存储空间的分配有两种方式,一种是分配连续的存储空间,另一 种是可以分配不连续的存储空间。为了表示哪些磁盘空间已被占用,哪些磁盘空间是空闲的,可用位示 图来指出。位示图由若干字节构成,每一位与磁盘上的一块对应,“1”状态表示相应块已占用,“0”状态表示该块为空闲。

当申请一块磁盘空间时,由分配程序查位示图,找出一个为“0”的位,计算出这一位对应块的磁盘物理地址,且把该位置成占用状态“1”。假设现在有一个盘组共80个柱面,每个柱面有两个磁道,每个磁道分成4个物理记录。那么,当在位示图中找到某一字节的某一位为“0”时,这个空闲块对应的磁盘物理地址为:

柱面号=字节号

磁道号=[位数/4]

物理记录号={位数/4}

当归还一块磁盘空间时,由回收程序根据归还的磁盘物理地址计算出归还块在位示图中的对应位,把该位置成“0”。归还块在位示图中的位置计算如下:

字节号=柱面号

位数=磁道号×4 + 物理记录号

3.2算法流程图

unsigned int size[5]={1,1,1,1,1} ;/*保存位示图*/

(1)盘块的分配可分三步:

①顺序扫描位示图,从中找出一个或一组其值为“0”的二进制位。

②将所找到的一个或一组二进制位转换成与之相应的盘块号。

③修改位示图。

分配磁盘空间程序流程图如下:

N+1=1

图2-2 分配磁盘空间程序流程图

回收空间流程图如下:

(2)盘块的回收步骤:

①将回收的盘块号改为与之相对应的行号和列号。

②修改位示图。

错误

图2-3回收磁盘空间程序流程图

3.3位示图法各模块的伪码算法

(1)#include<stdio.h>

unsigned int size[5]={1,1,1,1,1} ;/*保存位示图*/

(2)void out()/*输出位示图函数*/

{ unsigned int i,j,m;

for(j=0;j<5;j++)/*循环输出size 的各个数的各个二进制位*/ {m=size[j];

for(i=0;i<16;i++)/**/

{printf("%d ",m%2);

m=m/2;

if(i==7)

printf("\n");

}

printf("\n");

}

}

(3)void callback()/*回收函数*/

{ unsigned int i,j,k,s=1,q,m,sq,zhm,cid;

printf("确定要回收块的柱面号、磁道号、扇区号:\n"); printf("请输入柱面号:");

scanf("%d",&zhm);

printf("\n请输入磁道号:");

scanf("%d",&cid);

printf("\n请输入扇区号:");

scanf("%d",&sq);

if(zhm%2==0)/*计算对应的位示图位置*/ { i=zhm/2;

j=cid*4+sq+1;

}

else

{ i=(zhm-1)/2;

j=cid*4+sq+9;

}

q=size[i];

m=j-1;

while(m)

{q=q/2;

m--;}

if(q%2==1)/*判断该块是否被分配*/

{if(j==1)size[i]-=1;/*将位示图对应为置零*/ else

{for(m=1;m<j;m++)

s*=2 ; size[i]-=s;} printf("回收成功!");

printf("回收后的位示图为:\n"); out();

}

else

printf("该块以被分配!");

}

(4)void assign() /*分配函数*/

(5)void menu( ):功能选择函数

4. 调试与测试

4.1程序测试结果

1. 编译运行磁盘管理模拟程序,我们看到的如下所示,这是程序初始 化时出现的界面:

图4-1 系统初始化界面

2. 现在我们对其进行操作:选择1—分配文件,出现如下界面,下图为用位示图法分配一个磁盘空间后的状态图:

图4-2位示图法分配操作运行结果图

3. 为了使该系统的分配与回收效果更加明显,我们选择:y ——继续分配磁盘空间,得到如下界面:

图4-3位示图法分配操作运行结果图

4. 操作退出

图4-4位示图法回收操作运行结果图

4.2系统优缺点分析

用位示图表示的磁盘空间可以很形象的反映出磁盘中空间的利用情况,不足之处在于每次分配与回收只可以对单一的分块进行操作,不能同时进行几个块的分配与回收,要进行多个块的分配时,只能单独分配,且块之间没有相互链接,对于大的空间分配只能在连续空间进行。

总结

做课程设计是为了对平时学习的理论知识与实际操作相结合,在理论和实践上进一步巩固已学基本理论及应用知识并加以综合提高,学会将知识应用于实际的方法,提高分析和解决问题的能力。在做操作系统磁盘管理模拟实验课程设计的过程中,深深感觉到自身所学知识的有限。有些题目书本上没有提及,所以就没有去研究过,做的时候突然间觉得自己真的有点无知,虽然现在去看依然可以解决问题,但还是浪费了许多,这一点是必须在以后的学习中加以改进的地方,同时也要督促自己在学习的过程中不断的完善自我。在设计过程中的思考和讨论,对现有知识能够运用计算机来解决现实生活中的实际问题确立了信心,对模块化程序设计思想有了比较清晰的印象,为今后的程序设计奠定了一定的心理和技术上的准备。这次课程设计加强了我对计算机操作系统的认识,对我个人而言是对所学课程内容掌握情况的一

次自我验证。通过课程设计提高了我对所学知识的综合应用能力,全面检查并所学的内容,培养独立思考,在分析问题、解决 问题的过程中,更是获得一种成功的喜悦。

参考文献

[1]汤子瀛,哲凤屏. 《计算机操作系统》[M].西安:西安电子科技大学学出版社.1996年

[2]王万森. 《计算机操作系统原理》[M].北京:高等教育出版社.2001年

[3]周长林,左万历. 《计算机操作系统教程》[M].北京:高等教育出版社.1994

[4]黄廷辉,王宇英. 《计算机操作系统实践教程》[M].北京:清华大学出版社. 2007年5月

[5]殷兆麟. 《计算机操作系统》[M].北京:清华大学出版社.2007年3月

[6]张尧学,史美林,张高. 《计算机操作系统教程》[M].北京:清华大学出版社.1993

[7]王旭阳等. 操作系统原理 [M]. 国防工业出版社, 2009

[8]汤子瀛,哲凤屏. 《计算机操作系统》. 西安电子科技大学学出版社.

[9]王清,李光明. 《计算机操作系统》. 冶金工业出版社.

[10]孙钟秀等. 操作系统教程. 高等教育出版社

[11]曾明. Linux操作系统应用教程. 陕西科学技术出版社.

致谢

这次课程设计我通过自己的实际分析及动手调试程序,最终完成操作系统磁盘空间管理模拟实验,收益颇丰。

首先有了这次实践机会,给了自己锻炼的舞台,同时也是对自身的检测,再加上指导老师陈文娟和马生菊孜孜不倦的传授知识,给予我们最大的帮助和全面的指导,也感谢我的代课老师,你们的不辞辛苦,给了同学们更好的发展。在这里衷心的感谢你们。最后还要感谢热心的同学们,在我们陷入误区的时候你们热情的帮助使我们摆脱困境。

附录(源程序)

位示图法算法如下:

#include<stdio.h>

unsigned int size[5]={1,1,1,1,1} ;/*保存位示图*/

void out()/*输出位示图函数*/

{ unsigned int i,j,m;

for(j=0;j<5;j++)/*循环输出size 的各个数的各个二进制位*/ {m=size[j];

for(i=0;i<16;i++)/**/

{printf("%d ",m%2);

m=m/2;

if(i==7)

printf("\n");

}

printf("\n");

}

}

void callback()/*回收函数*/

{ unsigned int i,j,k,s=1,q,m,sq,zhm,cid;

printf("确定要回收块的柱面号、磁道号、扇区号:\n"); printf("请输入柱面号:");

scanf("%d",&zhm);

printf("\n请输入磁道号:");

scanf("%d",&cid);

printf("\n请输入扇区号:");

scanf("%d",&sq);

if(zhm%2==0)/*计算对应的位示图位置*/ { i=zhm/2;

j=cid*4+sq+1;

}

else

{ i=(zhm-1)/2;

j=cid*4+sq+9;

}

q=size[i];

m=j-1;

while(m)

{q=q/2;

m--;}

if(q%2==1)/*判断该块是否被分配*/

{if(j==1)size[i]-=1;/*将位示图对应为置零*/ else

{for(m=1;m<j;m++)

s*=2 ; size[i]-=s;} printf("回收成功!");

printf("回收后的位示图为:\n"); out();

}

else

printf("该块以被分配!");

}

void assign()/*分配函数*/

{ unsigned int n=0,i,s=1,j,k,q,m,sq,zhm,cid;

for(i=0 ,k=0;i<5;i++)

{ q=size[i] ;

j=0;

while(1) /*查找位示图的第一个为零的位,将其分配,该位置一*/

{ j++ ;

if((q%2)==0)

{ if(j==1) size[i]+=1;

else

{for(m=1;m<j;m++)

s*=2 ;

size[i]+=s;}

k=1;

break ;/*完成后退出*/

}

q=q/2;

}

if(k==1) /*将找到的位示图位转换成物理地址*/

{ if((j-1)/8==1)

{zhm=2*i+1;

cid=(j-9)/4;

sq=(j-9)%4;} else

{zhm=2*i;

cid=(j-1)/4;

sq=(j-1)%4;

}

n=1;

break;/*退出for 循环*/ }

}

if(n==0)

printf("没有空间可分配!\n");

else

{printf("分配成功!\n");/*输出物理地址*/ printf("柱面号为: %d\n",zhm); printf("磁道号为: %d\n",cid); printf("扇区号为: %d\n",sq); }

printf("分配后的位示图为:\n"); out();

}

void menu() /*功能选择函数*/ { int choice;

char judge;

printf("\n请选择操作:(1--分配,2--回收):"); scanf("%d",&choice);

getchar();

if(choice==1)

assign();

else if(choice==2)

callback();

else

printf("\n没有此项!");

printf("\n继续还是退出?(y--继续,n--退出):"); scanf("%c",&judge);

getchar();

if(judge=='y')

menu();

else

{ printf("\n现在的位示图:\n"); out();

printf("\n按任意键退出!\n"); getchar();

}

}

main()

{

out();

menu();

}