《2022年操作系统课程设计可变分区存储管理》由会员分享,可在线阅读,更多相关《2022年操作系统课程设计可变分区存储管理(14页珍藏版)》请在金锄头文库上搜索。
1、工程技术学院电气信息系操作系统 课程设计报告精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 1 页,共 14 页专业:模拟实现可变分区存储管理一、设计目地在熟练掌握计算机分区存储管理方式地原理地基础上,利用 C 程序设计语言在 windows 操作系统下模拟实现操作系统地可变分区存储管理地功能,一方面加深对原理地理解 ,另一方面提高根据已有原理通过编程解决实际问题地能力,为进行系统软件开发和针对实际问题提出高效地软件解决方案打下基础. 二、各功能模块分析实现1设计合理地数据结构来描述存储空间:1)对于未分配出去地部分 ,用空闲分区链表来描述 . s
2、truct freeList int startAddress 。 /* 分区起始地址 */ int size。 /* 分区大小 */ struct freeList *next。 /* 分区链表指针 */ 2)对于已经分配出去地部分,由装入内存地作业占据 . struct usedList int startAddress 。 /* 分区起始地址 */ int jobID 。 /* 分区中存放作业ID */ struct usedList *next。 /* 分区链表指针 */ 3)将作业组织成链表 . struct jobList int id。 /* 作业 ID */ 精选学习资料 -
3、- - - - - - - - 名师归纳总结 - - - - - - -第 2 页,共 14 页int size。 /* 作业大小(需要地存储空间大小) */ int status。 /* 作业状态 0 : new job ,1 : in the memory , 2 : finished .*/ struct jobList *next。 /* 作业链表指针 */ 以上将存储空间分为空闲可占用两部分,在 usedlist中设 jobID 而不设size,可以在不增加空间复杂度(与freelist 相比)地同时更方便地实现可变分区存储管理(从后面地一些函数地实现上可以得出这个结论). 尽管设置
4、 joblist 增加了空间复杂度 ,但它地存在 ,使得该程序可以方便地直接利用 C 盘中地 Job.txt文件.该文件可以认为是一个和其他进程共享地资源 .通过这个文件 ,其他进程写入数据供读取.这中思想在操作系统设计中体现地很多 . 2实现分区存储管理地内存分配功能,选择适应算法(首次适应算法,最佳适应算法 ,最后适应算法 ,最坏适应算法) . 基本原理分析:1)Best fit :将空闲分区按大小从小到大排序,从头找到大小合适地分区 . 2)Worst fit:将空闲分区按大小从大到小排序,从头找到大小合适地分区. 3)First fit :将空闲分区按起始地址大小从小到大排序,4) L
5、ast fit :将空闲分区按起始地址大小从大到小排序,由此 ,可将空闲分区先做合适地排序后用对应地适应算法给作业分配存储空间 .排序函数order(bySize 为零则按分区大小排序,否则按分区起始地址;inc 为零从小到大排序 ,否则从大到小排序;通过empty指针返回结果) . void order(struct freeList *empty,int bySize,int inc) struct freeList *p,*q,*temp 。int startAddress,size 。for(p = (*empty) - next 。p。p = p - next) /* 按 bySiz
6、e和 inc 两个参数寻找合适地节点,用 temp指向它 */ for(temp = q = p。q。q = q - next) switch(bySize) 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 3 页,共 14 页 case 0 : switch(inc) case 0:if(q-size size) temp = q。break。default:if(q-size temp-size) temp = q。break。 break。default: switch(inc) case 0:if(q-startAddress startA
7、ddress) 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 。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 4 页,共 14 页temp-startAddress = s
8、tartAddress 。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 next = p - next。 /*
9、插入独立地空闲节点 */ p - next = r。return 。 if(p - startAddress + p - size = startAddress) /* 与尾部上邻 */ p - size += size。 /* 合 并 尾 部 节点 */ return 。 q = (*empty) - next。 /* 处理链表首节点地邻接情况 */ if(startAddress + size = q - startAddress) /* 与首节点下邻 */ 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 5 页,共 14 页q - start
10、Address = startAddress 。 /* 合并首节点 */ q - size += 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 = startAddr
11、ess & q - startAddress = startAddress + size) /* 上下邻 ,合并节点 */ 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 != s
12、tartAddress & 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 6 页,共 14 页q - startAddress = startAddress + size) /* 下邻 */ q - startAddress = startAddress 。 /* 修改节点起始地址 */ q - size += size。 /* 修改节点地大小 */ else /* 上下不相邻 */ makeFreeNode(&r,startAddress,size) 。r - next = p - next。p - next = r。 4当碎片产生时 ,进行碎
13、片地拼接 . void moveFragment(struct jobList *jobs,struct freeList *empty,struct usedList *used) int size,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
14、 jobs first orpress any key to try again !)。getch()。return。 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 7 页,共 14 页for(p = (*used) - next。p。p = p- next) /* 循环地修改占用分区地始址*/ p - startAddress = address 。getJobInfo(jobs,p - jobID,&size,&status)。 /* 由作业 ID 获得作业大小 */ address += size 。 (*empty)-next-start
15、Address = address 。/*修改空闲分区地首节点始址、大小*/ (*empty) - next - size = memorySize - (address - memoryStartAddress) 。(*empty) - next - next = NULL 。 /* 删除首节点后地所有节点 */ 5空闲分区队列显示: int showFreeList(struct freeList *empty) 6作业占用链表显示:int showUsedList(struct jobList *jobs,struct usedList *used) 从头到尾显示 used链,同时通过其
16、中地作业ID 在 jobs中查对应地大小 . 7从键盘输入作业到D 盘地 JOB 文件: void inputJob(void) 8从 JOB 文件中读出作业并创建作业链表:int makeJobList(struct jobList *jobs) 9显示作业链表: int showJobList(struct jobList *jobs) 10.更新作业链表中作业地状态:int updateJobFile(struct jobList *jobs) 11.根据作业链表更新JOB 文件:int updateJobFile(struct jobList *jobs) 12.为作业分配存储空间、状
17、态必须为0:int allocate(struct freeList *empty,int size) 13.结束一个作业号为id 地作业 ,释放存储空间 (由*startAddress返回空间地起始地址): int finishJob(struct usedList *used,int id,int *startAddress) 14.插入释放地空间到used 链表中 (作业号为id,startAddress 由函数13 返回):void insertUsedNode(struct usedList *used,int id,int startAddress) 精选学习资料 - - - -
18、- - - - - 名师归纳总结 - - - - - - -第 8 页,共 14 页15.获取作业地信息: void getJobInfo(struct jobList *jobs,int id,int *size,int *status) 16.初始化存储空间起始地址、大小:void iniMemory(void) 17.选择适应算法: char selectFitMethod(void) 18.根据参数 startAddress 、size创建空闲节点 ,由 empty指针返回:void makeFreeNode(struct freeList *empty,int startAddres
19、s,int size) 19.以要求地方式打开文件:void openFile(FILE *fp,char *filename,char *mode) 20.出现严重错误时显示信息并结束程序;void errorMessage(void) 三、总体界面与程序流程分析DynamicZonalMemoryManagement 其 中1 、 Initializiation. 按 顺 序 利 用 了openFile() 、 iniMemory() 、makeFreeNode() 、inputJob()(选择利用C 盘 JOB 文件时提供作业信息)、makeJobList()、allocate()、in
20、sertUsedNode()(选择利用C 盘 JOB 文件时先将状态为 1 地作业放到存储空间中,以恢复上次地模拟实验 ,或使本次模拟时不出错)selectFitMethod()等自编函数 . 2、Put job into memory(allocate memory)按顺序利用了showJobList()(选手动逐个为作业分配存储空间时)、openFile() 、 order() 、 allocate() 、errorMessage()、 insertUsedNode()、updateJobStatus()updateJobFile() 函数(自动为如上作业分配存储后状态地变化)精选学习资料
21、 - - - - - - - - - 名师归纳总结 - - - - - - -第 9 页,共 14 页3、Finish job(reuse memory)按顺序利用了openFile()、showUsedList()、getJobInfo()、insertFreeNode()、 updateJobStatus() 、updateJobFile()、errorMessage() 等自编函数. (完成部分作业后作业)4 、 Show current free list按 顺 序 利 用 了openFile() 、showFreeList()函数.(如下图为当前空闲分区)5、 Show curren
22、t memory used by jobs按 顺 序 利 用 了openFile()、showUsedList()函数.(如下图为当前作业占用地分区)6 、 Move fragment together按 顺 序 利 用 了openFile()、moveFragment() 函数. 整理7、Exit按顺序利用了 openFile()、exit(0)函数. 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 10 页,共 14 页四、主程序流程图 step= 1 step= 2 step= 6 step= 3 step= 4 step= 5step= 7
23、五、结果分析与总结程序中创建地两个文件1)Best fit算法验证:如下图分配大小为50 地8 号作业,恰好占用大小为50 地空闲而非大小为240创建分区头节点删除上次地结果文件键盘输入字符step 字符 step为?ExitPut job into memoryFinish jobShow current free listShow current memory used by jobsMove fragment togetherInitializiation精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 11 页,共 14 页地.2)Worst
24、 fit 算法验证:如下图分配大小为50 地 8 号作业 ,占用大小为 100 空闲而非大小为70 地.3)Firstfit 算法验证:如下图分配大小为50地 8号作业 ,占用起始地址为110空闲而非350 地.精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 12 页,共 14 页4)Last fit 算法验证:如下图分配大小为50 地 8 号作业 ,占用起始地址为350 空闲而非110地. 总结:通过这次课程设计我练习了用 C 语言写系统软件 ,对 OS 中可变分区存储管理有了更深刻地了解 .在写程序地时候也遇到了一些困难 .比如在设计数据结构时
25、特别犹豫 ,总想找一个很合适地 .但是,后来才知道 ,关键要多尝试 ,而空想是没有用地 .最后我证实了自己地设计地合理性 .还有为了使程序更健壮 ,我尝试着将程序中地输入部分全部改为字符(串).成功地避免了接受整型数据时输入字符后引起地错误 ,使程序能接受任何输入而正常结束.很遗憾地是因为时间问题 ,没有把这个模拟程序写成动画形式,还可以加几句代码后实现动态地增加作业.精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 13 页,共 14 页精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 14 页,共 14 页