目录
1.1 实验目标
1解进程调度的基本概念。
- 掌握先来先服务FCFS调度的原理与基本过程。
- 掌握短作业优先SJF调度的原理与基本过程。
1.2 问题描述
序模拟进程的先来先服务FCFS和短作业优先SJF调度过程。假设有n个进程分别在T1, … ,Tn时刻到达系统,它们需要的服务时间分别为S1, … ,Sn。分别采用先来先服务FCFS和短作业优先SJF进程调度算法进行调度,计算每个进程的完成时间,周转时间、带权周转时间和等待时间,并且统计n个进程的平均周转时间、平均带权周转时间和平均等待时间。最后,对两个算法做出比较评价。
1.3 输入形式
以文件形式输入各个进程编号、到达时间和CPU服务时间,每个进程数据为1行,各值之间以逗号分隔开
例如:
图片
1-3 输入数据
1.4 输出形式
ArrayList集合中按序存放各个进程的调度信息
例如:
图片 1-4 输出数据
1.5 测试数据
表 1-5 测试数据
进程编号 | 到达时间 | 服务时间 |
P3 | 2 | 1 |
P4 | 3 | 5 |
P1 | 0 | 3 |
P2 | 1 | 6 |
fcfsClass.java:定义了进程类,用于描述进程的状态信息。声明了私有成员变量,如下图所示:
图 3-1 使用类以及变量的说明
注:FCFS和SJF使用同一进程类,两者实现方式一样
值得一提的是,在该类中,为了将进程对象转化为易于读懂的字符串, 我们重写了toString()方法, 这样使得程序的输出在无需人为设计固定输出格式的情况放下,也能做到简单明了
其次,对于FCS和SJF,我分别定义了测试类fcfsDemo.java和sjfDemo.java,两者基本流程大致相同。
为了提高程序的执行效率,我先将数据按照方便读取的规则写在模块src/processInfo.txt文件中,在测试类中使用字符缓冲输入流一次读取一行数据,使用逗号切分,分别得到进程编号(名称)、到达就绪队列时间,CPU服务时间,使用带三个参数的构造方法进行进程对象的初始化工作,为了便于进程对象的集中操作与管理,我使用ArrayList集合存储该学生类,也就是ArrayList集合的每个对象都是一个进程对象类,下面我只需要调用相应的API对集合的所有元素的特定属性进行操作即可,完成这些后,所有进程调度的前后时间顺序我们已经在ArrayList集合中排好序了,下面我们需要使用程序的核心逻辑进行剩余属性操作,例如:后一个进程的开始时间是前一个进程的结束时间,当前进程的周转时间应为结束时间减去到达时间,当前进程的带权周转时间应为周转时间除以CPU Burst,注意为了提高精度,应将数据类型声明为Double型,但是本程序中没有规定该浮点数的精度,导致一些数据精度过大,做完了这些,我们只需使用增强for循环遍历该数组即可。
-
- fcfsDemo核心设计思想
图 3-3 fcfsDemo核心设计思想
3.4 sjfDemo核心设计思想
图 3-4 fcfsDemo核心设计思想
4. 实验结果与分析
4.1 实验结果描述
4.1.1 FCFS实验结果
图 4.1.1 FCFS实验结果
4.1.2 SJF实验结果
图 4.1.2 SJF实验结果
4.2 总结分析总结
总之,FCFS算法是进程调度时是从就绪的进程队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行的一种调度算法。SJF算法是指以作业的长短来计算优先级,作业越短,其优先级越高,越优先将他们调入内存运行。二者评价指标如下表:
表4-2-1 FCFS评价指标
FCFS | |||
processId | turnaroundTime | cTurnaroundTime | waitingTime |
P1 | 3 | 1 | 0 |
P2 | 8 | 1.3 | 2 |
P3 | 8 | 8 | 7 |
P4 | 12 | 2.4 | 7 |
average | 7.75 | 3.125 | 4 |
表4-2-2 SJF评价指标
SJF | |||
processId | turnaroundTime | cTurnaroundTime | waitingTime |
P1 | 3 | 1 | 0 |
P3 | 2 | 2 | 1 |
P2 | 6 | 1.2 | 1 |
P4 | 14 | 2.3 | 8 |
average | 6.25 | 1.625 | 2.5 |
FCFS有利于长作业,不利于短作业;SJF有利于短作业,不利于长作业
从以上表格分析可得:SJF实验结果三个评价指标均优于FCFS。
本次实验编写代码比较简单,我独立完成,但在写代码的过程中遇到了两个问题,记录一下。对于FCFS,如何在ArrayList集合中按序存储按正确的进程调度顺序存储进程对象,我通过百度,可以调用API Collections.sort,以匿名内部类的方式定义比较器,按照ArrivalTime属性重写里面的Compare方法。对于SJF,如何在众多等待进程中找到最早到达的进程,让其最先开始使用CPU资源,然后按照作业的越短,优先级越高的方式进行进程调度?我决定先使用Index记录最早到达的进程在集合中的下标,再删掉该进程对象,参照FCFS使用比较器,对整个进程按照CPU Burst进行排序,最后再把刚刚删掉的最早到达的进程插入到集合第一个位置