Java操作系统进程调度算法——先来先服务(FCFS)算法

本文详细介绍了Java中实现操作系统进程调度的先来先服务(FCFS)算法,包括算法思想、数据结构(如PCB进程控制块)、实现步骤、流程图和完整代码示例。通过输入进程的到达时间、运行时间等信息,程序计算并输出平均周转时间和平均带权周转时间。
摘要由CSDN通过智能技术生成

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

2、结果截图

在这里插入图片描述

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值