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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

本文(可变分区存储管理课程设计报告.docx)为本站会员(b****2)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

可变分区存储管理课程设计报告.docx

1、可变分区存储管理课程设计报告武汉工业学院专 业: 模拟实现可变分区存储管理一、设计目的在熟练掌握计算机分区存储管理方式的原理的基础上,利用C程序设计语言在windows操作系统下模拟实现操作系统的可变分区存储管理的功能,一方面加深对原理的理解,另一方面提高根据已有原理通过编程解决实际问题的能力,为进行系统软件开发和针对实际问题提出高效的软件解决方案打下基础。二、各功能模块分析实现1 设计合理的数据结构来描述存储空间:1) 对于未分配出去的部分,用空闲分区链表来描述。struct freeList int startAddress; /* 分区起始地址 */int size; /* 分区大小 *

2、/struct freeList *next; /* 分区链表指针 */2) 对于已经分配出去的部分,由装入内存的作业占据。struct usedList int startAddress; /* 分区起始地址 */int jobID; /* 分区中存放作业ID */struct usedList *next; /* 分区链表指针 */3) 将作业组织成链表。struct jobListint id; /* 作业ID */int size; /* 作业大小(需要的存储空间大小) */int status; /* 作业状态 0 : new job ,1 : in the memory , 2 :

3、 finished . */struct jobList *next; /* 作业链表指针 */以上将存储空间分为空闲可占用两部分,在usedlist中设jobID而不设size,可以在不增加空间复杂度(与freelist相比)的同时更方便的实现可变分区存储管理(从后面的一些函数的实现上可以得出这个结论)。尽管设置joblist增加了空间复杂度,但它的存在,使得该程序可以方便的直接利用C盘中的Job.txt文件。该文件可以认为是一个和其他进程共享的资源。通过这个文件,其他进程写入数据供读取。这中思想在操作系统设计中体现的很多。2 实现分区存储管理的内存分配功能,选择适应算法(首次适应算法,最佳

4、适 应算法,最后适应算法,最坏适应算法)。基本原理分析: 1) Best fit :将空闲分区按大小从小到大排序,从头找到大小合适的分区。2) Worst fit:将空闲分区按大小从大到小排序,从头找到大小合适的分区。3) First fit :将空闲分区按起始地址大小从小到大排序,4) Last fit :将空闲分区按起始地址大小从大到小排序,由此,可将空闲分区先做合适的排序后用对应的适应算法给作业分配存储空间。排序函数 order(bySize为零则按分区大小排序,否则按分区起始地址;inc为零从小到大排序,否则从大到小排序;通过empty指针返回结果)。void order(struct

5、 freeList *empty,int bySize,int inc)struct freeList *p,*q,*temp; int startAddress,size; for(p = (*empty) - next;p;p = p - next) /* 按bySize和inc两个参数寻找合适的节点,用temp指向它 */ for(temp = q = p;q;q = q - next) switch(bySize) case 0 : switch(inc) case 0:if(q-size size) temp = q;break; default:if(q-size temp-siz

6、e) temp = q;break; break; default: switch(inc) case 0:if(q-startAddress startAddress) temp = q;break; default:if(q-startAddress temp-startAddress) temp = q;break; break; /* 交换节点的成员值 */ if(temp != p) startAddress = p-startAddress; size = p-size; p-startAddress = temp-startAddress; p-size = temp-size;

