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

实验内容:

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

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

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

显示函数: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);

}

 

短作业优先(Shortest Job First,SJF)是一种常见的作业调度算法,它优先处理完成时间最短的任务。在C语言中实现这个算法,你可以按照以下步骤: ```c #include <stdio.h> #include <stdlib.h> #include <time.h> // 结构体表示任务,包含id、运行时间和优先级 typedef struct { int id; int burst_time; // 运行时间 int priority; // 优先级越小优先级越高 } Task; // 比较函数用于排序 int compare_tasks(Task* a, Task* b) { return a->priority - b->priority; // 按照优先级降序排列 } // 主函数,初始化任务队列并应用SJF算法 void sjf_scheduler(Task** tasks, int num_tasks) { Task* sorted_tasks = malloc(sizeof(Task*) * num_tasks); for (int i = 0; i < num_tasks; i++) { sorted_tasks[i] = tasks[i]; } qsort(sorted_tasks, num_tasks, sizeof(Task*), compare_tasks); int total_wait_time = 0; // 总等待时间 for (int i = 0; i < num_tasks; i++) { Task* current_task = sorted_tasks[i]; printf("Processing task %d with burst time %d\n", current_task->id, current_task->burst_time); // 假设CPU立即响应,模拟运行 sleep(current_task->burst_time); total_wait_time += i * current_task->burst_time; // 计算总等待时间 } printf("Total wait time for all tasks is %d\n", total_wait_time); } int main() { int num_tasks; printf("Enter the number of tasks: "); scanf("%d", &num_tasks); Task* tasks[num_tasks]; // 创建任务数组 for (int i = 0; i < num_tasks; i++) { printf("Enter task %d id, burst time and priority: ", i + 1); scanf("%d%d%d", &tasks[i]->id, &tasks[i]->burst_time, &tasks[i]->priority); } sjf_scheduler(tasks, num_tasks); // 调用调度函数 free(sorted_tasks); // 释放内存 return 0; } ``` 在这个代码示例中,用户输入任务的数量以及每个任务的ID、运行时间和优先级。sjf_scheduler函数首先按优先级对任务进行排序,然后逐个调度任务。注意,实际操作中,我们通常无法直接控制CPU去执行,这里通过`sleep()`函数模拟了运行过程。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值