操作系统课程设计(小型的操作系统)

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

操作系统课程设计报告题目:一个小型的操作系统班级:计122(杏)学号:1213023075姓名:贾苏日期:2014/06/231.实验平台(1)软件平台:开发系统平台:Windows7(64)Microsoftvisualc++6.0测试系统平台:Windows7(64)(2)硬件平台:cpu:AMDA6-3420APU内存:4GB硬盘:500G2.所需实现的功能及相应的阐述:(1)进程调度管理为了贴切现实中的os,采用RR(轮转调度算法),且不提供用户显式的选择调度算法,即对用户是透明的。现实中的处理器主频为1Ghz~3Ghz,选取中间点为1.5Ghz,得时间片大小为0.7ns,为方便计算*10,则时间片大小定为7ns。假设进程之间的调度和切换不耗费cpu时间。(2)死锁的检测与处理检测当然采用的是银行家算法处理:让用户选择kill一个进程,释放他所占有的所有资源。(3)虚拟分页调度管理虚拟分页:给出的是逻辑值访问磁盘将那个数据块放入到内存中内存中的地址采用一定的算法相对应于磁盘的地址。特规定访存采用的是按字节寻址内存的大小128KB外存的大小1MB即整个系统可以提供1MB的逻辑地址空间供进程进行访问(在地址总线足够扫描内存的情况下)。虚拟地址映射采用:直接映射法规定的8kB为一个页面,故内存有16个页面,外存有128个页面。如果产生了内存已满,便会产生缺页中断,淘汰采用FIFO算法,利用一个队列来做。部分内外存的对应表00,128,2*128+0.......11,129,2*128+1.......22,130,2*128+2.......16127,128+16,2*128+16.........(4)I/O中断处理设中断来自两个方面:1.DMA输送开始和结束时的中断设定一个宏定义为DMA一次传输的数据量的大小-DmaNum假定为10kb每次DMA开始:耗费1nscpu时间进行中断处理DMA结束:耗费2nscpu时间进行中断处理由操作系统课程知,DMA传输数据时不需要CPU的干预。2.随机的中断发生外部随机中断,cpu无条件的立即响应,并执行中断处理程序,同样的假设中断处理程序的调度和切换不耗费cpu时间。(5)内存地址越界或内存不足进程访问内存时超过了进程所要的最大值,此时发生中断,已达到内存保护的功能。内存不足时即为当前的动态地址重定位寄存器中的值+进程所需的内存大小超过了内存的上限,此时进行内存紧凑,同时修改被移动的进程中的各个有关参数。3.总体设计4.程序所需的数据结构及其抽象过程开始进程信息查看死锁检测与解除内存空间查看查看cpu运行外存空间查看开始运行查看运行情况内存管理先定义本次操作系统外设的资源,假设有A类资源10个,B类资源5个,C类资源6个-NeedRescourse;作业中的各个进程都需要一个代号-ProcessName,各个进程到来的时间不同,故需要记录一下-ArriveTime,每个进程所需要的cpu时间是不够的-NeedCpuTime,每个进程所需的内存空间大小是不一样的-NeedMem。各个进程中的任务是不同的故需要预先设定本进程中所要执行的操作类型-OpKind,如果是计算型的直接给出所需要的cpu时间即可,如果是I/O型的还需要给出所传输的数据量的大小-NeedTranDataNum,在此可以给OpKind做一个union型的结构。多道程序程序在运行的过程中需要对进程所需内存的地址进行动态地址重定位,故在系统之中需要设置一个动态地址重定位寄存器,其中的内容是下次进程可以使用的内存始址-DynReg。抽象结果:structProcess{charProcessName[10];//进程的名字intArriveTime;//ns级别intNeedCpuTime;//此进程所需要的时间intNeedMem;//所需要的cpu时间FlagForOpOpKind;//用于指示是何种操作intNeedTranDataNum;//给IO用的数据块intOpCpus;//计算类型的操作所需的cpu时间intNeedRescourse[3];//需要资源的数目NULL代表不需要使用Process*next;};5.详细设计1.进程信息查看依次遍历全部的链表,并将它们的信息依次打印出来。实现函数名:voidShowProcessInfo()2.死锁的检测和解除假定本系统中的各个所需资源均是独占型资源,在进程运行的过程中不再释放,故只需要遍历链表将各个进程中所需的资源统计出来,只要不大于系统中预设的即可,一旦进程所需的资源大于系统中的最大量,给予用户选择kill一进程,已达到释放资源的目的。死锁检测函数:voidDeedLock()voidDeedLock_LookNeedRescourse()死锁解除函数:voidDeedLock_KillProcess()3.内存空间查看查看各个进程所占用的内存的空间,借助于DynReg这个全局变量实行内存空间的动态重定位。实现函数:voidLookMem()4.查看CPU运行以CPU的角度,查看作业的运行情况,实现函数:voidLookCpu()voidLookCpu_ShowRunningProcess()5.外存空间查看外存空间是用户的工作区间,故只要遍历整个进程链表,统计出所有进程占有的全部空间即可。实现函数:voidLookDiskMem()6.查看运行查看系统运行中各个资源的使用情况:实现函数:voidShowRunningProcess()voidShowRunningProcess_CalculateCpuNeed(int*,int)7.内存管理缺页调度算法:FIFO(借助于循环队列实现)实现函数:voidMemToDiskMem()6.程序运行和调试1.打开程序的初始界面:按系统提示输入进程数,及其相关的各个参数2.输入完成后的主界面:用户可以按下相关的选择键实施有关的各个操作。3.按下1查看各个进程的信息可以看到刚刚输入的各个进程的有关信息4.按下25.按下3查看运行时CPU的使用情况可见此时系统是安全的。系统出差提示按下1显示当前各个进程所需的资源然后kill进程1后在查看一下作业中的进程,发现被kill的进程没有的,实现了此功能。6.按下4查看内存的使用情况7.按下5查看外存空间8.按下6查看运行情况9.按下7产看内存使用情况(1)没有产生缺页(2)产生缺页10.按下9退出此系统7.遇到的问题(1)自己编写映射表相当的困难,一度想改用Java语言,在于对C++语言的了解不够。(2)出错处理没有完全做完,做的不够精细,很多地方直接结束(3)对用户输入的数据做的类型检查不够充分(4)deletejob时总是出现系统错误,后debug发现,由于对象之中存在不为空的指针,导致出错,故再释放指针所占空间后系统正常运行。8.源代码#includeiostream#includecstring#includewindows.h#includecstdlib#includeCirQueue.h//循环队列的头文件usingnamespacestd;#defineMAXMEM128//定义本次操作系统的最大内存容量#defineMAXDISKMEM1024//定义本次操作系统的最大外存容量#defineYE10//定义本次操作系统的分页大小并以此实现虚拟存储intUsedMAXMEM=0;intUsedMAXDISKMEM=0;//定义进程可能用到的外部资源#defineA10#defineB5#defineC6//cpu#defineRR7//定义时间片大小为7ns#defineBEFOREDMA1//DMA之前所需的cpu时间#defineAFTERDMA2//DMA之后所需的cpu时间#defineONEDMANUM10//DMA一次最多传送10kb的数据enumFlagForOp{IO,Calculate,others};intDynReg=0;//定义用于描述动态地址重定位寄存器的全局变量structProcess{charProcessName[10];//进程的名字intArriveTime;//ns级别intNeedCpuTime;//此进程所需要的时间intNeedMem;//所需要的cpu时间FlagForOpOpKind;//用于指示是何种操作intNeedTranDataNum;//给IO用的数据块intOpCpus;//计算类型的操作所需的cpu时间//假设others不需要其他的各个操作。intNeedRescourse[3];//需要资源的数目NULL代表不需要使用0——a....Process*next;};classJOB{Process*p;Process*head;Process*head1;//建立一个备用的链表//Process*wait,*runing;//wait为等待链表running是正在运行的进程public:JOB(){head1=p=head=NULL;//初始化为空coutPleasewaiting.TheSystemisinitial.endl;Sleep(2000);//暂停一秒maybeSleep()coutSystemisalready.Nowyoushouldenterinformationofyoujob.endl;intn;coutenteryourjob'sprocessnum.endl;cinn;while(n){p=newProcess();coutpleaseenterthenameofprocess.endl;cinp-ProcessName;coutpleaseenterthearrivetimeofprocess.endl;cinp-ArriveTime;coutpleaseentertheNeedCpuTimeofprocess.endl;cinp-NeedCpuTime;coutpleaseentertheNeedMemofprocess.endl;cinp-NeedMem;while(p-NeedMem128){coutThisSystemcan'tnotacceptyourjob!Maybeyourjobistoolarge!Pleaseenteranum128endl;cinp-NeedMem;}coutpleaseentertheoperationofprocess.0toTranDiskNum,1tocpuendl;intnn;cinnn;if(nn==0){coutpleaseentertheNeedTranDataNum.endl;cinp-NeedTranDataNum;p-OpKind=IO;}else{coutpleaseentertheOpCpus.endl;cinp-OpCpus;p-OpKind=Calculate;}coutPLeaseentertheA,BorCyouneedendl;for(inti=0;i3;i++){cinp-NeedRescourse[i];}p-next=NULL;//尾结点为空表示一个节点的完成下面进行插入链表的工作head=SortLinkTable(head,p);n--;}//whileLinkCopy();//将本次整理好的链表依次赋值赋给备用链表Provide_Same_Process_Name();//检查重名现象}voidProvide_Same_Process_Name();voidVisitLinkTable();Process*SortLinkTable(Process*,Process*);voidBeginRunning();voidShowPr

1 / 25
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功