7、 temp-startAddress = startAddress; temp-size = size; 3 实现分区存储管理的内存回收算法:void insertFreeNode(struct freeList *empty,int startAddress,int size)插入回收的空节点分区,处理回收分区与空闲分区的四种邻接关系。 struct freeList *p,*q,*r; for(p = *empty;p - next;p = p - next) ; /* 处理链表尾部的邻接情况 */ if(p = *empty | p - startAddress + p - size n

8、ext = p - next; /* 插入独立的空闲节点 */ p - next = r; return ; if(p - startAddress + p - size = startAddress) /* 与尾部上邻 */ p - size += size; /* 合并尾部节点 */ return ; q = (*empty) - next; /* 处理链表首节点的邻接情况 */ if(startAddress + size = q - startAddress) /* 与首节点下邻 */ q - startAddress = startAddress; /* 合并首节点 */ q - s

9、ize += size; else if(startAddress + size startAddress) /* 与首节点不相邻 */ makeFreeNode(&r,startAddress,size); r - next = (*empty) - next; (*empty) - next = r; else /* 处理链表中间的邻接情况 */ while(q - next & q - startAddress next; if(p - startAddress + p - size = startAddress & q - startAddress = startAddress + s

10、ize) /* 上下邻,合并节点 */ p - size += size + q - size; p - next = q - next; free(q); /* 删除多余节点 */ else if(p - startAddress + p - size = startAddress & q - startAddress != startAddress + size) /*上邻,增加节点的大小*/ p - size += size; else if(p - startAddress + p - size != startAddress & q - startAddress = startAdd

11、ress + size) /* 下邻 */ q - startAddress = startAddress; /* 修改节点起始地址 */ q - size += size; /* 修改节点的大小 */ else /* 上下不相邻 */ makeFreeNode(&r,startAddress,size); r - next = p - next; p - next = r; 4 当碎片产生时,进行碎片的拼接。void moveFragment(struct jobList *jobs,struct freeList *empty,struct usedList *used) int size

12、,status; struct usedList *p; int address = memoryStartAddress; /*全局变量,初始化时分配存储空间始址*/ if(*empty)-next = NULL) /* 空闲分区链表为空,提示并返回 */ printf(nThe memory was used out at all.nMay be you should finish some jobs first or press any key to try again !); getch(); return; for(p = (*used) - next;p;p = p- next)

13、/* 循环的修改占用分区的始址 */ p - startAddress = address; getJobInfo(jobs,p - jobID,&size,&status); /* 由作业ID获得作业大小 */ address += size; (*empty)-next-startAddress = address;/*修改空闲分区的首节点始址、大小*/ (*empty) - next - size = memorySize - (address - memoryStartAddress); (*empty) - next - next = NULL; /* 删除首节点后的所有节点 */5

14、 空闲分区队列显示:int showFreeList(struct freeList *empty)6 作业占用链表显示:int showUsedList(struct jobList *jobs,struct usedList *used) 从头到尾显示used链,同时通过其中的作业ID在jobs中查对应的大小。7 从键盘输入作业到D盘的JOB文件:void inputJob(void)8 从JOB文件中读出作业并创建作业链表:int makeJobList(struct jobList *jobs)9 显示作业链表:int showJobList(struct jobList *jobs)

15、 10.更新作业链表中作业的状态: int updateJobFile(struct jobList *jobs)11.根据作业链表更新JOB文件: int updateJobFile(struct jobList *jobs) 12.为作业分配存储空间、状态必须为0:int allocate(struct freeList *empty,int size) 13.结束一个作业号为id的作业,释放存储空间(由*startAddress返回空间的起始地址):int finishJob(struct usedList *used,int id,int *startAddress)14.插入释放的空

16、间到used链表中(作业号为id,startAddress由函数13返回):void insertUsedNode(struct usedList *used,int id,int startAddress)15.获取作业的信息: void getJobInfo(struct jobList *jobs,int id,int *size,int *status)16.初始化存储空间起始地址、大小:void iniMemory(void)17.选择适应算法:char selectFitMethod(void)18.根据参数startAddress、size创建空闲节点,由empty指针返回:vo

17、id makeFreeNode(struct freeList *empty,int startAddress,int size)19.以要求的方式打开文件:void openFile(FILE *fp,char *filename,char *mode)20.出现严重错误时显示信息并结束程序;void errorMessage(void)三、总体界面与程序流程分析Dynamic Zonal Memory Management其中1、Initializiation.按顺序利用了openFile()、iniMemory()、makeFreeNode()、inputJob()(选择利用C盘JOB文

18、件时提供作业信息)、makeJobList()、allocate()、insertUsedNode()(选择利用C盘JOB文件时先将状态为1的作业放到存储空间中,以恢复上次的模拟实验,或使本次模拟时不出错)selectFitMethod()等自编函数。 2、Put job into memory(allocate memory)按顺序利用了showJobList()(选手动逐个为作业分配存储空间时)、openFile()、order()、allocate()、errorMessage()、insertUsedNode()、updateJobStatus()updateJobFile()函数(自

19、动为如上作业分配存储后状态的变化) 3、Finish job(reuse memory)按顺序利用了openFile()、showUsedList()、getJobInfo()、insert FreeNode()、updateJobStatus()、updateJobFile()、errorMessage()等自编函数。 (完成部分作业后作业)4、Show current free list 按顺序利用了openFile()、showFreeList()函数。 (如下图为当前空闲分区)5、Show current memory used by jobs按顺序利用了openFile()、show

20、UsedList()函数。 (如下图为当前作业占用的分区)6、Move fragment together按顺序利用了openFile()、moveFragment()函数。 整理 7、Exit按顺序利用了openFile()、exit(0)函数。四、主程序流程图 step=1 step=2 step=6 step=3step=4 step=5 step=7五、结果分析与总结程序中创建的两个文件1)Best fit算法验证: 如下图分配大小为50的8号作业,恰好占用大小为50的空闲而非大小为240的。2)Worst fit算法验证:如下图分配大小为50的8号作业,占用大小为100空闲而非大小为

21、70的。3)First fit算法验证:如下图分配大小为50的8号作业,占用起始地址为110空闲而非350的。4)Last fit算法验证:如下图分配大小为50的8号作业,占用起始地址为350空闲而非110的。总结:通过这次课程设计我练习了用C语言写系统软件,对OS中可变分区存储管理有了更深刻的了解。在写程序的时候也遇到了一些困难。比如在设计数据结构时特别犹豫,总想找一个很合适的。但是,后来才知道,关键要多尝试,而空想是没有用的。最后我证实了自己的设计的合理性。还有为了使程序更健壮,我尝试着将程序中的输入部分全部改为字符(串)。成功的避免了接受整型数据时输入字符后引起的错误,使程序能接受任何输入而正常结束。很遗憾的是因为时间问题,没有把这个模拟程序写成动画形式,还可以加几句代码后实现动态的增加作业。

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2