短进程优先算法(C,Java实现)
【短进程优先算法(C,Java实现)】复制代码的时候:最好点下图 [cpp] 旁边的那个标签进行复制,不然可能代码编译不了。
文章图片
在短进程优先算法中需要注意:下一个进程是已经到达且运行时间最短的进程。
输入如下:
4
A8.002.00
B8.500.50
C9.000.10
D9.500.20
输出如下:
文章图片
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
如果你想实现以下效果:
文章图片
可以将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;
即可实现。
推荐阅读
- 两短篇
- 多线程NSOperation
- 迷失的童年(短篇小说连载之四)
- 惠子小姐的花期很短香味很长
- 推广大师(黄马可短篇小说精选|推广大师(黄马可短篇小说精选 x5)
- 富裕的好处是对资源的优先占有
- 如何选择营期时长
- 炒股知识(超级短线操作的秘籍|炒股知识:超级短线操作的秘籍 玩转股市)
- 「适合发朋友圈的可爱短句文案」
- 音乐那么短,但冥想的世界那么玄妙