《2022年操作系统课程设计可变分区存储管理 .docx》由会员分享,可在线阅读,更多相关《2022年操作系统课程设计可变分区存储管理 .docx(25页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选学习资料 - - - - - - - - - 工程技术学院电气信息系操作系统 课程设计报告名师归纳总结 - - - - - - -第 1 页,共 14 页精选学习资料 - - - - - - - - - 专 业:模拟实现可变分区储备治理一、设计目地在娴熟把握运算机分区储备治理方式地原理地基础上,利用 C 程序设计语言在 windows 操作系统下模拟实现操作系统地可变分区储备治理地功能 ,一方面加 深对原理地懂得 ,另一方面提高依据已有原理通过编程解决实际问题地才能 ,为进 行系统软件开发和针对实际问题提出高效地软件解决方案打下基础 . 二、各功能模块分析实现11)设计合理地数据结构来描述
2、储备空间:对于未安排出去地部分 ,用闲暇分区链表来描述 . struct freeList int startAddress; /* 分区起始地址 */ int size; /* 分区大小 */ struct freeList *next; /* 分区链表指针 */ 2)对于已经安排出去地部分,由装入内存地作业占据 . struct usedList int startAddress; /* 分区起始地址 */ int jobID ; /* 分区中存放作业 ID */ struct usedList *next; /* 分区链表指针 */ 3)将作业组织成链表 . struct jobList
3、 int id; /* 作业 ID */ 名师归纳总结 - - - - - - -第 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:将闲暇分区按大小从大到小排序 ,从头找到大小合适地分区 .
5、3)First fit :将闲暇分区按起始地址大小从小到大排序 , 4) Last fit :将闲暇分区按起始地址大小从大到小排序 , 由此 ,可将闲暇分区先做合适地排序后用对应地适应算法给作业安排存储空间 .排序函数order(bySize 为零就按分区大小排序,否就按分区起始地址;inc 为零从小到大排序 ,否就从大到小排序;通过 void orderstruct freeList *empty,int bySize,int inc struct freeList *p,*q,*temp ;int startAddress,size;empty指针返回结果) . forp = *empty
6、 - next ;p;p = p - next /* 按 bySize 和 inc 两个参数查找合适地节点 ,用 temp 指向它 */ fortemp = q = p;q;q = q - next switchbySize 名师归纳总结 - - - - - - -第 3 页,共 14 页精选学习资料 - - - - - - - - - case 0 : switchinc case 0:ifq-size size temp = q;break;default:ifq-size temp-size temp = q;break; break;default: switchinc case 0:
7、ifq-startAddress startAddress temp = q;break;default:ifq-startAddress temp-startAddress temp = q;break; break; /* 交换节点地成员值 */ iftemp .= p startAddress = p-startAddress;size = p-size;p-startAddress = temp-startAddress;p-size = temp-size;名师归纳总结 - - - - - - -第 4 页,共 14 页精选学习资料 - - - - - - - - - temp-st
8、artAddress = startAddress;temp-size = size; 3实现分区储备治理地内存回收算法:void insertFreeNodestruct freeList *empty,int startAddress,int size 插入回收地空节点分区 ,处理回收分区与闲暇分区地四种邻接关系 . struct freeList *p,*q,*r ;forp = *empty ;p - next;p = p - next ; /* 处理链表尾部地邻接情 况 */ ifp = *empty | p - startAddress + p - size next = p -
9、next; /* 插入独立地闲暇节点 */ p - next = r;return ; ifp - startAddress + p - size = startAddress /* 与尾部上邻 */ p - size += size; /* 合 并 尾 部 节 点 */ return ; q = *empty - next; /* 处理链表首节点地邻接情形 */ ifstartAddress + size = q - startAddress /* 与首节点下邻 */ 名师归纳总结 - - - - - - -第 5 页,共 14 页精选学习资料 - - - - - - - - - q - s
10、tartAddress = startAddress; /* 合并首节点 */ q - size += size; else ifstartAddress + size startAddress /* 与首节点不相邻 */ makeFreeNode&r,startAddress,size;r - next = *empty - next;*empty - next = r ; else /* 处理链表中间地邻接情形 */ whileq - next & q - startAddress next; ifp - startAddress + p - size = startAddress & q
11、 - startAddress = startAddress + size /* 上下邻 ,合并节点 */ p - size += size + q - size;p - next = q - next;freeq; /* 删除余外节点 */ else ifp - startAddress + p - size = startAddress & q - startAddress .= startAddress + size /*上邻 ,增加节点地 大小 */ p - size += size; else ifp - startAddress + p - size .= startAddress
12、 & 名师归纳总结 - - - - - - -第 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当碎片产生时 ,进行碎片地拼接 . void mov
13、eFragmentstruct jobList *jobs,struct freeList *empty,struct usedList *used int size,status;struct usedList *p;int address = memoryStartAddress; /* 全局变量 ,初始化时安排储备空间始 址*/ if*empty-next = NULL /* 闲暇分区链表为空 ,提示并返回 */ printfnThe memory was used out at all.nMay be you should finish some jobs first orpress
14、any key to try again .;getch;return; 名师归纳总结 - - - - - - -第 7 页,共 14 页精选学习资料 - - - - - - - - - forp = *used - next ;p;p = p- next /* 循环地修改占用分区地始址 */ p - startAddress = address;getJobInfojobs,p - jobID,&size,&status; /* 由作业 ID 获得作业 大小 */ address += size; *empty-next-startAddress = address;/* 修改闲暇分区地首节
15、点始址、大小 */ *empty - next - size = memorySize - address - memoryStartAddress;*empty - next - next = NULL ; /* 删除首节点后地全部节点 */ 5闲暇分区队列显示: int showFreeListstruct freeList *empty 6作业占用链表显示: int showUsedListstruct jobList *jobs,struct usedList *used 从头到尾显示 used链,同时通过其中地作业ID 在 jobs 中查对应地大小 . 7从键盘输入作业到 D 盘地
16、JOB 文件: void inputJobvoid 8从 JOB 文件中读出作业并创建作业链表:int makeJobListstruct jobList *jobs 9显示作业链表: int showJobListstruct jobList *jobs 10.更新作业链表中作业地状态:int updateJobFilestruct jobList *jobs 11.依据作业链表更新 JOB 文件: int updateJobFilestruct jobList *jobs 12.为作业安排储备空间、状态必需为 size 0:int allocatestruct freeList *empt
17、y,int 13.终止一个作业号为 id 地作业 ,释放储备空间 (由 *startAddress返回空间地起始地址): int finishJobstruct usedList *used,int id,int *startAddress 14.插入释放地空间到used 链表中 (作业号为id,startAddress 由函数13 返回):void insertUsedNodestruct usedList *used,int id,int startAddress 名师归纳总结 - - - - - - -第 8 页,共 14 页精选学习资料 - - - - - - - - - 15.猎取作
18、业地信息: void getJobInfostruct jobList *jobs,int id,int *size,int *status 16.初始化储备空间起始地址、大小:void iniMemoryvoid 17.挑选适应算法: char selectFitMethodvoid 18.依据参数 startAddress、size创建闲暇节点 ,由 empty指针返回:void makeFreeNodestruct freeList *empty,int startAddress,int size 19.以要求地方式打开文件:void openFileFILE *fp,char *fil
19、ename,char *mode 20.显现严峻错误时显示信息并终止程序;void errorMessagevoid 三、总体界面与程序流程分析DynamicZonalMemoryManagement 其 中 1 、 Initializiation . 按 顺 序 利 用 了openFile 、 iniMemory 、makeFreeNode、 inputJob(挑选利用 C 盘 JOB 文件时供应作业信息)、makeJobList、allocate、insertUsedNode(挑选利用C 盘 JOB 文件时先将状态为 1 地作业放到储备空间中 ,以复原上次地模拟试验 ,或使本次模拟时不出错
20、)selectFitMethod等自编函数 . 2、Put job into memoryallocate memory按次序利用了 showJobList(选(自动为如上作业安排储备后状态地变化)手动逐个为作业安排储备空间时)、openFile 、 order 、 allocate 、errorMessage 、 insertUsedNode 、updateJobStatusupdateJobFile函数名师归纳总结 - - - - - - -第 9 页,共 14 页精选学习资料 - - - - - - - - - 3、Finish jobreuse memory按次序利用了 openFil
21、e、showUsedList、getJobInfo、insertFreeNode、 updateJobStatus、updateJobFile、errorMessage等自编函数 . (完成部分作业后作业)按 顺 序 利 用 了openFile 、4 、 Show current free listshowFreeList函数 .(如下图为当前闲暇分区)5 、 Show current memory used by jobs 按 顺 序 利 用 了openFile、showUsedList函数 .(如下图为当前作业占用地分区)6 、 Move fragment together 按 顺 序 利
22、 用 了 openFile 、moveFragment函数 . 整理7、Exit 按次序利用了 openFile、exit0函数 . 名师归纳总结 - - - - - - -第 10 页,共 14 页精选学习资料 - - - - - - - - - 四、主程序流程图创建分区头节点删除上次地结果文件键盘输入字符 step 字符 step为? step= 2 step= 1InitializiationPut job into memory step= 6 step= 3step= 4Move fragment togetherstep= 7Finish job step= 5Show curre
23、nt memory used by jobsExit Show current free list五、结果分析与总结程序中创建地两个文件1)Best fit算法验证:名师归纳总结 如下图安排大小为50 地 8 号作业 ,恰好占用大小为50 地闲暇而非大小为240第 11 页,共 14 页- - - - - - -精选学习资料 - - - - - - - - - 地.2)Worst fit 算法验证:如下图安排大小为 50 地 8 号作业 ,占用大小为 100 闲暇而非大小为 70 地.3)Firstfit 算法验证:名师归纳总结 如下图安排大小为50 地 8 号作业 ,占用起始地址为110 闲
24、暇而非 350 地.第 12 页,共 14 页- - - - - - -精选学习资料 - - - - - - - - - 4)Last fit 算法验证:如下图安排大小为 50 地 8 号作业 ,占用 任何输入而正常终止 .很遗憾地是起始地址为 350 闲暇而非 110 地. 由于时间问题 ,没有把这个模拟程总结: 通过这次课程设计我练习 序写成动画形式 ,仍可以加几句代了用 C 语言写系统软件 ,对 OS 中 码后实现动态地增加作业 .可变分区储备治理有了更深刻地明白 .在写程序地时候也遇到了一些困难 .比如在设计数据结构时特别徘徊 ,总想找一个很合适地 .但是,后来才知道 ,关键要多尝试 ,而空想是没有用地 .最终我证明了自己地设计地合理性 .仍有为了使程序更健壮 ,我尝试着将程序中地输入部分全部改为字符(串).胜利地避免了接受整型数据时输入字符后引起地错误 ,使程序能接受名师归纳总结 - - - - - - -第 13 页,共 14 页精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 14 页,共 14 页