- 1、本文档共8页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
1314011441杨林宽说明书汇编
中北大学
操作系统课程设计
说 明 书
?
学 院、系: 软件学院 专 业: 软件工程 学 生 姓 名: 杨林宽 学 号: 1314011441 设 计 题 目: 磁盘存储空间管理的算法模拟 起 迄 日 期: 2015年12月28日-2016年1月8日 指 导 教 师: 董晓丽
?
?
?2015 年12月25日
1.需求分析
本设计题目主要熟悉磁盘空间的管理,实现磁盘空间的分配和回收操作。通过本次设计,帮助我们理解在磁盘中的分配方法,以及如何充分有效地利用磁盘空间,使我们初步具有研究、设计、编制和调试操作系统模块的能力。
在这次实验中我所负责的设计内容是:采用位示图结构实现磁盘空间的分配和回收,基本要求有两点分别是:
具有创建文件、空间分配、删除文件、释放空间等基本功能;
把个文件目录、磁盘空间管理的数据结构变化情况显示出来。
最后,在linux系统中,实现了采用位示图结构实现磁盘空间的分配和回收。
2.总体设计
磁盘空间回收的流程
磁盘空间分配的流程
整个程序分为两个模块,分别是分配和回收。
位示图法:一个简单的管理方法是用一张位示图(简称位图)来指示磁盘存储空间的使用情况。一个盘组的分块确定后,根据分配的总块数决定位图由多少个字组成,建筑位图中的每一位与盘组分块1-1对应,“1”状态表示相应块已占用,“0”状态表示该块空闲。
位示图是一张可以反映磁盘空间是否被占有的模拟图,用一个二维数组表示磁盘的空间,数组内每一个元素表示磁盘内相应的分块,数组元素为“1”表示该块已被占,“0”表示该块为空。数组元素位置与磁盘分块一一对应,即可描述出磁盘空间的利用情况。
详细设计
(1) 为了提高磁盘存储空间的利用率,可在磁盘上组织成链接文件、索引文件,这类文件可以把逻辑记录存放在不连续的存储空间。为了表示哪些磁盘空间已被占用,哪些磁盘空间是空闲的,可用位示图来指出。位示图由若干字节构成,每一位与磁盘上的一块对应,“1”状态表示相应块已占用,“0”状态表示该块为空闲。位示图的形式与实习四中的位示图一样,但要注意,对于主存储空间和磁盘存储空间应该用不同的位示图来管理,绝不可混用。
(2) 申请一块磁盘空间时,由分配程序查位示图,找出一个为“0”的位,计算出这一位对应块的磁盘物理地址,且把该位置成占用状态“1”。假设现在有一个盘组共80个柱面,每个柱面有两个磁道,每个磁道分成4个物理记录。那么,当在位示图中找到某一字节的某一位为“0”时,这个空闲块对应的磁盘物理地址为:
柱面号=字节号
磁道号=[ ]
物理记录号={ }
(3) 归还一块磁盘空间时,由回收程序根据归还的磁盘物理地址计算出归还块在位示图中的对应位,把该位置成“0”。按照(2)中假设的盘组,归还块在位示图中的位置计算如下:
字节号=柱面号
位数=磁道号(4+物理记录号
(4) 设计申请一块磁盘空间和归还一块磁盘空间的程序。要求能显示或打印程序运行前和运行后的位示图;分配时把分配到的磁盘空间的物理地址显示或打印出来,归还时把归还块对应于位示图的字节号和位数显示或打印出来。
4. 代码
#include stdio.h
#include pthread.h
void Initbitmap(int map[8][8])
{
int cylinder,track,sector;
char choice=Y;
printf(初始化位视图...\n);
while(choice==y||choice==Y)
{
printf(柱面号:);
scanf(%d,cylinder);
printf(磁道号:);
scanf(%d,track);
printf(物理记录号:);
scanf(%d,sector);
map[cylinder][4*track+sector]=1;
printf(contiune?);
getchar();
scanf(%c,choice);
}
}
void allocate(int map[8][8])
{
int i,j;
int flag=0;
int cylinder,track,sector;
for(i=0;i8;i++)
{
for(j=0;j8;j++)
if(map[i][j]==0) {map[i][j]=1;flag=1;break;}
if(flag==1) break;
}
if(flag==1)
{
c
文档评论(0)