河南微网站建设公司,金山郑州阳网站建设,衡阳网站建设怎样收费,企信网企业信用信息系统黑龙江一.题目要求描述 本设计的目的是加深对进程概念及进程管理各部分内容的理解#xff1b;熟悉进程管理中主要数据结构的设计及进程调度算法、进程控制机构、同步机构及通讯机构的实施。要求设计一个允许n个进程并发运行的进程管理模拟系统。 该系统包括有简单的进程控制、同步与…一.题目要求描述 本设计的目的是加深对进程概念及进程管理各部分内容的理解熟悉进程管理中主要数据结构的设计及进程调度算法、进程控制机构、同步机构及通讯机构的实施。要求设计一个允许n个进程并发运行的进程管理模拟系统。 该系统包括有简单的进程控制、同步与通讯机构其进程调度算法可任意选择。每个进程用一个PCB表示其内容根据具体情况设置。各进程之间有一定的同步关系可选。系统在运行过程中应能显示或打印各进程的状态及有关参数的变化情况以便观察诸进程的运行过程及系统的管理过程。
二、程序流程图及源代码注释
2.2 程序流程图 1.系统流程图 2.先来先服务FCFS算法 3.短进程优先算法 4.静态优先级调度算法 5.时间片轮转调度算法 2.2 核心函数源代码注释
1.先来先服务FCFS算法
void run()
{//*************************进入先来先服务算法FCFS*************************////模拟一个系统时间系统时间自动增加当某进程的到达时间 等于 该时刻系统时间时该进程进入等待队列int systemTime 0;int i 0;//正在运行的进程的下标i的范围i j//按照到达系统时间排序后最后一个到达系统的进程的下标jint j -1;//下标从0到j的进程都在等待队列中j的范围0 j num-1初始队列中无进程则为-1int flag 0; //用于判断系统现在是否被进程占用flag1时表示系统正在运行进程totalTurnaroundTime 0;//初始化周转总时间totalTurnaroundTimeWithRight 0;//初始化带权周转总时间quickSortArriveTime(arr, 0, num-1);//进入算法后先按照进程到达时间进行升序排序//*************************系统开始运行开始执行进程*************************//System.out.println(先来先服务算法(FCFS)开始运行);while(true){//模拟进程执行从系统时间为0开始 到 最后一个进程执行结束System.out.println(当前时间 systemTime);//判断是否有进程进入系统进入系统后进入等待队列当有进程到达系统时记录该进程并输出提示信息while(j1 num systemTime arr[j1].getArriveTime()){//当该系统时间有到达的进程时输出并记录进程到达系统该判断独立执行与flag无关//可能有多个进程同时到达所以用while多次判断j;System.out.println(进程 arr[j].getName() 到达系统);}//根据系统中是否有进程在执行进行不同操作if(flag 1){//flag1表示 当前有进程在执行判断该进程是否还在执行if(arr[i].getAlreadyServiceTime() ! arr[i].getServiceTime()){//如果进程i已经服务的时间 ! 应该服务的时间即进程正在执行则输出正在执行System.out.println(进程 arr[i].getName() 正在执行);//已经服务的时间和系统时间同步应该在该时刻过去时增加系统时间在程序末尾更新arr[i].setAlreadyServiceTime(arr[i].getAlreadyServiceTime() 1);//更新已经服务的时间}else{//如果进程i已经服务的时间 应该服务的时间即进程服务结束System.out.println(进程 arr[i].getName() 执行结束);arr[i].setEndTime(systemTime);//记录进程i结束服务时间//计算进程的周转时间、带权周转时间arr[i].setTurnaroundTime(arr[i].getEndTime() - arr[i].getArriveTime());arr[i].setTurnaroundTimeWithRight(arr[i].getTurnaroundTime() / (double)arr[i].getServiceTime());//记录周转总时间、带权周转总时间totalTurnaroundTime arr[i].getTurnaroundTime();totalTurnaroundTimeWithRight arr[i].getTurnaroundTimeWithRight();//if(i1 j) i;//执行完一个进程后如果等待队列中还有进程则i加1准备执行下一个进程flag 0;//进程执行完flag置0表明系统中无进程执行}}if(flag 0)//此处不用else因为上面flag1时可能将flag置0此flag0和flag1是可能都发生的{//flag0表示 当前无进程在执行如果等待队列中有进程则执行一个进程if(i1 j) i;//执行完一个进程后如果等待队列中还有进程则i加1准备执行下一个进程if(arr[i].getVisited() 0){ //当等待队列中还有进程 并且 当前没有进程未被执行过//由于到达时间在最上面j的部分筛选过了所以此处只需要筛选是否被执行过if(i0){//判断第一个进程到达的时间是否等于系统时间等于的话才开始执行第一个进程if(arr[i].getArriveTime()systemTime){System.out.println(进程 arr[i].getName() 开始执行);//已经服务的时间和系统时间同步应该在该时刻过去时增加系统时间在程序末尾更新arr[i].setAlreadyServiceTime(arr[i].getAlreadyServiceTime() 1);//更新已经服务的时间arr[i].setStartTime(systemTime);//记录进程i的开始服务时间arr[i].setVisited(1);//别忘记标记进程i被访问过否则最后一个进程每次都会进入该if反复执行flag 1;//标志当前有进程执行}}//以下为除第一个进程以外的进程flag0的时候只要 该进程到达了且未被访问则开始执行else {System.out.println(进程 arr[i].getName() 开始执行);//已经服务的时间和系统时间同步应该在该时刻过去时增加系统时间在程序末尾更新arr[i].setAlreadyServiceTime(arr[i].getAlreadyServiceTime() 1);//更新已经服务的时间arr[i].setStartTime(systemTime);//记录进程i的开始服务时间arr[i].setVisited(1);//别忘记标记进程i被访问过否则最后一个进程每次都会进入该if反复执行flag 1;//标志当前有进程执行}}}systemTime;//系统时间在程序末尾自动增加表示该时刻过去//根据flag的值进行某时刻状态的记录if(flag0){System.out.println(此时没有正在执行的进程);System.out.println(此时等待队列尾部没有进程);System.out.println(此时flag flag);}else {System.out.println(此时正在执行进程i i);System.out.println(此时等待队列尾部的是进程j j);System.out.println(此时flag flag);}if(i num-1 j num-1 flag 0){ //当jnum-1时说明全部进程都已经到达系统//当inum-1并且flag0时表示本该在执行第num-1个进程但是现在没有进程在执行//说明第num-1个进程即最后一个进程也执行完了可以退出算法了break;}try{Thread.sleep(1000);//模拟系统运行制造一个时间停顿}catch(Exception e){e.printStackTrace();}System.out.println();}displayResult();//算法执行结束展示结果System.out.println(FCFS算法执行完成);System.out.println();
}2.短进程优先SPF算法
void run(){//*************************进入短进程优先算法SPF*************************////模拟一个系统时间系统时间自动增加当某进程的到达时间 等于 该时刻系统时间时该进程进入等待队列int systemTime 0;int i 0;//正在运行的进程的下标i的范围i j//按照到达系统时间排序后最后一个到达系统的进程的下标jint j -1;//下标从0到j的进程都在等待队列中j的范围0 j num-1初始队列中无进程则为-1int flag 0;//用于判断系统现在是否被进程占用flag1时表示系统正在运行进程totalTurnaroundTime 0;//初始化周转总时间totalTurnaroundTimeWithRight 0;//初始化带权周转总时间quickSortArriveTime(arr, 0, num-1);//进入算法后先按照进程到达时间进行升序排序//*************************系统开始运行开始执行进程*************************//System.out.println(短进程优先算法(SPF)开始运行);while(true){//模拟进程执行从 系统时间为0开始 到 最后一个进程执行结束System.out.println(当前时间 systemTime);//当有进程到达系统时记录该进程并输出提示信息//判断是否有进程进入系统进入系统后进入等待队列当有进程到达系统时记录该进程并输出提示信息while(j1 num systemTime arr[j1].getArriveTime()){//当该系统时间有到达的进程时输出并记录进程到达系统该判断独立执行与flag无关//可能有多个进程同时到达所以用while多次判断j;System.out.println(进程 arr[j].getName() 到达系统);//短进程优先算法每次有进程到达系统都要按照服务时间排序将服务时间短的排在前面//等待队列中现在是下标从0到j-1的进程队列都是已经到达的进程所有只需要关注服务时间
// quickSortServiceTime(arr, 0, j-1);//按照服务时间从小到大升序排序//经测试发现此处不能将arr排序否则下面arr[i]指向的内容会变选最短服务时间进程在下面遍历选择}//根据系统中是否有进程在执行进行不同操作if(flag 1){//flag1表示 当前有进程在执行判断该进程是否还在执行if(arr[i].getAlreadyServiceTime() !arr[i].getServiceTime()){//如果进程i已经服务的时间 ! 应该服务的时间即进程正在执行则输出正在执行System.out.println(进程 arr[i].getName() 正在执行);arr[i].setAlreadyServiceTime(arr[i].getAlreadyServiceTime() 1);//更新已经服务的时间}else{//如果进程i已经服务的时间 应该服务的时间即进程服务结束System.out.println(进程 arr[i].getName() 执行结束);arr[i].setEndTime(systemTime);//记录进程i结束服务时间//计算进程的周转时间、带权周转时间arr[i].setTurnaroundTime(arr[i].getEndTime() - arr[i].getArriveTime());arr[i].setTurnaroundTimeWithRight(arr[i].getTurnaroundTime() / (double)arr[i].getServiceTime());//记录周转总时间、带权周转总时间totalTurnaroundTime arr[i].getTurnaroundTime();totalTurnaroundTimeWithRight arr[i].getTurnaroundTimeWithRight();//此处不要令i加1了找下一个需要执行的进程的任务交给flag0的语句块FCFS算法可以直接i1其他算法不可以
// if(i1 j) i;//执行完一个进程后如果等待队列中还有进程则i加1准备执行下一个进程flag 0;//进程执行完flag置0表明系统中无进程执行}}if(flag 0)//此处不用else因为上面flag1时可能将flag置0此flag0和flag1是可能都发生的{//flag0表示 当前无进程在执行如果等待队列中有进程则执行一个进程//找到服务时间最小并且没有被执行的进程并执行它i findMinServiceTimeIndex(j);//把拥有最小服务时间的进程下标赋值给i然后执行if (arr[i].getVisited() 0) { // 当前没有进程在执行 并且 进程i未被执行过则执行进程i//此if判断是必要的因为上方函数在找不到符合条件的进程时返回的i为0//如果不执行if则会反复执行进程num-1导致算法陷入死循环if(i0){if (arr[i].getArriveTime() systemTime) {System.out.println(进程 arr[i].getName() 开始执行);arr[i].setAlreadyServiceTime(arr[i].getAlreadyServiceTime() 1);//更新已经服务的时间arr[i].setStartTime(systemTime);//记录进程i的开始服务时间arr[i].setVisited(1);//别忘记标记进程i被访问过否则最后一个进程每次都会进入该if反复执行flag 1;//标志当前有进程执行}}else{System.out.println(进程 arr[i].getName() 开始执行);arr[i].setAlreadyServiceTime(arr[i].getAlreadyServiceTime() 1);//更新已经服务的时间arr[i].setStartTime(systemTime);//记录进程i的开始服务时间arr[i].setVisited(1);//别忘记标记进程i被访问过否则最后一个进程每次都会进入该if反复执行flag 1;//标志当前有进程执行}}}systemTime;//系统时间在程序末尾自动增加表示该时刻过去if(flag0){System.out.println(此时没有队列执行);System.out.println(此时等待队列尾部的是进程j j);System.out.println(此时flag flag);}if(flag1) {System.out.println(此时正在执行进程i i);System.out.println(此时等待队列尾部的是进程j j);System.out.println(此时flag flag);}//SPF算法不能单纯的再用这个if判断是否退出算法了不是按到达时间顺序选取进程执行的算法都不行//因为SPF算法不是按照FCFS一样从下标为0的进程顺序执行到下标为num-1的进程//最后一个执行的进程的下标不一定是num-1所以不能用inum-1来判断是否全部进程都执行完毕//但是为了此处退出算法的判断所有算法都统一本人改写了最后给下标i赋值的代码//当全部进程都执行完毕时令i num-1//使得该判断方式仍然成立所以仍然使用此判断方式if(i 0 j num-1 flag 0){//当jnum-1时说明全部进程都已经到达系统//当i0并且flag0时表示本该在执行第num-1个进程但是现在没有进程在执行所以i被自动初始化为0//说明第num-1个进程即最后一个进程也执行完了可以退出算法了break;}try{Thread.sleep(1000);//模拟系统运行制造一个时间停顿}catch(Exception e){e.printStackTrace();}System.out.println();}3.静态级调度SPSA算法
//*************************进入静态优先级调度算法SPSA*************************//void run(){readPriority();//读入各进程的优先级//模拟一个系统时间系统时间自动增加当某进程的到达时间 等于 该时刻系统时间时该进程进入等待队列int systemTime 0;//初始化系统时间int i 0;//设置正在运行的进程的下标i的范围i j//按照到达系统时间排序后最后一个到达系统的进程的下标jint j -1;//下标从0到j的进程都在等待队列中j的范围0 j num-1初始队列中无进程则为-1int flag 0;//用于判断系统现在是否被进程占用flag1时表示系统正在运行进程totalTurnaroundTime 0;//初始化周转总时间totalTurnaroundTimeWithRight 0;//初始化带权周转总时间quickSortArriveTime(arr, 0, num-1);//进入算法后先按照进程到达时间进行升序排序System.out.println(静态优先级调度算法(SPSA)开始运行);//系统开始运行while(true)//模拟进程执行从系统时间为0开始 到 最后一个进程执行结束{System.out.println(当前时间 systemTime);//判断是否有进程进入系统进入系统后进入等待队列当有进程到达系统时记录该进程并输出提示信息while(j1 num systemTime arr[j1].getArriveTime()) //可能有多个进程同时到达所以用while多次判断{j;//当该系统时间有到达的进程时输出并记录进程到达系统该判断独立执行与flag无关System.out.println(进程 arr[j].getName() 到达系统);}//根据系统中是否有进程在执行进行不同操作if(flag 1)//flag1表示 当前有进程在执行判断该进程是否还在执行{if(arr[i].getAlreadyServiceTime() ! arr[i].getServiceTime()){//如果进程i已经服务的时间 ! 应该服务的时间即进程正在执行则输出正在执行System.out.println(进程 arr[i].getName() 正在执行);arr[i].setAlreadyServiceTime(arr[i].getAlreadyServiceTime() 1);//更新已经服务的时间}else{//如果进程i已经服务的时间 应该服务的时间即进程服务结束System.out.println(进程 arr[i].getName() 执行结束);arr[i].setEndTime(systemTime);//记录进程i结束服务时间//计算进程的周转时间、带权周转时间arr[i].setTurnaroundTime(arr[i].getEndTime() - arr[i].getArriveTime());arr[i].setTurnaroundTimeWithRight(arr[i].getTurnaroundTime() / (double)arr[i].getServiceTime());//记录周转总时间、带权周转总时间totalTurnaroundTime arr[i].getTurnaroundTime();totalTurnaroundTimeWithRight arr[i].getTurnaroundTimeWithRight();//此处不要令i加1了找下一个需要执行的进程的任务交给flag0的语句块FCFS算法可以直接i1其他算法不可以
// if(i1 j) i;//执行完一个进程后如果等待队列中还有进程则i加1准备执行下一个进程flag 0;//进程执行完flag置0表明系统中无进程执行}}if(flag 0)//此处不用else因为上面flag1时可能将flag置0此flag0和flag1是可能都发生的{//flag0表示 当前无进程在执行如果等待队列中有进程则执行一个进程//找到拥有最大优先级并且没有被执行的进程并执行它i findMaxPriorityIndex(j);//把拥有最大优先级的进程下标赋值给i然后执行//if(i1j) i;if(arr[i].getVisited() 0){//当 当前没有进程在执行 并且 进程i未被执行过//此if判断是必要的因为上方函数在找不到符合条件的进程时返回的i为num-1//如果不执行if则会反复执行进程num-1导致算法陷入死循环System.out.println(进程 arr[i].getName() 开始执行);arr[i].setAlreadyServiceTime(arr[i].getAlreadyServiceTime() 1);//更新已经服务的时间arr[i].setStartTime(systemTime);//记录进程i的开始服务时间arr[i].setVisited(1);//别忘记标记进程i被访问过否则最后一个进程每次都会进入该if反复执行flag 1;//标志当前有进程执行}}systemTime;//系统时间在程序末尾自动增加表示该时刻过去if(flag0){System.out.println(此时没有正在执行的进程);System.out.println(此时等待队列尾部没有进程);System.out.println(此时flag: flag);}else{System.out.println(此时正在执行进程i i);System.out.println(此时等待队列尾部的是进程j j);System.out.println(此时flag flag);}//SPF算法不能单纯的再用这个if判断是否退出算法了不是按到达时间顺序选取进程执行的算法都不行//最后一个执行的进程的下标不一定是num-1所以不能用inum-1来判断是否全部进程都执行完毕//但是为了此处退出算法的判断所有算法都统一本人改写了最后给下标i赋值的代码//当全部进程都执行完毕时令i num-1//使得该判断方式仍然成立所以仍然使用此判断方式if(i num-1 j num-1 flag 0){//当jnum-1时说明全部进程都已经到达系统//当inum-1并且flag0时表示本该在执行第num-1个进程但是现在没有进程在执行//说明第num-1个进程即最后一个进程也执行完了可以退出算法了break;}try{Thread.sleep(1000);//模拟系统运行制造一个时间停顿}catch(Exception e){e.printStackTrace();}System.out.println();}displayResult();//算法执行结束展示结果System.out.println(SPSA算法执行完成);System.out.println();}4.轮转调度RR算法
void run()
{//进入时间片轮转算法RRquickSortArriveTime(arr, 0, num-1);//进入算法后先按照进程到达时间进行升序排序readTimeSlice();//读入设定的时间片的值int timeFlag 0;//时间片计时变量记录进程i已经执行的时间//模拟一个系统时间系统时间自动增加当某进程的到达时间 等于 该时刻系统时间时该进程进入等待队列int systemTime 0;int i 0;//正在运行的进程的下标i的范围i j//按照到达系统时间排序后最后一个到达系统的进程的下标jint j -1;//下标从0到j的进程都在等待队列中j的范围0 j num-1初始队列中无进程则为-1int flag 0;//用于判断系统现在是否被进程占用flag1时表示系统正在运行进程totalTurnaroundTime 0;//初始化周转总时间totalTurnaroundTimeWithRight 0;//初始化带权周转总时间//系统开始运行开始执行进程System.out.println(时间片轮转算法(RR)开始运行);while(true){//模拟进程执行从 系统时间为0开始 到 最后一个进程执行结束System.out.println(当前时间 systemTime);//判断是否有进程进入系统进入系统后进入等待队列当有进程到达系统时记录该进程并输出提示信息while(j1 num systemTime arr[j1].getArriveTime()){//当该系统时间有到达的进程时输出并记录进程到达系统//可能有多个进程同时到达所以用while多次判断j;System.out.println(进程 arr[j].getName() 到达系统);}//根据系统中是否有进程在执行进行不同操作if(flag 1){//flag1表示 当前有进程在执行判断该进程是否还在执行if(arr[i].getAlreadyServiceTime() ! arr[i].getServiceTime()){//如果进程i已经服务的时间 ! 应该服务的时间即进程正在执行则输出正在执行//如果该进程执行了一个时间片时间并且还未执行完毕则将该进程放回等待队列置flag0并重新计时//等到下一个系统时间时在flag0语句块中系统自动搜索下一个执行的进程此处不要做多余操作if(timeFlag timeSlice){//如果该进程执行了一个时间片时间并且还未执行完毕arr[i].setVisited(0);//将进程i置为未被执行过放回等待队列flag 0;//置当前无进程执行timeFlag 0;//将时间片计时变量置0if(i1 j) i;//执行完一个进程后如果等待队列中还有进程则i加1准备执行下一个进程else i 0;//如果进程i后没有进程了则令i 0和flag}else{//如果该进程未执行够一个时间片则继续执行System.out.println(进程 arr[i].getName() 正在执行);//已经服务的时间和系统时间同步应该在该时刻过去时增加系统时间在程序末尾更新arr[i].setAlreadyServiceTime(arr[i].getAlreadyServiceTime() 1);//更新已经服务的时间timeFlag;//记录进程i已经执行的时间 加1该时间和 已经服务的时间 同步增加//上方部分代表该系统时刻进程已经执行完毕此时可以判断该进程是否执行了一个时间片的时间}}else{//如果进程i已经服务的时间 应该服务的时间即进程服务结束System.out.println(进程 arr[i].getName() 执行结束);arr[i].setEndTime(systemTime);//记录进程i结束服务时间//计算进程的周转时间、带权周转时间arr[i].setTurnaroundTime(arr[i].getEndTime() - arr[i].getArriveTime());arr[i].setTurnaroundTimeWithRight(arr[i].getTurnaroundTime() / (double)arr[i].getServiceTime());//记录周转总时间、带权周转总时间totalTurnaroundTime arr[i].getTurnaroundTime();totalTurnaroundTimeWithRight arr[i].getTurnaroundTimeWithRight();if(i1 j) i;//执行完一个进程后如果等待队列中还有进程则i加1准备执行下一个进程else i 0;//如果进程i后没有进程了则令i 0flag 0;//进程执行完flag置0表明系统中无进程执行}}if(flag 0)//此处不用else因为上面flag1时可能将flag置0此flag0和flag1是可能都发生的{//flag0表示 当前无进程在执行如果等待队列中有进程则执行一个进程i findNextProcess(i, j);if(arr[i].getVisited() 0){//当 等待队列中还有进程 并且 当前没有进程未被执行过//由于到达时间在最上面j的部分筛选过了所以此处只需要筛选是否被执行过System.out.println(进程 arr[i].getName() 开始执行);//RR算法中进程会多次执行所以只有第一次执行即已经服务的时间为0时才记录进程的开始时间if(arr[i].getAlreadyServiceTime() 0) arr[i].setStartTime(systemTime); //记录进程i的开始服务时间//并且在RR算法中记录开始服务时间要在记录已经服务时间前面否则已经服务时间永不为0则不会记录开始服务时间//已经服务的时间和系统时间同步应该在该时刻过去时增加系统时间在程序末尾更新arr[i].setAlreadyServiceTime(arr[i].getAlreadyServiceTime() 1);//更新已经服务的时间arr[i].setVisited(1);//别忘记标记进程i被访问过否则最后一个进程每次都会进入该if反复执行flag 1;//标志当前有进程执行timeFlag;}}systemTime;//系统时间在程序末尾自动增加表示该时刻过去if(flag0){System.out.println(此时没有正在执行的进程);System.out.println(此时等待队列队尾没有进程);System.out.println(此时flagflag);// System.out.println(此时timeflagtimeFlag);}else {System.out.println(此时正在执行进程i i);System.out.println(此时等待队列尾部的是进程j j);System.out.println(此时flag flag);System.out.println(此时timeFlag timeFlag);}if(i num-1 j num-1 flag 0){//当jnum-1时说明全部进程都已经到达系统//当inum-1并且flag0时表示本该在执行第num-1个进程但是现在没有进程在执行//说明第num-1个进程即最后一个进程也执行完了可以退出算法了break;}try{Thread.sleep(1000);//模拟系统运行制造一个时间停顿}catch(Exception e){e.printStackTrace();}System.out.println();}displayResult();//算法执行结束展示结果System.out.println(RR算法执行完成);System.out.println();}
3.程序设计 1先来先服务FCFS算法 2短进程优先算法 3静态级优先调度算法 存入文档 4时间片轮转算法 4.总结
选题是进程管理系统设计由一个人独立完成从需求分析、结构设计、算法设计、运行测试、代码优化、实验总结六个部分分别对FCFS算法SPF算法SPSA算法RR算法进行设计。虽然实验程序仍然有所不足但是在实验和设计的过程中也是收获颇丰为以后的学习积累了经验。以下是每个算法的问题和解决方案以及心得 先来先服务算法 ①时间为0时没有进程到达但是进程已经开始执行并且后面进程真正到达时又会执行一遍 ②两个进程间如果有时间间隔并且间隔内没有进程在执行则第二个进程不会等到到达才执行且正在执行的进程i却也会显示和变化 ③每个时间点的状态如果不判断就算没有进程职系那个则一直会有显示正在执行的是该时刻进程的i ④等待队列进程增加了但是却不会继续执行下一个等待队列尾部的进程 短进程优先算法 1、在后期的调试中发现第一个进程会在系统时间为0时开始执行之后在设置好的开始时间又会执行一遍后面在第一个进程中设定好需要系统时间等于开始时间才会执行后面的一系列代码 2、进程有时候会死锁在设置退出算法的条件时考虑的不全面。 静态优先级调度算法 在设计静态优先调度算法时主要从以下方面考虑 1. 考虑任务优先级在实际应用中任务的优先级可能会受到多个因素的影响因此需要根据实际情况确定任务的优先级算法出于这个考虑在本次实验中我们可以根据考虑服务时间等因素自己设置系统的进程优先级并设置了findMaxPriorityIndex函数允许系统通过遍历自行找到最大优先级的进程。 2. 调度算法的实现在实现调度算法时需要考虑如何高效地对任务进行排序并且需要保证算法的正确性和可靠性故在该系统中设置quickSortArriveTime使进程按到达时间升序排列。 3. 关于调度效率的优化静态优先调度算法的调度效率可能会受到多个因素的影响例如任务的数量、任务的执行时间等因此我们需要针对不同的应用场景进行优化以提高算法的调度效率但在这一方面在本次设计中个人考虑或许不太全面故在给出些许的程序可能在会出现些许问题说明该设计还有优化的空间。 时间片轮转调度算法 非抢占式轮转调度算法RR中系统根据FCFS策略将所有就绪进程排成一个就绪队列。就绪队列上的每个进程每次仅运行一个时间片。时间片的选择对系统性能有很大影响。 若选择很小的时间片将有利于短作业但会增加系统开销 若时间片选择太长RR算法退化为FCFS算法无法满足短作业和交互式用户的需求。 在调试程序过程中出现了进程还未到达但已开始执行的问题。经分析是等待队列的进程数量计算错误发现周转时间输出为负数是由于进程的执行顺序出错发现由于进程在一个时间片时间后未执行完毕而出现多次执行使得进程开始服务时间会被反复赋值所以在记录开始服务时间代码处加上if条件判断只记录进程第一次执行的开始服务时间。