ImageVerifierCode 换一换
格式:DOCX , 页数:42 ,大小:908.71KB ,
资源ID:10735352      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/10735352.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(外存空闲空间管理模块的设计与实现C语言.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

外存空闲空间管理模块的设计与实现C语言.docx

1、外存空闲空间管理模块的设计与实现C语言外存空闲空间管理模块的设计与实现C语言(总27页)计算机科学与应用系课程设计报告操作系统原理姓名学号指导教师专业日期成 绩题目外存空闲空间管理模块的设计与实现指导教师评语1.题目描述 文件管理要解决的重要问题之一是如何为新创建的文件分配存储空间。其分配方法与内存的分配有诸多相似之处,即同样可采取连续分配方式或离散分配方式。前者具有较高的文件访问速度,但可能产生较多的外存零头;后者能有效地利用外存空间,但访问速度较慢。不论哪种分配方式,存储空间的基本分配单位都是磁盘块而非字节。为了实现存储空间的分配,系统首先必须能记住存储空间的使用情况。为此,系统应为分配存

2、储空间而设置相应的数据结构;其次,系统应提供对存储空间进行分配和回收的手段。2.设计思想 常用的文件存储空间的管理方法有:空闲表法、空闲链表法、位示图法、成组链接法。本次设计我用了空闲表法和位示图法来模拟实现外存空闲空间的管理。(1)空闲表法空闲表法属于连续分配方式,它与内存的动态分配方式雷同,它为每个文件分配一块连续的存储空间,即系统也为外存上的所有空闲区建立一张空闲表,每个空闲区对应于一个空闲表项,其中包括表项序号、该空闲区的第一个盘块号、该区的空闲盘块数等信息。(2)位示图法位示图是利用二进制的一位来表示磁盘中一个盘块的使用情况。当其值为“0”时,表示对应的盘块空闲;为“1”时,表示已分

3、配。磁盘上所有的盘块都有一个二进制位与之对应,这样,由所有盘块所对应的位构成一个集合,成为位示图。3.功能 本设计是模拟实现外存空闲空间的管理,用户可以选择空闲表法或者位示图法来进行文件的分配与回收并查看各个文件的存储状态。4.数据结构和算法设计 4.1数据结构(1)空闲表法数据结构 分区表目结构定义struct Partition。(2)位示图法数据结构空闲区结构体定义free_link、申请空间作业结构体定义office、相关位示图操作的结构体定义work。4.2算法设计(1)空闲表法算法设计 空闲盘区的分配采用首次适应算法。在系统为某新创建的文件分配空闲盘块时,先顺序地检索空闲表的各表项

4、,直至找到第一个其大小能满足要求的空闲区,再将该盘区分配给用户,同时修改空闲表。系统在对用户所释放的存储空间进行回收时,要考虑回收区是否与空闲表中插入点的前区和后区相邻接,对相邻接者予以合并。(2)位示图法算法设计盘块分配时,顺序扫描位示图,从中找出一个或一组其值为“0”的二进制位,转换成与之对应的盘块号,然后修改位示图。盘块回收时,将回收盘块的盘块号转换成位示图的行号和列号,修改位示图。5.流程图 5.1空闲表法流程图(1)盘块分配流程图,如图5-1所示。 否 否 是 是否 是(2)盘块回收流程图,如图5-2所示。 否 是 否 否 是 是5-2 空闲表法盘块回收流程图5.2位示图法流程图(1

5、)盘块分配流程图,如图5-3所示。 否 是 否 是 否 是图5-3 位示图法盘块分配流程图(2)盘块回收流程图,如图5-4所示。 是 是否 是 否 是 否否 图5-4 位示图法盘块回收流程图6.开发环境Windows系统,运行环境:Visual C+ 6.0。7.结果分析(1)运行首页面。(2)输入1,选择位示图法。(3)选择1,分配文件。 (4)输入文件名1和块数11。 (5)选择1,继续分配文件,并输入文件名2和块数22。 (6)输入1,继续分配文件,并输入文件名3和块数33。 (7)选择2,回收文件,并输入回收文件2。 (8)返回首页面,选择2,用空闲表法。 (9)输入256。 (10)

6、输入1,选择分配,并且输入文件名1和大小11,查看分配状态。 (11)输入1,继续分配,并且输入文件名2和大小22,查看分配状态。 (12)输入2,选择回收,并且输入回收文件名2,查看分配状态。 8.课程设计总结 通过做这个实验,我明白了在做实验前,一定要将课本上的知识吃透,因为这是做实验的基础,否则,在老师讲解时就会听不懂,在编程序时就会思维混乱,摸不清头绪。做实验时,一定要亲力亲为,务必要将每个步骤,每个细节弄清楚,弄明白。实验后,还要复习,思考,这样印象才深刻,记得才牢固。实验的过程中我们必须要弄懂实验的原理。在这里我深深体会到哲学上理论对实践的指导作用:弄懂实验原理,而且体会到了实验的

7、操作能力是靠自己亲自动手,亲自开动脑筋,亲自去请教别人才能得到提高的。在这里,感谢荆老师对我的指导和启迪,感谢同学们对我的帮助,这次实验虽然做的不算特别完美,不过我已经很努力了。这次实验对我对这部分知识的理解和编程能力有了很大的提高,以后我会更加努力的去做每一件事。参考文献【1】汤晓丹、梁红兵计算机操作系统(第三版)西安:西安电子科技大学出版社,2007年:引用231页233页。【2】揣锦华C+程序设计语言(第一版)西安:西安电子科技大学出版社,2003年。 【3】张坤、姜立秋操作系统实验教程(第一版)北京:清华大学出版社,2008年。附录:#include #include #include

8、#include#include#includeint MAX_SEGMENT=10;/最大碎片值struct Partition /分区表目 int Par_Size; /分区大小 int Par_No; /分区序号或者名字 int Addr; /分区地址 int IsUse; /分区使用情况,0表示空闲,1表示使用 Partition *pri; /前向指针 Partition *next; /后向指针;Partition * Int()/函数,返回Partition类型指针 /初始化空闲分区表 Partition *list,*H,*H1; list=(struct Partition

9、*)malloc(sizeof(struct Partition); list-next=NULL; H=list; if(!list) printf(n错误,初始化分配失败!程序结束); exit(1); H1=(struct Partition *)malloc(sizeof(struct Partition); printf(请预先输入分区总大小(以盘块为单位):); scanf(%d,&H1-Par_Size); H1-Addr=0; H1-Par_No=0; H1-IsUse=0; H1-pri=H; H1-next=NULL; H-next=H1;/list-H1 return l

10、ist;Partition * InitFP() /初始化已分配分区表 Partition *FP,*F,*H; int i; FP=(struct Partition *)malloc(sizeof(struct Partition); FP-next=NULL; H=FP; for(i=0;iPar_Size=0; F-Addr=0; F-Par_No=0; F-IsUse=0; F-next=NULL; H-next=F; F-pri=H; H=H-next; return FP;Partition * New_Process( Partition *list, Partition *F

11、P) /为新的进程分配资源 Partition *H,*P,*H1; int Size,Name,L; H=list; H1=FP-next; H=H-next; printf(请输入新文件的名称和大小(整数):); scanf(%d %d,&Name,&Size); while(H) if(!H) /表目已查完,无法分配 printf(n已无空闲盘区,本次无法分配!); return list; else if(H-IsUse=0) /空表目 /if(H-Par_Size=Size) /大小满足,空闲分区大小要分配的大小 if(H-Par_Size=Size) /大小满足, bool tem

12、p=false; if(H-Par_Size-Size)=MAX_SEGMENT)/空闲分区大小-要分配的大小Par_Size;/分配的大小为整个盘块 temp=true;/会产生碎片 /其他情况就分配大小为请求大小,不会产生碎片, L=H-Addr;/保存空闲分地址 if(temp) printf(该次分配会产生碎片,将整个盘区大小%d分配出去!,Size); else printf(该次分配不会产生碎片); break; H=H-next; /否则,继续往下查找 if(H) if(H-Par_SizeSize) /大小满足,空闲分区大小要分配的大小 P=(struct Partition

13、*)malloc(sizeof(struct Partition); /分配新的表目,处理一条数据,分配一次内存 P-IsUse=1; P-Addr=L;/指向空闲分区地址 P-next=H; /修改指针 H-pri-next=P; P-pri=H-pri; H-pri=P; P-Par_Size=Size;/分配大小为要请求分配的大小 P-Par_No=Name;/名称 H-Par_Size-=Size; /修改空闲分区,H所指区块大小减Size H-Addr+=Size;/H所指区块地址加Size else H-IsUse=1; /大小相等的,把当前表项设置空表目 while(H1) if

14、(H1-IsUse=0) H1-Par_No=Name; H1-Par_Size=Size; H1-Addr=L;/保存已分配地址 H1-IsUse=1;/在已分配表中设置为已分配 break; H1=H1-next; else printf(所申请资源已大过系统所拥有的,请重新输入!n); return list;Partition *Reclaim( Partition *list, Partition *FP) /结束作业,资源回收,No为作业名,回收内存 Partition * H1,*H2,*H3,*HF;/H1为释放区,H2为后分区,H3为前分区 int No; /作业名 H1=l

15、ist; HF=FP;/可有可无? H1=H1-next; HF=FP-next; printf(请输入您想结束的文件名:); scanf(%D,&No); while(HF)/对已分配表进行操作 if(HF-Par_No=No) HF-IsUse=0; /标志为空表目 break;/这时保存着HF所指分区的信息 HF=HF-next; if(!HF) /如果找不到该作业,则提示出错 printf(所输入的文件名称不正确,请重新输入!); else while(H1)/对空闲表进行操作 if(H1-Par_No=No) H1-IsUse=0; /标志为空表目 printf(回收成功); bre

16、ak; H1=H1-next; H2=H1-next;/后分区 H3=H1-pri;/前分区 if(H2&H2-IsUse=0) /后接分区为空闲 if(H2-next=NULL) /判断后接分区是否为尾结点 H1-Par_Size+=H2-Par_Size; /把H2合并到H1 H1-next=NULL; free(H2); printf(已回收%d大小盘区,H1-Par_Size); else /后分区不为空闲,表示已经被使用 H1-Par_Size+=H2-Par_Size; H1-next=H2-next; H2-next-pri=H1; free(H2); printf(已回收%d大

17、小盘区,H1-Par_Size); if(H3&H3-IsUse=0) /前分区为空闲分区,则合并去前分区 H3-Par_Size+=H1-Par_Size; H3-next=H1-next; if(H1-next!=NULL) /若H1为尾结点 H1-next-pri=H3; free(H1); printf(已回收%d大小盘区,H1-Par_Size); return list;void Print( Partition *list, Partition *FP) /输出已分配分区和空闲分区 Partition *H1,*H2; H1=list-next; H2=FP; H2=H2-nex

18、t; printf(*已分配盘块表*n); printf(分区序号 大小 始址 状态n); while(H2) printf(%d %d %d,H2-Par_No,H2-Par_Size,H2-Addr); if(H2-IsUse=1) printf( 已分配n); else printf( 空表目n); H2=H2-next; printf(*n); printf(*总的空闲盘块表*n); printf(分区序号 大小 始址 状态n); while(H1) printf(%d %d %d,H1-Par_No,H1-Par_Size,H1-Addr); if(H1-IsUse=1) print

19、f( 已分配n); else printf( 空表目n); H1=H1-next; printf(*n);void Main_Print( Partition *list, Partition *FP) /主入口函数,进行菜单选择 int op; while(1) printf(n 主菜单n); printf(1.分配n); printf(2.回收n); printf(3.查看分配状态n); printf(4.退出系统n); printf(n请选择:); scanf(%d,&op); switch(op) /根据输入,选择分支方向 case 1: New_Process(list,FP); b

20、reak; case 2: Reclaim(list,FP); break; case 3: Print(list,FP); break; case 4: break; default: printf(n选择错误,请重新选择!); break; if(op=4) break; /退出循环 /*下面是位示图方法*/int WST256;/*空闲区结构体定义start_location 空闲区对象变量的开始位置free_number 空闲区块数目next 指向下一个空闲区的指针*/typedef struct node int start_location; int free_number; st

21、ruct node*next; free_link;/*申请空间作业结构体定义office 作业名begin_location 作业申请空间后的开始位置office_number 作业申请空间区的数目next 指向下一个申请空闲区的作业指针*/typedef struct link char office20; int begin_location; int office_number; struct link *next; office;/*相关位示图操作的结构体定义p 空间区链表指针q 作业链表指针*/typedef struct free_link *p; office *q;work;

22、/*程序菜单*/void menu() printf( 文件的存取和回收n); printf( 1-分配文件n); printf( 2-回收文件n); printf( 3-退出nt); printf( 请输入选项: );/*置空位示图进行初始化*/void zero_wst() int i; for(i=0;i256;i+) WSTi=0;/*位示图输出显示将初始化或者申请或者回收后的位示图进行显示*/void print_wst(int WST256) int i,j=0; printf(%3s, ); for(i=0;i16;i+) printf(%3d,i); printf(n); printf(%3d,0); for(i=0;iq; q=q-next; if(q!=NULL) printf(已有文件:n); while(q!=NULL) printf(t%s:%d-%dn,q-office,q-begin_location,q-begin_location+q-office_number-1); q=q-next; /*位示图操作的初始化包括:空闲区链表的初始化 作业链表的初始化*

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1