短作业优先调度算法(包含C代码)

本文详细介绍了短作业优先调度算法的模拟实现过程,包括作业体的设置、进程初始化、显示函数、排序函数、调度函数及删除函数的实现。通过用户输入或文件读取测试数据,确保算法能正确处理作业到达时间,并计算作业周转时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实验内容:

模拟实现短作业调度算法,具体如下:

设置作业体:作业名,作业的到达时间,服务时间,作业间的链接指针

进程初始化:由用户输入作业名、作业的到达时间和服务时间进行初始化。

显示函数:1、显示当前调度的是哪个作业,后备队列中有哪些作业

          2、最终显示每个作业的作业名、到达时间、服务时间、完成时间和周转时间

排序函数:对就已到达的作业按照服务时间进行排序。注意考虑到达时间

调度函数:每次从已到达的作业队列队首调度优一个作业执行。

删除函数:作业结束后撤销。

实验要求:

1、测试数据可以随即输入或从文件中读入。

2、必须要考虑到作业的到达时间

3、最终能够计算每一个作业的周转时间。

#include <stdio.h>
#include <stdlib.h>
#include<string.h>
typedef struct ssjjff
{
    char name[10];
    double arriveTime;
    double serveTime;
    double startTime;
    double endTime;
    double zhouzhuan;
} sjf;
sjf s[101];
void input(sjf *p,int N);
void Sort(sjf *p,int N);
void output(sjf *p,double arriveTime,double serveTime,double startTime,double endTime,double zhouzhuan,int N);
void deal(sjf *p,double arriveTime,double serveTime,double startTime,double endTime,double zhouzhuan,int N);
void SJF(sjf *p,int N);

int main()
{
    int N;
    printf("      短作业优先调度算法             \n");
    printf("请输入进程数:");
    scanf("%d",&N);
    input(s,N);
    sjf *p = s;
    SJF(p,N);
    return 0;
}

void input(sjf *p,int N) // 输入数据
{
    int i;
    for (i=0; i<N; i++)
    {
        //printf("输入第%d个进程名称、到达时间、服务时间:\n",i+1);
        scanf("%s%lf%lf",p[i].name,&p[i].arriveTime,&p[i].serveTime);

    }
}

void output(sjf *p,double arriveTime,double serveTime,double startTime,double endTime,double zhouzhuan,int N) // 输出数据
{
    int j;
    printf("执行顺序:\n");
    printf("%s",p[0].name);
    for(j=1; j<N; j++)
    {
        printf("-->%s",p[j].name);
    }
    printf("\n");
    //printf("\n进程名\t到达时间\t服务时间\t开始时间\t结束时间\t周转时间\n");
    for(j=0; j<N; j++)
    {
        printf("%s\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t\n\n",p[j].name, p[j].arriveTime, p[j].serveTime, p[j].startTime, p[j].endTime, p[j].zhouzhuan);
    }
}



void deal(sjf *p,double arriveTime,double serveTime,double startTime,double endTime,double zhouzhuan,int N) //处理数据
{
    int k;
    for(k=0; k<N; k++)
    {
        if(k == 0)
        {
            p[k].startTime = p[k].arriveTime;
            p[k].endTime = p[k].arriveTime + p[k].serveTime;
        }
        else
        {
            p[k].startTime = p[k-1].endTime;
            p[k].endTime = p[k-1].endTime + p[k].serveTime;
        }

    }
    for(k=0; k<N; k++)
    {
        p[k].zhouzhuan = p[k].endTime - p[k].arriveTime;//周转时间 = 结束时间-到达时间
    }
}

void Sort(sjf *p,int N)// 到达时间排序
{
    int i,j;
    for(i=0; i<N; i++)
        for(j=0; j<i+1; j++)
        {
            if( p[i].arriveTime < p[j].arriveTime)
            {
                sjf temp;
                temp = p[i];
                p[i] = p[j];
                p[j] = temp;
            }
        }
}

void SJF(sjf *p,int N)
{
    double arriveTime=0,serveTime=0,startTime=0,endTime=0,zhouzhuan=0;//对结构进行
    Sort(p,N);
    int n,m;
    for(m=0; m<N-1; m++)
    {
        if(m==0)
            p[m].endTime= p[m].arriveTime+ p[m].serveTime;
        else
            p[m].endTime= p[m-1].endTime+ p[m].serveTime;
        int i=0;
        for(n=m+1; n<=N-1; n++)
        {
            if( p[n].arriveTime <= p[m].endTime)//判断内存中每次完成之后有多少到达的进程
                i++;
        }
        float min= p[m+1].serveTime;
        int next=m+1;//m+1=n
        int k;
        for(k=m+1; k<m+i; k++) //找出到达后的进程中最小的进程
        {
            if( p[k+1].serveTime <min)
            {
                min=p[k+1].serveTime;
                next=k+1;
            }
        }
        sjf temp;
        temp=p[m+1];
        p[m+1]=p[next];
        p[next]=temp;
    }
    deal(p,arriveTime,serveTime,startTime,endTime,zhouzhuan,N);
    output(p,arriveTime,serveTime,startTime,endTime,zhouzhuan,N);

}

 

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值