CPU-Scheduling-代码.docx
实验报告实验要求设计一个按优先权调度算法实现处理机调度和动态内存分配的程序。本次实验采用优先权与时间片方法相结合的调度,即根据优先级选出的进程会运行时间片个时间。粗略设计一、设计O粗略要点a.显示正在运行的进程b.显示就绪队列(可以载入六道进程)c.显示挂起队列,以及手动挂起按钮(或根据某种算法实现的自动挂起);显示解挂按钮(或根据某种算法实现自动解挂)d.显示手动添加进程的按钮,点击进入手动添加进程界面:显示随机添加进程按钮e.显示等待队列(预备队列),新添加的进程会首先进入这个队列f.显示程序运行以及暂停的按钮二、逻辑分析以及类设计O逻辑分析a.根据进程的状态,所有新生成的进程都应该进入等待队列b.根据位于等待队列的先后顺序,选取前几位到就绪队列,直到就绪队列已满c.如果没有空闲的内存空间,怎表示就绪队列已满d.正在运行的进程结束时,必须马上重新根据调度算法选取下一个进程进行运行e.要求运行时间过长超过预期的进程应该被挂起,进入挂起队列f.解挂的进程应该进入等待队列,并位于排头g.等待中的进程应该提升其优先级,运行过的进程应该适当降低优先级,完成变动应该重新根据调度算法进行排序或选取运行h.所有活动的进程(包括挂起的)不能同名以便区分O粗略类设计常量接口用于保存程序中表示各种重要的常量表示进程状态O所有新生成进程状态默认值1 就绪表示可以参与调度算法的筛选2 等待不能参与筛选3 正在运行的进程4 被挂起的进程5 终止的进程要求运行时间已经为注:等待队列中即为后备进程有关优先级最低优先级6 最高优先级最大道数时间片默认数要求时间的最大期望模拟每次运行耗费时间饥饿上界目前设置为与最大优先级相同有关内存.初始位置未进入内存/单要求内存最大值.内存大小由于掌握进程所有的信息,本次实验将其视作进程本身处理- 进程名,为生成的顺序,- 进程要求运行的时间- 优先级这是有一定范围限制的- 进程状态默认为见- 处于内存中的位置,初始为- 占内存的空间()这是构造函数各种各样的和函数不论有没有必要,都写起来O当为时,返回()将逻辑意义上的状态转化为描述()返回的描述信息这是的工厂类,用于生成各式各样的记录的个数(,)这个函数会对参数进行各种限制,直到输入值满足要求才会生成返回一个0()随机生成要求数目的链表UU(C)将链表转化为二维数组,方便界面列表显示O这里返回已经生成的的个数- 内存,大小为0使用号内存()使用到号内存()释放号内存()释放到号内存()如果号内存被使用则返回()如果到号内存含有被使用的段则返回- >()内存自检返PI可用段,每一个返回数组对象中,川;这是总控制类,用于各种的调度与控制我觉得此处应该使用线程,但是自己还不熟这方面的知识- <>所有新生成的由这个队列接受,大小不限- <>这里储存的是就绪的进程,最大容量为,且一直维持满态O这里是挂起的进程,从这里取出的进程会放到等待队列排头,遵循先进先出原则- 正在运行的进程- 内存组件- <1>内存空闲空间辅助变量,用于标记当前进入内存的所分配的位置各种方法()插入等待队列,成功返回,下同O插到等待队列队头()插入就绪队列()插入挂起队列()经过调度算法调度,状态为的进程会运行,直到完结一个时间或者要求运行时间为;时间为时会不归还就绪队列(此方法还有待考虑),否则将归还就绪队列()根据优先级的调度算法,调度处于就绪队列的进程,返回优先级高的进程,不改变位于就绪队列的顺序;并把选取的从就绪队列中剔除,下同()根据所要求时间的调度算法,返回要求时间短的进程,不改变位于就绪队列的顺序()根据处于就绪队列的顺序的调度算法,返回排头的进程,同时位置进入就绪队列末尾位置()用于填满就绪队列,保持其道数为()获取等待队列的()将中断正在运行的进程,改变状态,将其挂起,从就绪队列中剔除,添入挂起队列()释放被挂起的O每次运行增长O优先级最低进程的优先级,直到(饥饿上界)()对于每次运行的进程,会降低它的优先级O()返回正在运行的信息()针对运行后状态的恢复<>()获取最近的内存空闲状况(O)初始化等待队列O判断是否有符合要求的空闲空间界面类负责对的管控与显示,并将输入信息传到类,输出类传出的信息直接将程序组装在里O显示正在等待的()显示就绪的()显示正在运行的a.这里是程序运行任务详细设计及有关代码一、组件类所要求的时间优先级状态)O()O()()7)O()()()()(f)()f)O(9()7)O(9O(<)这种设计是有问题的,如果不调用状态就不会变为)O(IVIO(:(”错误的状态”)',"',;()(”已建立工厂”);)(,)这里用来判断参数是否合法!(>)(><)(<)(U成功生成了一个");(,);)("非法的请求时间!,)("非法的优先级!");(“要求时间不能非正整数!");*这是随机生成的个数*返回一个链表<>()O<>();0;(;<)0;0;(C);*返回已经生成的的数目()*(O)();(;<(););()0;()0;()0;0();()0;()0;()(;*被使用过则返回()(;*使用主存()()0;*释放主存();*使用从开始的空间为的主存(,)(;<)0;*释放从开始的空间为的主存(,)(;<)0;*检查从开始的是否被使用或含有被使用的对象*可用的则返回1(,)(;<)()2 *自动检索主存,返向可用空间段*每一个返回数组对象中,口口;*<>()<><>();(;<)()(;<)()/),;0;)()0;(,);(,);(,);<><>();0;(;<();)(“第”组空闲空间"""()""()二、逻辑控制类类<><><>/辅助私有量<><>();()();<>();0();0();0;)*这个方法写来暂时做测试用()O(前期自我组装测试方法(O)(»)<>()<>()<>()()()0;0;("成功插入等待队列”);插入等待队列)()0;()插到等待队列(U成功插入等待队列队头”);()(这个方法有问题,关于正在运行的进程回复到就绪队列时内存重复分配针对从返同的归队()0;0;("成功插入就绪队列。插入就绪队列针对从队列来的设计的方法()0;(0)(0;(),();)0;("成功插入就绪队列”)插入就绪队列/()("插入失败,可能找不到空闲空间”);(”没有正在等待的进程。");()0;(:)()<);(;<();)(U第”组空闲空间”"("()""()()(OO)()(O;释放内存空间,这是对挂起进程的内存回收()0;("成功插入挂起队列。插入挂起队列)O(0;0;(0);(;<0();)0;)();0;<>()0;()按照优先级的调度算法O;(:)()<(»/)O;*暂时废弃(0)(0;(:)()>()0;(<)0;(""0"!");()0;(>)0;(''"0"!");()(每次运行后,根据进程的存活状态进行处理(00)();0;O;O;(O);(»(),()对死亡进程的内存PI收0;0;0;(对挂起的处理(),();0;(0);这是测试代码(0)();();()(0;0;三、界面类类内含运行任务类附,完成界面效果图O;O;O;O(*);O(*);O;(O(*),O(*);O;(O(*),O(*),O(*);O;(,'u,O(*)O(*),O(*);(O)O;(O)(O(*)O(*()O(*),O(*),O(*();)O;(O);(O);(O);(,);O;O;)()(”错误操作,任务未建立”);()(0;0;0;()(0)0;0;)()(00(0;);*用来同一格式的制表"%"%",UWVVU(“u),()*(),(),()OO;O;(,);O;(,);O;(,);O;(hWWWWWm);("”),,);3);(",);(uWWWWWu);O;O;("WWWWW'*);0;(“随机生成“);(uWWWWWn);0;0;(,),",);("n);0;(,);(,);O;(uu);O;O;("n);(u);O;O;(,);O;O;(,);(u);O;O;(u);O;O;O;(,'n);(,);,);,,);(,);(,);O;(,);(,);O;O;(,'",fr);O;(,);(,n);(");O;("W");(',");O;(O);O;(""),);(,);O;(O),);O;);(u);3);O;(,"u,);O;(O),);(,);O;);(u);O;(,);(u);O;O;(O),);O;O;O;(,);O;,O;O;(),”上面是内存概览”,);0;(,);("");(,);O;O;O;()3);O;(“用你鼠标去探索吧,干吧得!”)0;0(,);0;(3,);0;0;0(,);0(,);()(,);()(,);0(,);(0);(0);(0);(0);(0);0(00);(00)(0),);)()O(OO)(O),);)()(“哈,问题被找到了“);0(00)(0),);)()(“哈,问题被找到了”);0(000000)(“!“);(0)(,!u);(0)(',!,);)(0)(00);(“显示正常”);(“太强劲,缓存延迟”);(O);(>)(O);O;)()(”输入的数据不符合要求”);)0;0;(0)0;0;(0;)(O)在初始化就绪数组的同时开始运行0;(0;0;0;0;0;0;)()(“运行时错误!”);()()00)()0每次数据变动都要巾:新、"小保持就绪队列充满的状态0;()(0;0;0;0;0;0;()(“运行时错误!”);)运行结束时清空显示0;0;0;O(O;)O(/O;)O(9)实验结果一、截图二、结论经过测试,所有预先设计的功能均可正常运行!