作业调度之短作业优先(实验一)

作业:作业是一个比程序更广泛的概念,它不仅包含了通常的程序和数据,而且还应配有的一份说明书,系统根据这份说明书对程序上的运行进行控制。在批处理系统中,是以作业为单位从外存调入内存。

作业调度的主要任务:根据JPB中的信息,检测系统中的资源能否满足作业对资源的需求,以及按照一定的调度算法,从外存的后备队列中选取某些作业调入内存,并为它们创建进程、分配必要的资源。

短作业优先调度算法:以作业时间的长短计算优先级,作业越短,优先级越高。短作业优先相对于先来先服务有着很大的改进,但短作业优先也有很多的不足。短作业优先必须预知作业的时间,短作业优先算法对长作业十分的不利甚至会忽略掉长作业,短作业优先算法不能人机交互,不能保证紧急的作业能够及时执行。

周转时间:从作业提交给操作系统开始到作业完成的这段时间间隔,尽可能使周转时间小也是处理机调度的目标。

                                                             周转时间 = 服务时间 + 等待时间 = 完成时间 - 到达时间

带权周转时间:周转时间和对该作业的服务时间的比值。


模拟短作业优先的C代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define Max  256

struct Job{ //描述作业信息
    char *name;
    int need_time;
    int come_time;
    int time;
    double play_time;
    double avg_time;

    struct Job *next;
    Job() //默认构造函数
    {    
        name = NULL;
        next = NULL;
        time = 0;
        come_time = 0;
        need_time = 0;
        avg_time = 0;
        play_time = 0;
    }
    void copy_job(struct Job *temp) //拷贝函数
    { 
        name = (char *)malloc(sizeof(char) *strlen(temp->name));
        strcpy(name,temp->name);
        come_time = temp->come_time;
        need_time = temp->need_time;
        time = temp->time;
        play_time = temp->play_time;
        avg_time = temp->avg_time;

        return;
    }
    void play_and_avg_time(int end_time) //计算周转时间、带权周转时间
    {
        double wait_time;
        this->play_time = end_time - this->come_time;

        wait_time = this->play_time - this->need_time;
        avg_time = 1 + (wait_time / need_time);

        return;
    }
};

int sum; //统计作业的个数

void init_queue(struct Job **head,char *name,int come_time,int need_time) //初始化作业链表
{
    struct Job *temp = new Job();
    temp->name = (char *)malloc(sizeof(char) * strlen(name));
    strcpy(temp->name,name);
    temp->come_time = come_time;
    temp->need_time = need_time;

    temp ->next = (*head)->next;
    (*head)->next = temp;

    return;
}

void out_one(struct Job *temp) //显示作业信息
{
    printf("name: %s\n",temp->name);
    printf("come_time: %d\n",temp->come_time);
    printf("need_time: %d\n",temp->need_time);
    printf("avg_time: %0.1f\n",temp->avg_time);
    printf("play_time: %0.1f\n",temp->play_time);

    return;
}

void out_one_queue(struct Job *temp,int i)
{
    printf("this time = %d, the job over! \n",i);
    out_one(temp);

    printf("\n");
    return;
}

void add_queue(struct Job *temp,struct Job **head_queue) //在队列中添加一个作业
{
    struct Job *temp_queue = new Job();
    temp_queue->copy_job(temp); //拷贝作业信息

    if((*head_queue) ->next == NULL){
        (*head_queue) ->next = temp_queue;
        return;
    }

    struct Job *p;
    for(p = (*head_queue)->next; p ->next; p = p->next){ //按照作业时间大小及到达时间插入到队列
       if(p->next->need_time > temp_queue->need_time){
            temp_queue ->next = p ->next;
            p ->next = temp_queue;
            return;
       }
       else if(p->next->need_time == temp_queue->need_time){
            temp_queue ->next = p ->next ->next;
            p->next  = temp_queue;
            return;
       }
    }
    if(!p ->next)
        p ->next = temp_queue;

    return;
}
void dele_queue(struct Job *head_queue) //从队列中删除一个作业
{

    if(!head_queue ->next)
        return;

    struct Job *p = head_queue ->next;
    head_queue->next = head_queue->next->next;
    delete p;
    return;
}

