操作系统实验二  作业调度实验
一、目的要求
用高级语言编写和调试一个或多个作业调度的模拟程序,以加深对作业调度算法的理解。
1. 编写并调试一个单道处理系统的作业等待模拟程序。
作业等待算法:分别采用先来先服务(FCFS),最短作业优先(SJF)、响应比高者优先(HRN)的调度算法。
对每种调度算法都要求打印每个作业开始运行时刻、完成时刻、周转时间、带权周转时间,以及这组作业的平均周转时间及带权平均周转时间,以比较各种算法的优缺点。
#include "stdio.h"
#include <stdlib.h>
#include <conio.h>
#define getpch(type) (type*)malloc(sizeof(type))
//#define NULL 0
struct worktime{
    float Tb;            //作业运行时刻
    float Tc;            //作业完成时刻
    float Ti;            //周转时间
    float Wi;            //带权周转时间
};
struct jcb { /*定义作业控制块JCB */
    char name[10];        //作业名
    float subtime;        //作业提交时间
    float runtime;        //作业所需的运行时间
    char resource;      //所需资源
    float Rp;              //后备作业响应比
    char state;            //作业状态
    struct worktime wt;
    struct jcb* link;    //链指针
}*jcb_ready=NULL,*j;
typedef struct jcb JCB;
float T=0;
void sort() /* 建立对作业进行提交时间排列函数*/
{
    JCB *first, *second;
    int insert=0;
    if((jcb_ready==NULL)||((j->subtime)<(jcb_ready->subtime))) /*作业提交时间最短的,插入队首*/
    {
        j->link=jcb_ready;
        jcb_ready=j;
        T=j->subtime;
        j->Rp=1;
    }
    else /* 作业比较提交时间,插入适当的位置中*/
    {
        first=jcb_ready;
        second=first->link;
        while(second!=NULL)
        {
            if((j->subtime)<(second->subtime)) /*若插入作业比当前作业提交时间短,*/
            { /*插入到当前作业前面*/
                j->link=second;
                first->link=j;
                second=NULL;
                insert=1;
            }
            else /* 插入作业优先数最低,则插入到队尾*/
            {
                first=first->link;
                second=second->link;
            }
        }
        if (insert==0) first->link=j;
    }
}
void SJFget()/* 获取队列中的最短作业 */
{
    JCB *front,*mintime,*rear;
    int ipmove=0;
    mintime=jcb_ready;
    rear=mintime->link;
    while(rear!=NULL)
    {
        if ((rear!=NULL)&&(T>=rear->subtime)&&(mintime->runtime)>(rear->runtime))
        {
            front=mintime;
            mintime=rear;
            rear=rear->link;
            ipmove=1;
        }
        else
            rear=rear->link;
    }
    if (ipmove==1){
        front->link=mintime->link;
        mintime->link=jcb_ready;
    }
    jcb_ready=mintime;
}
void HRNget()/* 获取队列中的最高响应作业 */
{
    JCB *front,*mintime,*rear;
    int ipmove=0;
    mintime=jcb_ready;
    rear=mintime->link;
while(rear!=NULL)
{
        if ((rear!=NULL)&&(T>=rear->subtime)&&(mintime->Rp)<(rear->Rp))
        {
            front=mintime;
            mintime=rear;
            rear=rear->link;
            ipmove=1;
        }
        else
            rear=rear->link;
    }
    if (ipmove==1){
        front->link=mintime->link;
        mintime->link=jcb_ready;
    }
    jcb_ready=mintime;
}
void input() /* 建立作业控制块函数*/
{
    int i,num;
    printf("\n 请输入作业数:?");
    scanf("%d",&num);
    for(i=0;i<num;i++)
    {
        printf("\n 作业号No.%d:\n",i);
        j=getpch(JCB);
        printf("\n 输入作业名:");
        scanf("%s",j->name);
        printf("\n 输入作业提交时刻:");
        scanf("%f",&j->subtime);
        printf("\n 输入作业运行时间:");
        scanf("%f",&j->runtime);
        printf("\n");
        j->state='w';
        j->link=NULL;
        sort(); /* 调用sort函数*/
    }
}
int space()
{
    int l=0; JCB* jr=jcb_ready;
    while(jr!=NULL)
    {
        l++;
        jr=jr->link;
    }
    return(l);
}
void disp(JCB* jr,int select) /*建立作业显示函数,用于显示当前作业*/
{
    if (select==3) printf("\n 作业  服务时间  响应比  运行时刻  完成时刻  周转时间  带权周转时间 \n");
    else printf("\n 作业  服务时间  运行时刻  完成时刻  周转时间  带权周转时间 \n");
    printf(" |%s\t",jr->name);
    printf(" |%.2f\t ",jr->runtime);
    if (select==3) printf(" |%.2f    ",jr->Rp);
    if (j==jr){
        printf(" |%.2f\t",jr->wt.Tb);
        printf(" |%.2f  ",jr->wt.Tc);
        printf(" |%.2f \t",jr->wt.Ti);
        printf(" |%.2f",jr->wt.Wi);
    }
    printf("\n");
}
void destroy() /*建立作业撤消函数(作业运行结束,撤消作业)*/
{
    printf("\n 作业 [%s] 已完成.\n",j->name);
    free(j);
}
void check(int select) /* sort of link什么意思建立作业查看函数 */
{
    JCB* jr;
    printf("\n **** 当前正在运行的作业是:%s",j->name); /*显示当前运行作业*/
    disp(j,select);
    jr=jcb_ready;
    printf("\n ****当前就绪队列状态为:\n"); /*显示就绪队列状态*/
    while(jr!=NULL)
    {
        jr->Rp=(T-jr->subtime)/jr->runtime;
        disp(jr,select);
        jr=jr->link;
    }
    destroy();
}
void running(JCB* jr) /* 建立作业就绪函数(作业运行时间到,置就绪状态*/

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。