作业调度的三种算法
作业调度的三种算法
一、先来先服务算法:
(1)按作业到达的先后次序进行调度。总是首先调度在系统中等待时间最长的作业。它是一种非剥夺式调度算法,主要是从“公平”的角度来考虑。哪个作业先进来,就优先执行哪个作业,不会导致饥饿,但是会出现作业的带权周转时间很大。
(2)代码如下:
#include
#include
#include
#include
#include
#include
#define INF 1000000.0
typedef char string[10];
struct task
{int ID; //进程号string name; //进程名int arrivetime; //到达时间int servicetime; //服务时间int waittime; //等待时间int starttime; //开始运行时间int finishtime; //结束运行时间 float turnaroundtime; //周转时间float weightedturnaroundtime; //带权周转时间int priority; //优先权int finish; //是否已经完成
}PCB[10];
struct PCB {char id[10]; // 进程IDdouble reachTime; // 进程到达的时间double needTime; // 进程完成需要的时间double startTime; // 进程开始的时刻double finishTime; // 进程完成的时刻double cTime; // 进程周转时间double wcTime; // 进程带权周转时间char state; // 进程的状态( 设每个进程处于就绪R(ready),完成F(finish)两种状态之一 )
};
int num;
/* 两种情况:1.在lastTime时刻,选择已经到达且拥有最短运行时间的进程2.在lastTime时刻,没有进程到达,此时选择拥有最早到达时间的进程
*/
int findNext( struct PCB arr[], int length, double lastTime ) {// p是已经到达且拥有最短运行时间的进程的下标// q是没有到达的进程中拥有最早到达时间的进程的下标int i, p, q;double minNeedTime, minReachTime,minTime;minTime= 1000000;p = q = -1; minNeedTime = minReachTime = INF;for( i = 0; i < length; i++ ) {if( arr[i].state=='R' ) { // 进程处就绪状态// 第一情况if( arr[i].reachTime<=lastTime && arr[i].needTime<minNeedTime ){ p = i; minNeedTime = arr[i].needTime; }// 第二种情况if( arr[i].reachTime>lastTime && arr[i].reachTime<=minReachTime ){if(arr[i].needTime<minTime){ q = i; minReachTime = arr[i].reachTime; minTime = arr[i].needTime; }}}}// p为-1时,代表在lastTime时刻还没进程到达,此时选择下一个最早到达的进程qprintf("%d------------",q);if( p != -1 ) return p;return q;
}
int cmp( const void *a, const void *b ) {if( ((struct PCB*)a)->reachTime < ((struct PCB*)b)->reachTime ) return -1;return 1;
}int fcfs(){int num, i;double lastTime; // 为上一个进程的完成时间,用来确定当前进程的开始时间struct PCB *arr;printf( "请输入进程数:" );scanf( "%d", &num );arr = (struct PCB*)malloc(num*sizeof(struct PCB));lastTime = INF; // 最开始lastTime的为第一个作业的reachTime(到达时间)printf( "请依次输入进程ID,进程到达时间,进程运行时间:\n" );for( i = 0; i < num; i++ ) {scanf( "%s%lf%lf", arr[i].id, &arr[i].reachTime, &arr[i].needTime );arr[i].state = 'R';if( lastTime>arr[i].reachTime ) lastTime
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
