短进程优先算法(C,Java实现)

【短进程优先算法(C,Java实现)】复制代码的时候:最好点下图 [cpp] 旁边的那个标签进行复制,不然可能代码编译不了。
短进程优先算法(C,Java实现)
文章图片

在短进程优先算法中需要注意:下一个进程是已经到达且运行时间最短的进程。
输入如下:
4
A8.002.00
B8.500.50
C9.000.10
D9.500.20

输出如下:
短进程优先算法(C,Java实现)
文章图片




C代码:

#include #include #define INF 1000000.0struct PCB { char id[10]; // 进程ID double reachTime; // 进程到达的时间 double needTime; // 进程完成需要的时间 double startTime; // 进程开始的时刻 double finishTime; // 进程完成的时刻 double cTime; // 进程周转时间 double wcTime; // 进程带权周转时间 char state; // 进程的状态( 设每个进程处于就绪R(ready),完成F(finish)两种状态之一 ) }; /* 两种情况: 1.在lastTime时刻,选择已经到达且拥有最短运行时间的进程 2.在lastTime时刻,没有进程到达,此时选择拥有最早到达时间的进程 */ int findNext( struct PCB arr[], int length, double lastTime ) { // p是已经到达且拥有最短运行时间的进程的下标 // q是没有到达的进程中拥有最早到达时间的进程的下标 int i, p, q; double minNeedTime, minReachTime; p = q = -1; minNeedTime = minReachTime = INF; for( i = 0; i < length; i++ ) { if( arr[i].state=='R' ) { // 进程处就绪状态 // 第一情况 if( arr[i].reachTime<=lastTime && arr[i].needTimelastTime && arr[i].reachTimearr[i].reachTime ) lastTime = arr[i].reachTime; }// sum1为所有进程周转时间之和,sum2为所有进程带权周转时间之和 double sum1=0.0, sum2=0.0; for( i = 0; i < num; i++ ) { int p = findNext( arr, num, lastTime ); // 找到下一个将要执行的进程 // 两种情况:将要执行的进程可能已经到达,或者还没到达 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].cTime = arr[p].finishTime - arr[p].reachTime; arr[p].wcTime = arr[p].cTime/arr[p].needTime; arr[p].state = 'F'; sum1 += arr[p].cTime; sum2 += arr[p].wcTime; lastTime = arr[p].finishTime; // 更新lastTime }printf( "\n进程到达时间运行时间开始时间完成时间周转时间带权周转时间\n" ); for( i = 0; i < num; i++ ) { printf( "%4s%8.2lf%8.2lf", arr[i].id, arr[i].reachTime, arr[i].needTime ); printf( "%8.2lf%8.2lf", arr[i].startTime, arr[i].finishTime ); printf( "%8.2lf%12.2lf\n", arr[i].cTime, arr[i].wcTime ); } printf( "平均周转时间: %.3lf\n", sum1/num ); printf( "平均带权周转时间: %.3lf\n", sum2/num ); return 0; }






Java代码:

import java.util.Scanner; import java.util.Arrays; public class Main { // 接口Comparable和类方法Arrays.sort()的配合使用可以使进程按reachTime(到达时间)排序 private static class PCB implements Comparable { String id; float reachTime; float needTime; float startTime; float finishTime; char state; public int compareTo( PCB b ) { if( reachTime==b.reachTime ) return 0; if( reachTimelastTime时,说明在lastTime时刻无进程到达,终止循环.*/ if( arr[i].reachTime > lastTime ) break; if( arr[i].needTime < minNeedTime ) { p = i; minNeedTime = arr[i].needTime; } } } if( p != -1 ) return p; return i; } 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




如果你想实现以下效果:
短进程优先算法(C,Java实现)
文章图片


可以将java代码的第 56- 66行代码换成以下代码:

/* 此时设每个进程处于就绪R(ready),运行E(excecuting),完成F(finish)三种状态之一, 并假设起始状态都是就绪状态 ) */ int p = 0, cnt = 0; for( float time=arr[p].reachTime; cnt



如果你要实现FCFS(先到先服务算法):
将C的第61行代码换成 int p = i; 将Java代码的第59行代码也换成 int p = i;
即可实现。






    推荐阅读