作业调度的三种算法

作业调度的三种算法

一、先来先服务算法:

(1)按作业到达的先后次序进行调度。总是首先调度在系统中等待时间最长的作业。它是一种非剥夺式调度算法,主要是从“公平”的角度来考虑。哪个作业先进来,就优先执行哪个作业,不会导致饥饿,但是会出现作业的带权周转时间很大。
(2)代码如下:

#include <stdio.h>
#include <stdlib.h>
#include<dos.h>
#include<time.h>
#include<conio.h>
#include<string.h>
#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];    // 进程ID
    double 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时刻还没进程到达,此时选择下一个最早到达的进程q
        printf("%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 
  • 9
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值