void mo_ni(struct Job *head,struct Job **head_queue) //模拟作业,每次循环加一
{
    int i = 0,count_job = 0;
    while(i >= 0){

        for(struct Job *p = head->next; p; p = p->next) //检查该时间点有无作业到达
        if(i == p->come_time){ //如果有作业到达,加入作业队列
            add_queue(p,head_queue);
        }

        if((*head_queue)->next){
            if((*head_queue)->next->time == (*head_queue)->next->need_time){ //检查作业服务是否完成

                (*head_queue)->next->play_and_avg_time(i); //计算周转时间、带权周转时间

                out_one_queue((*head_queue)->next,i);
                dele_queue((*head_queue)); //从作业队列中删除
                count_job++; //作业计数器加1
            }
        }
        if((*head_queue)->next) //作业服务时间计数器加1
            (*head_queue) ->next->time ++;
        i++;

        if(count_job == sum) //所有作业全部完成,结束
             return;
    }

    return;
}

int main(int argc,char *argv[])
{
    struct Job *head = new Job();
    struct Job *head_queue = new Job();
    char name[Max];
    int come_time;
    int need_time;

    FILE *input_file = fopen("C:\\Users\\chenhongyu\\Desktop\\test.txt","r"); //从文件读取作业信息

    printf("plase input name come_time need_time,if over plase input [CTRL + Z]\n\n");
    while(fscanf(input_file,"%s%d%d",name,&come_time,&need_time) != EOF){
            sum++;
            init_queue(&head,name,come_time,need_time);
    }

    mo_ni(head,&head_queue); //模拟作业

    return 0;
}




#include //定义一个结构体 struct sjf{ char name[10]; //进程名 float arrivetime; //到达时间 float servicetime;//服务时间 float starttime; //开始时间 float finishtime;//完成时间 float zztime;//周转时间 float dqzztime;//带权周转 }; //定义一个结构体数组 sjf a[100]; //定义一个输入函数 void input(sjf *p,int N) { int i; printf("intput the process's name & arrivetime & servicetime:\nfor exmple: a 0 100\n"); for(i=0;i<=N-1;i++) { printf("input the %dth process's information:\n",i+1); scanf("%s%f%f",&p[i].name,&p[i].arrivetime,&p[i].servicetime); } } //定义一个输出函数 void Print(sjf *p,float arrivetime,float servicetime,float starttime,float finishtime,float zztime,float dqzztime,int N) { int k; printf("run order:");//执行顺序 printf("%s",p[0].name); for(k=1;k%s",p[k].name); } printf("\nthe process's information:\n"); printf("\nname\tarrive\tservice\tstart\tfinish\tzz\tdqzz\n"); for(k=0;k<=N-1;k++) { printf("%s\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t\n",p[k].name,p[k].arrivetime,p[k].servicetime,p[k].starttime,p[k].finishtime,p[k].zztime,p[k].dqzztime); } } //按到达时间排序 void sort(sjf *p,int N) { for(int i=0;i<=N-1;i++) for(int j=0;j<=i;j++) if(p[i].arrivetime<p[j].arrivetime) { sjf temp; temp=p[i]; p[i]=p[j]; p[j]=temp; } } //运行阶段 void deal(sjf *p, float arrivetime,float servicetime,float starttime,float finishtime,float &zztime,float &dqzztime,int N) { int k; for(k=0;k=p[k].arrivetime) { p[k].starttime=p[k-1].finishtime;} else { p[k].starttime =p[k].arrivetime;} p[k].finishtime=p[k].starttime+p[k].servicetime; } } for(k=0;k<=N-1;k++) { p[k].zztime=p[k].finishtime-p[k].arrivetime;//周转时间=完成时间-到达时间 p[k].dqzztime=p[k].zzti
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值