欢迎来到冰点文库! | 帮助中心 分享价值,成长自我!
冰点文库
全部分类
  • 临时分类>
  • IT计算机>
  • 经管营销>
  • 医药卫生>
  • 自然科学>
  • 农林牧渔>
  • 人文社科>
  • 工程科技>
  • PPT模板>
  • 求职职场>
  • 解决方案>
  • 总结汇报>
  • ImageVerifierCode 换一换
    首页 冰点文库 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

    完整word版操作系统一个小型操作系统的设计与实现课程设计.docx

    • 资源ID:11352325       资源大小:574.93KB        全文页数:53页
    • 资源格式: DOCX        下载积分:3金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录
    二维码
    微信扫一扫登录
    下载资源需要3金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    完整word版操作系统一个小型操作系统的设计与实现课程设计.docx

    1、完整word版操作系统一个小型操作系统的设计与实现课程设计南通大学计算机科学与技术学院专业:学生姓名:学号:时间:操作系统课程设计报告操作系统模拟算法课程设计报告设计要求将本学期三次的实验集成实现:A.处理机管理;B.存储器管理;C.虚拟存储器的缺页调度。设计流程图主流程图 A.处理机调度 1)先来先服务FCFSNY 先来先服务算法流程2)时间片轮转法时间片轮转算法流程图B.存储器管理(可变式分区管理) 1)首次适应法 分配流程图首次适应算法回收流程图 2)最佳适应法回收内存流程C.虚拟存储器的缺页调度 1)先进先出FIFOFIFO淘汰算法流程 2)LRULRU淘汰算法流程实现原理主界面设计一

    2、个框架分别去链接处理机管理、存储器管理和缺页调度相关的程序。A.处理机调度 1)先来先服务FCFS(1)任务先来先服务的调度算法实现处理机调度。(2)要求1.实现对FCFS算法的模拟实现2.计算出该算法的平均作业周转时间、平均带权作业周转时间。(3)原理按作业到达CPU时间先后顺序进行非剥夺式调度,先到达CPU的作业先被执行。(4)数据结构 struct task_struct char name; /*进程名称*/ int number; /*进程编号*/ float come_time; /*到达时间*/ float run_begin_time; /*开始运行时间*/ float run

    3、_time; /*运行时间*/ float run_end_time; /*运行结束时间*/ int priority; /*优先级*/ int order; /*运行次序*/ int run_flag; /*调度标志*/ tasksMAX;int fcfs()/*先来先服务算法*/进程名链接指针到达时间估计运行时间进程状态进程控制块结构(5)实现方法建立一个链表按照到达CPU的时间从小到大排列,只需从第一个作业(头结点)依次调度到最后一个作业(尾结点)。(6)运行界面测试数据:作业名到达时间运行时间A028B09C03执行FCFS算法如下: 2)时间片轮转法(1)任务只对进程的运行模拟,将其

    4、运行时间加一,判断要求运行时间与已运行时间是否相等,若相等则表示进程结束,进程退出调度,释放资源。(2)要求1.实现对RR算法的模拟实现2.显示执行完一个时间片的结果。(3)原理时间片轮转算法中,系统将所有的就程序按先来先服务的原则排成一个队列,每次调度时,把CPU分配给队首进程,并令其执行一个时间片。当执行的时间片用完时,调度程序停止该进程的执行,并将它送往就绪队列的末尾;然后,再把处理机分配给就绪队列中新的队首进程,同时也让它执行一个时间片。(4)数据结构 temp-state=R; /初始状态每个进程均为运行态 temp-allocation=0; /初始时进程均不占用cpu num+=

    5、temp-need_time; /用num来限制循环的次数(5)实现方法处理器调度总是选择标志单元指示的进程运行。执行:已运行时间+1来模拟进程的一次运行,表示进程已经运行过一个单位的时间。当一个进程被选中运行时,必须设置该进程可以运行的时间片值,以及恢复进程的现场,让它占有处理器运行,直到出现等待事件或运行满一个时间片 进程运行一次后,应把该进程的进程控制块中的指针值送到标志单元,以指示下一个轮到运行的进程。同时,应判断该进程的要求运行时间与已运行时间,若该进程的要求运行时间 已运行时间,则表示它尚未执行结束,应待到下一轮时再运行。若该进程的要求运行时间=已运行时间,则表示它已经执行结束,应

    6、指导它的状态修改成“结束”且退出队列。此时,应把该进程的进程控制块中的指针值送到前面一个进程的指针位置。进程名链接指针到达时间估计运行时间进程状态进程控制块结构(6)运行界面测试数据:作业号执行时间/sA1B2C1执行时间片轮转算法RR如下:B.存储器管理(可变式分区管理) 1)首次适应法(1)任务通过采用首次适应算法实现内存的分配与回收,并可以查看和显示当前内存现状。(2)要求1.实现对FF算法的模拟实现2.输入要进行分配内存的进程ID和相应所需内存大小,回收内存时输入已运行的进程ID。(3)原理FF算法要求空闲链已地址递增的次序连接。分配内存时,从链首开始顺序查找,直到找到第一个满足要求的

    7、空间并分配给进程,把分配后余下的空间仍然留在链表中。若从链首至链尾都不满足要求,则分配失败。该算法倾向于优先使用低地址的空间。(4)数据结构int const MEMO=256;/初始化常类型MEMO,用MEMO表示内存大小(常类型的变量或对象的值是不能被更新的)struct FreeMemory int ID;int StartAdd;int Size; bool State;/定义state 为布尔型变量,其值只有 真 (TRUE) 和假 (FALSE) FreeMemory* Next;FreeMemory* AllocTable=new FreeMemory;/建立全局管理表用于内与回

    8、收FreeMemory* PtrforCycleFit=AllocTable;/为循环首次适应定义的指针,此指针用于指向当前查找的起始地址;/初始化内存函数void MemoryInit(FreeMemory* &tempAdd) tempAdd-ID=0;/初始化当前进程为空 tempAdd-Size=MEMO;/初始化可分配空间为内存大小 tempAdd-StartAdd=0;/初始化起始地址为0 tempAdd-State=false;/ 初始化状态为未分配 tempAdd-Next=NULL;/初始化下一个进程也为空/反馈内存现态void DispMemory() FreeMemory

    9、* temp=AllocTable;/全局管理表反映内存状态 cout系统总内存: MEMONext) cout进程ID:ID 大小:Size 起始地址:StartAdd 是否已分配:Stateendl;/ 输出内存的各个变量(5)实现方法可变式分区管理是指在处理作业过程中建立分区,使分区大小正好适合作业的需要,并且分区的个数是可以调整的。当需要装入一个作业时,根据作业需要的贮存量,查看是否有足够的空闲空间,若有,则按需求量分割一部分给作业;若无,则作业等待。随着作业的装入、完成,主存空间被分割成许多大大小小的分区。有的分区被分配作业占用,有的分区空闲。在空闲区表中,按空闲区首地址从低到高进行

    10、登记。当一个作业执行完成时,作业所占用的分区应归还给系统。在归还时,要考虑相邻空间区合并问题。作业的释放区与空闲区的邻接分以下4种情况考虑:A、释放区下邻空闲区;B、释放区上邻空闲区;C、释放区上下都与空闲区邻接;D、释放区上邻空闲区不邻接。(6)运行界面系统总内存为256时,分别为进程1、2、3分配大小为64、128、64的内存。执行首次适应算法分配内存如下:若回收进程2的内存,执行结果如下: 2)最佳适应法(1)任务通过采用最佳适应算法实现内存的分配与回收,并可以查看和显示当前内存现状。(2)要求1.实现对BF算法的模拟实现2.输入要进行分配内存的进程ID和相应所需内存大小,回收内存时输入

    11、需要回收的内存块。(3)原理最佳适应算法扫描整个未分配表或链表,从空闲区中挑选一个能满足用户进程要求的最小分区进行分配。此算法保证不会分割一个更大的区域,使得装入大作业的要求容易得到满足,同时,通常把空闲区按长度递增顺序排列,查找时总是从最小的一个空闲区开始,直至找到满足要求的分区为止,这时,最佳适应分配算法等同于首次适应算法。此算法的主存利用率好,所找出的分区如果最好满足要求则是最合适的。(4)数据结构int const MEMO=256;/初始化常类型MEMO,用MEMO表示内存大小(常类型的变量或对象的值是不能被更新的)struct FreeMemory int ID;int Start

    12、Add;int Size; bool State;/定义state 为布尔型变量,其值只有 真 (TRUE) 和假 (FALSE) FreeMemory* Next;bool Alloc_BestFit(int id,int TrySize)/查找满足此条件的 x1=TrySizeNext) /*回收操作,回收过程中,要用到三个指针,上一个Last,当前temp,下一个temp-next 当temp指向表头或表尾时需要特殊考虑*/当要退出工作时,就要回收/此退出的工作由执行函数调用void EndJob(int id) Free_Memory(id);(5)实现方法空闲区设置为双向链表,其双向

    13、链的分区格式为:0(状态位)分区大小(N+2)向前指针大小为N的已分配区或空闲区0(状态位)分区大小(N+2)向后指针(6)运行界面测试数据如下:进程123456所需内存253445121310执行最佳适应算法为其分配内存如下:若回收进程4,执行结果如下:C.虚拟存储器的缺页调度 1)先进先出FIFO(1)任务采用先进先出FIFO算法实现分页管理的缺页调度,并输出每次调入调出的页号和运行结果。(2)要求1.实现对FIFO算法的模拟实现2.输出每次执行的结果。(3)原理基于程序总是按线性顺序来访问物理空间这一假设,总是淘汰最先调入主存的页面,即淘汰在主存中驻留时间最长的页面,认为驻留时间最长的页

    14、不再使用的可能性较大。(4)数据结构void FIFO() int length; int fifo100=0; int pageLength; int fifoPage100=0; int i,j; cout *先进先出算法*endl; pageLength=3; length=9; for(i=1;i=length;i+) int flag=0; for(j=1;j=pageLength;j+) if(fifoi=fifoPagej) flag=1; j=pageLength+1; else if(fifoPagej=0) fifoPagej=fifoi; j=pageLength+1;

    15、flag=1; if(flag=1) else cout 淘汰fifoPage1endl; for(j=1;j=pageLength;j+) fifoPagej=fifoPagej+1; fifoPagepageLength=fifoi; (5)实现方法当采用先进先出算法时,用一个数组构成先进先出队列,数组中各个元素为进程已在主存的页号,其队列头指针初始化为0.假设分配给每个进程的内存块数固定。当队列满需淘汰时,淘汰最先进入主存的一页。若该页修改过,还有存入磁盘。然后要把当前访问的页装入该块,并修改页表和存储分块表的对应标志。(6)运行界面测试数据:页表长度:9;页框长度:3;页面请求数列:4

    16、,4,3,5,1,1,2,3,2执行先进先出FIFO算法结果如下: 2)LRU(1)任务采用先进先出LRU算法实现分页管理的缺页调度,并输出每次调入调出的页号和运行结果。(2)要求1.实现对LRU算法的模拟实现2.输出每次执行的结果。(3)原理最近最少使用页面替换算法淘汰的页面是在最近一段时间内最久未被访问的那一页,它是基于程序局部性原理来考虑的,认为那些刚被使用过的页面可能还有立即被使用,而那些在较长时间内未被使用的页面可能不会立即使用。在分页虚拟存储系统中,当硬件发出缺页中断后转操作系统处理缺页中断。如果主存中已无空闲块,可采用LRU算法进行缺页处理。(4)数据结构void LRU() i

    17、nt length; int lru100=0; int pageLength; int lruPage100=0; int i,j; cout *最近最少使用LRU算法*endl; pageLength=3; length=9; for(i=1;i=length;i+) int flag=0; for(j=1;j0;cc-) lruPagecc=lruPagecc-1; lruPage1=lrui; flag=1; j=pageLength+1; else if(lruPagej=0) for(int vv=j;vv0;vv-) lruPagevv=lruPagevv-1; lruPage1

    18、=lrui; j=pageLength+1; flag=1; if(flag=1) else cout 淘汰lruPagepageLength0;j-) lruPagej=lruPagej-1; lruPage1=lrui; (5)实现方法当采用LRU算法时,用一个数组构成堆栈,堆栈中各个元素为进程已在主存的页号,为了进行页面置换,可设置一个栈指针,初始化为0.假定分配给每个进程的内存块数固定不变。当队列满需淘汰时,操作系统选择栈底元素淘汰,其他元素向下移一个位置,将新调入页放栈指针指示的栈顶。当访问的页在栈中时,还应调整页从当前位置到栈顶。(6)运行界面测试数据:页表长度:9;页框长度:3;

    19、页面请求数列:2,3,5,1,5,5,4,4,3执行最近最少使用LRU算法结果如下:总结与体会通过本次课程设计让我对于图形界面设计有了一定的思路和看法,同时我对先来先服务、时间片轮转、首次适应算法、最佳适应算法、先进先出和最近最少使用算法有了更详尽的认识。在编程的过程中发现会用到大量的指针,用指针来操作大量的数据比较方便,但最后应该记得释放资源。从这次实验中我发现我对于c+掌握也有所不足,程序经过了多次修改才得以完善,在以后应该注重编程方面的训练。此外我还更深入的理解了各个进程调度算法,及实现过程。在编写程序时查询了很多资料,间接提高了我的搜索能力。在此次课程设计过程中,对进程的相关知识有了一

    20、定的加深。特别是对进程的进程控制块的存在和价值有了更进一步的认识。在编写程序的过程之中,对进程自身信息的设计和管理以及调度的算法都有助于对书本知识的理解和掌握。特别是设计先来先服务调度算法和时间片轮转调度算法的时候,对进程的调度算法有了更好的深入理解。对进程管理中的等待队列,就绪队列,时间片等概念有了更深刻的印象。在设计此模拟操作系统的课设中,也加深了对c+知识的把握。解决了一些以往在编程中遇到了困难。通过此次的课程设计,不仅提高了对操作系统的认知,也在同时提高了编程的能力,加强了实践。另外,我觉得此次课程设计虽然主要问题是在编程上,但是经过不断的去调试,还是成功的调试了出来。但是这几个程序用

    21、了多天的时间进行分析和修改,虽然出现了不少问题,但收获颇多!源代码:#include#include#include using namespace std;int fcfsoutput(); /*调度结果输出*/int fcfsinput(); /进程参数的初始化void kaishi();#define MAX 10struct node /建立链表来存放进程数据 char name5; /进程名称 int need_time; /所需要的时间 int allocation; /占用cpu的情况 char state; /目前的状态 R为运行,E为运行完毕 node *next; /链表的

    22、尾结点 ;struct task_struct char name; /*进程名称*/ int number; /*进程编号*/ float come_time; /*到达时间*/ float run_begin_time; /*开始运行时间*/ float run_time; /*运行时间*/ float run_end_time; /*运行结束时间*/ int priority; /*优先级*/ int order; /*运行次序*/ int run_flag; /*调度标志*/ tasksMAX;int counter; /*实际进程个数*/int fcfs()/*先来先服务算法*/fc

    23、fsinput();float time_temp=0;int i;int number_schedul;time_temp=e_time;for(i=0;icounter;i+) tasksi.run_begin_time=time_temp; tasksi.run_end_time=tasksi.run_begin_time+tasksi.run_time; tasksi.run_flag=1; time_temp=tasksi.run_end_time; number_schedul=i; tasksnumber_schedul.order=i+1;fcfsoutput();return

    24、 0;int fcfsinput() task_struct tt; int i,j; /初始化进程数 counter=3; /初始化每个到达系统的时间为5、7、8 e_time=rand()%9; e_time=rand()%9; e_time=rand()%9; for(i=1;i3;i+) for(j=0;jtasksj+e_time) tt=tasksj; tasksj=tasksj+1; tasksj+1=tt; /初始化每个进程估计运行的时间 tasks0.run_time=28; tasks1.run_time=9; tasks2.run_time=3; /初始化每个进程的名字

    25、tasks0.name=A; tasks1.name=B; tasks2.name=C; cout*先来先服务算法*endlendl;for(i=0;icounter;i+) tasksi.run_begin_time=0; tasksi.run_end_time=0; tasksi.order=0; tasksi.run_flag=0;return 0;int fcfsoutput() /*调度结果输出*/int i;float turn_round_time=0,f1,w=0;cout作业名 到达时间 运行时间 开始时间 停止时间 运行次序 周转时间endl;for(i=0;icounter;i+) f1=tasksi.run_end_time-e_time; turn_round_time+=f1; w+=(f1/tasksi.run_time); cout tasksi.namet e_timet tasksi.run_timet tasksi.run_begin_timet tasksi.run_end_timettasksi.ordertf1tendl;cout平均周转时间:turn_round_time/counterendl;cout平均带权周转时间:w/counterendl;cout ; return 0;/*-*/int rr()int n=


    注意事项

    本文(完整word版操作系统一个小型操作系统的设计与实现课程设计.docx)为本站会员主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

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

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


    收起
    展开