进程调度算法的设计一、实验题目:实现先来先服务调度算法(FCFS)实现时间片轮转调度算法(RR)二、实验目的:通过对进程调度算法的设计,深入理解进程调度的原理。进程是程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位。进程调度分配处理机,是控制协调进程对CPU的竞争,即按一定的调度算法从就绪队列中选中一个进程,把CPU的使用权交给被选中的进程。三、实验原理:1.先来先服务(FCFS)调度算法每次调度是从就绪队列中,选择一个最先进入就绪队列的进程,把处理器分配给该进程,使之得到执行。该进程一旦占有了处理器,它就一直运行下去,直到该进程完成或因发生事件而阻塞,才退出处理器。将用户作业和就绪进程按提交顺序或变为就绪状态的先后排成队列,并按照先来先服务的方式进行调度处理,是一种最普遍和最简单的方法。它优先考虑在系统中等待时间最长的作业,而不管要求运行时间的长短按照就绪进程进入就绪队列的先后次序进行调度,简单易实现,利于长进程,CPU繁忙型作业,不利于短进程,排队时间相对过长2.时间片轮转调度算法RR时间片轮转法主要用于进程调度。采用此算法的系统,其程序就绪队列往往按进程到达的时间来排序。进程调度按一定时间片(q)轮番运行各个进程.进程按到达时间在就绪队列中排队,调度程序每次把CPU分配给就绪队列首进程使用一个时间片,运行完一个时间片释放CPU,排到就绪队列末尾参加下一轮调度,CPU分配给就绪队列的首进程。四、数据结构:数组五、程序代码:packagesufa;importjava.util.Arrays;importjava.util.Scanner;publicclassDispatch{publicstaticvoidmain(String[]args){intslice=1;//时间片System.out.println("请输入要创建的进程数目:");Scannerreader=newScanner(System.in);intnum=reader.nextInt();//用户要输入的进程数Process1arr[]=newProcess1[num];//创建多个进程System.out.println("请分别输入进程的名称、到达时间以及区间时间");for(inti=0;i
0){for(inti=0;i0){//如果剩余区间还有时间arr[i].bursttime=arr[i].bursttime-slice;//每循环运行一次就减去时间片,并打印下面语句System.out.println("进程"+arr[i].id+"开始运行"+"\t"+arr[i].bursttime);}if(arr[i].bursttime==0)count--;//当有某个进程的剩余时间为0的时候,count进行减1,当count减到等于0时,即每个进程都没有剩余时间了,就不再运行了}}}}classProcess1implementsComparable{intid;//进程名称intarrtime;//到达时间intbursttime;//区间时间intovertime;//结束时间doubleturnovertime;//周转时间publicProcess1(){//读取用户输入的各个值Scannerreader=newScanner(System.in);this.id=reader.nextInt();this.arrtime=reader.nextInt();this.bursttime=reader.nextInt();}@OverridepublicintcompareTo(Objecto){//TODOAuto-generatedmethodstubProcess1pcb=(Process1)o;if(this.arrtime>=pcb.arrtime)//重写方法实现Comparable接口,按照到达时间的大小进行排序return1;elsereturn-1;}}六、运行结果:七、实验心得:这次的实验实现FCFS算法和RR算法虽然用程序算法实现了模拟进程调度的整个过程,但是并未能考虑深入到操作系统的根本上用不同的队列存储不同状态下的进程来实现算法调度,但通过这次对进程调度算法设计的实现,还是对进程调度有了更深入更清楚的了解,以后的程序编写不论是实验还是项目开发,无论大小,都应该把程序的整体框架构建好,提高重用性。