Java操作系统进程调度算法——先来先服务(FCFS)算法
Java操作系统进程调度算法——先来先服务(FCFS)算法
前言
无论是在批处理系统还是分时系统中,用户进程数一般都多于处理机数、这将导致它们互相争夺处理机。另外,系统进程也同样需要使用处理机。这就要求进程调度程序按一定的策略,动态地把处理机分配给处于就绪队列中的某一个进程,以使之执行。
一、算法思想
先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可用于进程调度。采用FCFS算法,每次从后备队列中选择一个或多个最先进入该队列的作业,将他们调入内存,为他们分配资源,创建进程,然后放入就绪队列。在进程调度中采用FCFS算法时,则每次调度是从就绪队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行。该进程一直运行到完成或发生某事件而阻塞后才放弃处理机。
二、数据结构
1.定义(PCB)进程控制块
代码如下(示例):
String id;
float reachTime;
float needTime;
float startTime;
float finishTime;
char state;
2.实现思路
(1)用户输入进程数
(2)初始化进程(进程ID、进程到达时间、进程运行时间)
(3)判断进程是否都运行完毕
(4)模拟运行下一个进程(并计算相应的时间)
(5)更改当前时间
(6)所有进程运行结束后,计算平均周转时间和平均带权周转时间
(7)打印输出结果
三、流程图
四、完整代码
import java.util.Scanner;
import java.util.Arrays;
public class fcfs1 {
// 接口Comparable和类方法Arrays.sort()的配合使用可以使进程按reachTime(到达时间)排序
private static class PCB implements Comparable<PCB> {
String id;
float reachTime;
float needTime;
float startTime;
float finishTime;
char state;
public int compareTo( PCB b ) {
if( reachTime==b.reachTime ) return 0;
if( reachTime<b.reachTime ) return -1;
return 1;
}
}
public static void main( String[] args ) {
Scanner sc = new Scanner( System.in );
System.out.print( "请输入进程数:" );
int num = sc.nextInt();
PCB[] arr = new PCB[num];
System.out.println( "请依次输入进程ID,进程到达时间,进程运行时间:" );
for( int i = 0; i < num; i++ ) {
arr[i] = new PCB();
arr[i].id = sc.next();
arr[i].reachTime = sc.nextFloat();
arr[i].needTime = sc.nextFloat();
arr[i].state = 'R';
}
Arrays.sort(arr); // 使进程按reachTime(到达时间)排序
float lastTime=arr[0].reachTime;
for( int i=0; i<num; i++ ) {
// 找到下一个将要执行的进程
int p = i;
if( arr[p].reachTime<lastTime ) arr[p].startTime = lastTime;
else arr[p].startTime = arr[p].reachTime;
arr[p].finishTime = arr[p].startTime + arr[p].needTime;
arr[p].state = 'F';
lastTime = arr[p].finishTime; // 更新lastTime
}
float sum1=0.0f, sum2=0.0f;
System.out.println( "\n进程 到达时间 运行时间 开始时间 完成时间 周转时间 带权周转时间" );
for( PCB jcb : arr ) {
System.out.format( "%4s %8.2f %8.2f ", jcb.id, jcb.reachTime, jcb.needTime );
System.out.format( "%8.2f %8.2f ", jcb.startTime, jcb.finishTime );
System.out.format( "%8.2f ", jcb.finishTime-jcb.reachTime );
System.out.format( "%12.2f\n", (jcb.finishTime-jcb.reachTime)/jcb.needTime );
sum1 += jcb.finishTime-jcb.reachTime;
sum2 += (jcb.finishTime-jcb.reachTime)/jcb.needTime;
}
System.out.format( "平均周转时间: %.3f\n", (sum1/num) );
System.out.format( "平均带权周转时间: %.3f", (sum2/num) );
}
}
五、运行结果
1、输入示例
进程数为5
A 9.40 20
B 10.10 10
C 10.05 30
D 9.55 15
E 9.45 25