作业调度:单道系统下FCFS、SJF、HRRN以及多道系统下FCFS、优先级调度代码设计

8 篇文章 0 订阅 ¥99.00 ¥99.00

原题:实验二 作业调度---设计测试实验

1.编写并调试一个单道系统的作业调度模拟程序。

调度模型:描述调度模型(可以采用模块化方法并用框图说明)

开始程序,选择调度算法,然后输入作业信息。不论选什么调度算法,作业均按到达先后顺序排队。如果是FCFS模式,每次调度时取出队头作业运行;如果是SJF模式,每次调度遍历队列,找到已到达作业中运行时间最少的,并取出运行;如果是HRRN模式,每次调度遍历队列,找到已到达作业中响应比最大的,并取出运行。作业运行时,计算该作业的运行数据(完成时间,周转时间、带权周转时间等)并打印,且更新这组作业的总周转时间和总带权周转时间。所有作业运行完以后,计算这组作业的平均周转时间和平均带权周转时间。

作业调度算法:分别采用FCFS、SJF、HRRN的调度算法

要求:

1)定义JCB并操作之。

2)描述作业队列。

一个就绪队列,作业按到达先后顺序排队。

3)对每种算法都要求打印每个作业的开始运行时刻、完成时刻、周转时间、带权周转时间,以及这组作业的平均周转时间和带权平均周转时间。比较各种算法的优缺点。

FCFS算法只考虑作业的等待时间,忽视了作业的运行时间,不利于短作业。而SJF算法正好与之相反,只考虑作业运行时间,而忽视了作业的等待时间,不利于长作业。HRRN算法则是既考虑了作业的等待时间,又考虑了作业的运行时间,因此既照顾了短作业,又不致使长作业的等待时间过长,从而改善了处理机调度的性能。不过在某些特殊情况下,HRRN算法的调度结果可能和FCFS算或SJF算法的相同。

编写代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define getjcb(type) (type*)malloc(sizeof(type))

int n;//作业数
float T1=0,T2=0;//所有作业周转时间、带权周转时间总和
int times=0;//系统时间

struct jcb//作业控制块
{
    char name[10];//作业标识符或作业名称
    int reachtime;//到达时刻
    int starttime;//开始运行时刻
    int needtime;//要求服务时间
    int finishtime;//作业完成时刻
    float cycletime;//作业周转时间
    float cltime;//带权周转时间
    char state;//作业状态,R即Ready,W即Waiting,F即Finished
    struct jcb *next;//指向作业队列下一个作业的JCB
}*ready=NULL,*p,*q;//分别指向队头作业、当前作业,q作为辅助
typedef struct jcb JCB;

void inital()//建立作业控制块队列,按先来先服务模式排队
{
    int i;
    printf("\n输入作业数:\n");
    scanf("%d", &n);
    for(i = 0; i<n; i++)
    {
        p = getjcb(JCB);

        printf("\n\n输入作业名:\n");
        scanf("%s", p->name);

        p->reachtime = i;
        printf("\n作业默认到达时间:\n%d\n", i);

        printf("\n输入作业要运行的时间:\n");
        scanf("%d", &p->needtime);

        p->state ='W';
        p->next =NULL;
        if(ready ==NULL)//如果队空
            ready = q = p;//插入到队头
        else//否则队非空
        {
            q->next = p;//插入到队尾
            q = p;
        }

        getchar();//接收信号,继续执行程序
    }
}

void disp(JCB *q,int m)//显示作业的周转时间及带权周转时间等
{
    printf("\n作业%s正在运行,估计其运行情况:\n",q->name);
    printf("开始运行时刻:%d\n",q->starttime);
    printf("完成时刻:%d\n",q->finishtime);
    printf("周转时间:%f\n",q->cycletime);
    printf("带权周转时间:%f\n",q->cltime);
}

void running(JCB *p,int m)//运行作业
{
    //先将要运行的作业从队列中分离出来
    if(p == ready)//如果要运行作业在队头
    {
        ready = p->next;//分离队头
        p->next =NULL;
    }
    else//否则从队头逐个查找
    {
        q = ready;
        while(q->next!= p) q=q->next;
        q->next = p->next;//找到后分离
    }

    //计算作业的完成时间,周转时间等等
    p->starttime = times;
    p->state ='R';
    p->finishtime = p->starttime + p->needtime;
    p->cycletime = (float)(p->finishtime - p->reachtime);
    p->cltime = (float)(p->cycletime / p->needtime);
    T1 += p->cycletime;
    T2 += p->cltime;
    disp(p, m);//显示计算数据

    //作业完成,更新系统时间,删除作业
    times += p->needtime;
    p->state ='F';
    printf("\n%s has been finished!\n", p->name);
    free(p);

    getchar();//接收信号以继续运行程序
}

void final()//所有作业运行完后打印平均周转时间,平均带权周转时间
{
    float s,t;
    t=T1/n;
    s=T2/n;
    printf("\n\n作业已经全部完成!\n");
    printf("\n%d个作业的平均周转时间是:%f",n,t);
    printf("\n%d个作业的平均带权周转时间是:%f\n",n,s);
}

void sjf(int m)//最短作业优先模式
{
    JCB *min;//指向最短作业
    int i,iden;
    system("cls");//清屏
    inital();//建立作业控制块队列,并初始化
    for(i=0;i<n;i++)
    {
        p=min=ready;//从队头开始
        iden=1;
        do{//寻找最短作业
            if(p->state=='W'&&p->reachtime<=times)
                if(iden)//找到第一个在此刻或之前到达的待运行作业
                {
                    min=p;
                    iden=0;
                }
                else if(p->needtime<min->needtime) min=p;
            p=p->next;
        }while(p!=NULL);

        if(iden)//此刻之前没有作业到达
        {
            i--;//纠正已完成作业数量
            times++;//更新系统时间
            if(times>100)//判断等待作业到达时间是否过长
            {
                printf("\nruntime is too long … error\n");
                getchar();
            }
        }
        else//否则运行作业
        {
            running(min, m);
        }
    }

    final();//所有作业运行完后查看平均周转时间、平均带权周转时间
}

void fcfs(int m)//先来先服务模式
{

    int i, iden;
    system("cls");//清屏
    inital();//建立作业控制块队列,并初始化
    for(i = 0; i<n; i++)
    {
        p = ready;//从队头开始
        iden = 1;

        do{
            //找到第一个在此刻或之前到达的待运行作业
            if(p->state =='W'&&p->reachtime <= times) iden = 0;
            //没找到则继续找
            if(iden) p = p->next;
        }while(p!=NULL&&iden);//直到找到为止或者找到队尾

        if(iden)//没有找到一个在此刻之前到达的待运行作业
        {
            i--;//纠正已完成作业数
            printf("\n没有满足要求的进程,需等待\n");
            times++;//更新系统时间

            if(times>100)//判断等待时间是否过长
            {
                printf("\n时间过长!\n");
            }
        }
        else//否则运行作业
        {
            running(p, m);
        }
    }

    final();//所有作业运行完后查看平均周转时间、平均带权周转时间
}

void hrrn(int m)//最高响应比优先模式
{
    JCB *max;//指向响应比最高的作业
    int i,iden;
    float a,b;
    system("cls");
    inital();
    for(int i=0;i<n;i++)
    {
        p=max=ready;
        iden=1;

        do{//寻找最高响应比作业
            if(p->state=='W'&&p->reachtime<=times)
                if(iden)//找到第一个在此刻或之前到达的待运行作业
                {
                    max=p;
                    iden=0;
                    //计算响应比
                    a=times-max->reachtime+max->needtime;
                    a/=max->needtime;
                }
                else {
                    //计算响应比
                    b=times-p->reachtime+p->needtime;
                    b/=p->needtime;
                    if(a<b){//更新最大响应比
                        a=b;
                        max=p;
                    }
                }
            p=p->next;
        }while(p!=NULL);

        if(iden)//此刻之前没有作业到达
        {
            i--;//纠正已完成作业数量
            times++;//更新系统时间
            if(times>100)//判断等待作业到达时间是否过长
            {
                printf("\nruntime is too long … error\n");
                getchar();
            }
        }
        else//否则运行作业
        {
            running(max, m);
        }
    }

    final();
}

void menu()//提供服务菜单
{
    int m;//存储用户选择
    system("cls");//清屏
    printf("\n\n\t\t*********************************************\t\t\n");
    printf("\t\t\t\t作业调度演示\n");
    printf("\t\t*********************************************\t\t\n");
    printf("\n\n\n\t\t\t1.先来先服务算法.");
    printf("\n\t\t\t2.最短作业优先算法.");
    printf("\n\t\t\t3.最高响应比优先算法.");
    printf("\n\t\t\t0.退出程序.");
    printf("\n\n\t\t\t\t选择所要操作:");
    scanf("%d", &m);//接收用户选择
    switch (m)//进行服务
    {
        case 1:
            fcfs(m);
            getchar();
            system("cls");
            break;
        case 2:
            sjf(m);
            getchar();
            system("cls");
            break;
        case 3:
            hrrn(m);
            getchar();
            system("cls");
            break;
        case 0:
            system("cls");
            break;
        default:
            printf("选择错误,重新选择.\n");
            getchar();
            system("cls");
            menu();
    }
}

int main()
{
    menu();//打开菜单,提供服务
    system("pause");//终端窗口停靠
    return 0;
}

2.编写并调试一个多道系统的作业调度模拟程序。

调度模型:描述多道调度模型(可以采用模块化方法并用框图说明)

作业按到达先后顺序排队,调度时取出后备队列队头,一次取完作业所有需要的资源,如果不能满足作业需求,作业将被置阻塞态,放回到队尾,然后取出后备队列队头并判断是否能运行,重复该过程直到找到能运行的作业,如果找不到,该CPU将处于空闲状态。

作业调度算法:FCFS

要求:

1)定义JCB并操作之。

2)描述作业队列。

一个后备队列,初始时按FCFS模式排队。

3)定义多道系统中的各种资源种类及数量,调度作业时必须考虑到每个作业的资源需求。

双核CPU,3种资源,总数分别为10、5、7。

设计代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define getjcb(type) (type*)malloc(sizeof(type))

int n;//作业数
float T1 = 0, T2 = 0;//所有作业周转时间、带权周转时间总和
int times[2] = { 0,0 };//双核系统的时间
int available[3] = { 10,5,7 };//系统资源总数

struct jcb//作业控制块
{
    char name[10];//作业标识符或作业名称
    int reachtime;//到达时刻
    int starttime;//开始运行时刻
    int needtime;//要求服务时间
    int finishtime;//作业完成时刻
    float cycletime;//作业周转时间
    float cltime;//带权周转时间
    char state;//作业状态,R即Ready,W即Waiting,B即Block
    int need[3];//作业对系统资源的需求
    int CPU;
    struct jcb* next;//指向作业队列下一个作业的JCB
}*ready = NULL, * p, * q[2];//分别指向队头作业、当前作业
//核1使用q[0],核2使用q[1]
typedef struct jcb JCB;

void insert()/*按先来后到顺序创建就绪队列*/
{
    JCB* first, * second;
    if (ready == NULL)/*若队空*/
    {
        //插入到队首
        p->next = ready;
        ready = p;
    }
    else/*否则应插入到队尾*/
    {
        first = ready;
        second = first->next;
        while (second != NULL)//寻找队尾
        {
            first = second;
            second = second->next;
        }
        //插入
        first->next = p;
    }
}

void inital()//初始化函数
{
    int i, j;
    printf("\n输入作业数:\n");
    scanf("%d", &n);
    for (i = 0; i < n; i++)
    {
        p = getjcb(JCB);
        printf("\n\n输入第%d个作业名:\n", i + 1);
        scanf("%s", p->name);

        p->reachtime = i;
        printf("\n第%d个作业默认到达时间:\n%d\n", i + 1, i);

        printf("\n输入第%d个作业要运行的时间:\n", i + 1);
        scanf("%d", &p->needtime);

        for (j = 0; j < 3; j++)
        {
            printf("\n输入作业对第%d类资源需求:", j + 1);
            scanf("%d", &p->need[j]);
            if (p->need[j] > available[j]) {
                printf("作业资源需求超出系统支持范围!无法进行调度。");
                exit(0);
            }
        }

        p->state = 'W';
        p->next = NULL;
        insert();
        getchar();//接收信号,继续执行程序
    }
}

void finish(JCB* q)//显示作业的周转时间及带权周转时间等
{
    printf("\n作业%s正在运行,估计其运行情况:\n", q->name);
    printf("到达时刻:%d\n", q->reachtime);
    printf("开始运行时刻:%d\n", q->starttime);
    printf("完成时刻:%d\n", q->finishtime);
    printf("周转时间:%f\n", q->cycletime);
    printf("带权周转时间:%f\n", q->cltime);
}

void disp(JCB* pr)//显示后备队列作业
{
    printf("\nname    state   reachtime  needtime  need\n");
    printf("|%s\t", pr->name);
    printf("|%c\t", pr->state);
    printf("|%d\t", pr->reachtime);
    printf("|%d\t", pr->needtime);
    printf("|%d %d %d", pr->need[0], pr->need[1], pr->need[2]);
    printf("\n");
}

void check()
{
    JCB* pr;
    pr = ready;
    printf("\n ****当前后备队列状态为:\n");/*显示后备队列作业*/
    while (pr != NULL) {
        disp(pr);
        pr = pr->next;
    }
}

int space()
{
    if (ready == NULL) return 0;
    if (ready->next == NULL) return 1;
    int sum = 0;
    JCB* pr;
    pr = ready;
    while (pr != NULL)
    {
        sum++;
        pr = pr->next;
    }
    return sum;
}

void running(int m)//m+1号CPU运行作业
{
    if (ready == NULL) return;

    int sum = space(), num = 0, flag = 1;

    do {
        //先将要运行的作业从队列中分离出来
        q[m] = ready;
        ready = q[m]->next;//分离队头
        q[m]->next = NULL;

        num++;

        //判断系统资源是否充足
        if (q[m]->need[0] <= available[0] &&
            q[m]->need[1] <= available[1] &&
            q[m]->need[2] <= available[2]) {
            flag = 0;
            break;
        }
        else {
            q[m]->CPU = m;
            q[m]->state = 'B';
            p = q[m];
            insert();
        }
    } while (num != sum);

    if (flag) {
        printf("\n当前没有可运行的作业!\n");
        printf("核%d空闲!", m + 1);
        q[m] = NULL;
        if(m){
            times[1]=times[0];
        }
        else times[0]=times[1];
        return;
    }

    //给作业分配资源
    available[0] -= q[m]->need[0];
    available[1] -= q[m]->need[1];
    available[2] -= q[m]->need[2];

    //计算作业的完成时间,周转时间等等
    if (q[m]->state == 'B') {//如果作业之前被阻塞
        times[m] = q[m]->starttime = times[q[m]->CPU];
    }
    else q[m]->starttime = times[m];
    if (q[m]->reachtime > times[m]) {//如果作业还没到达
        times[m] = q[m]->starttime= q[m]->reachtime;
    }
    else q[m]->starttime = times[m];
    q[m]->state = 'R';
    q[m]->finishtime = q[m]->starttime + q[m]->needtime;
    q[m]->cycletime = (float)(q[m]->finishtime - q[m]->reachtime);
    q[m]->cltime = (float)(q[m]->cycletime / q[m]->needtime);
    T1 += q[m]->cycletime;
    T2 += q[m]->cltime;
    times[m]+=q[m]->needtime;//更新系统时间
    printf("\n核%d忙碌!", m + 1);
    finish(q[m]);//显示计算数据

    getchar();//接收信号以继续运行程序
}

void distory(int m)
{
    if (q[m] == NULL) return;
    //作业完成,归还资源,删除作业
    printf("\n%s has been finished!\n", q[m]->name);
    available[0] += q[m]->need[0];
    available[1] += q[m]->need[1];
    available[2] += q[m]->need[2];
    free(q[m]);
    q[m] = NULL;
}

void final()//所有作业运行完后打印平均周转时间,平均带权周转时间
{
    float s, t;
    t = T1 / n;
    s = T2 / n;
    printf("\n\n作业已经全部完成!\n");
    printf("\n%d个作业的平均周转时间是:%f", n, t);
    printf("\n%d个作业的平均带权周转时间是:%f\n", n, s);
}

void fcfs()//先来先服务模式
{
    system("cls");//清屏
    inital();//建立作业控制块队列,并初始化
    running(0);
    running(1);
    distory(0);
    distory(1);
    check();
    while (ready != NULL)
    {
        if (times[0] <= times[1]) {
            running(0);
            running(1);
            distory(0);
            distory(1);
        }
        else {
            running(1);
            running(0);
            distory(1);
            distory(0);
        }
        check();
    }
    final();//所有作业运行完后查看平均周转时间、平均带权周转时间
}

int main()
{
    q[0] = q[1] = NULL;
    fcfs();//进行双核下的FCFS作业调度
    system("pause");//终端窗口停靠
    return 0;
}

3.编写并调试一个多道程序系统的作业调度模拟程序。

调度模型:描述多道调度模型(可以采用模块化方法并用框图说明)

输入作业信息,为作业创建JCB,并按优先级规则在就绪队列里排好队。调度时先检查阻塞队列是否为空,如果为空则从就绪队列取出队首,判断系统资源是否足够,如果足够就运行,否则将其置为阻塞态,插入阻塞队列队尾,并取出就绪队列队头,判断系统资源是否足够,重复此操作直到找到可以运行的作业,如果找不到该CPU就会处于空闲。如果阻塞队列不为空,取出阻塞队列队首,判断系统资源是否足够,如果足够就运行,否则将其插回阻塞队列队尾,重复此过程直到找到可以运行的作业,如果找不到,就到就绪队列找,如果就绪队列里也找不到,该CPU将处于空闲。

作业调度算法:采用基于优先级的作业调度。

要求:

1)自己设计实现一个确定优先级的方法。

作业紧迫程度分3个等级,3为危急,2为一般,1为可推延。作业按紧迫程度降序排队,相同紧迫度的作业之间按FCFS模式排队。——此即优先级规则。

2)定义JCB并操作之。

3)描述作业队列。

一个就绪队列,一个阻塞队列,就绪队列按优先级规则排序,阻塞队列按FCFS模式排队。

4)定义多道系统中的各种资源种类及数量,调度作业时必须考虑到每个作业的资源需求。

双核CPU,优先使用核2,三种系统资源,总数分别为10,5,7。

代码背景同第2题。编写代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define getjcb(type) (type*)malloc(sizeof(type))

int n;//作业数
float T1 = 0, T2 = 0;//所有作业周转时间、带权周转时间总和
int times[2] = { 0,0 };//双核系统的时间
int available[3] = { 10,5,7 };//系统资源总数

struct jcb//作业控制块
{
    char name[10];//作业标识符或作业名称
    int reachtime;//到达时刻
    int starttime;//开始运行时刻
    int needtime;//要求服务时间
    int finishtime;//作业完成时刻
    float cycletime;//作业周转时间
    float cltime;//带权周转时间
    char state;//作业状态,R即Ready,W即Waiting,B即Block
    int need[3];//作业对系统资源的需求
    int CPU;//被何cpu投入阻塞队列
    int sign;//紧急程度
    struct jcb* next;//指向作业队列下一个作业的JCB
}*ready[2], * p[2], * q[2];//分别指向队头作业、当前作业
//对于ready和p,0表示就绪队列,1表示阻塞队列,对于q,0表示核1,1表示核2
typedef struct jcb JCB;

void sort(int m)/*对作业进行优先级排序函数*/
{
    JCB* first, * second;
    if (m) {//m=1,阻塞队列
        if (ready[m] == NULL) {
            p[m]->next = ready[m];
            ready[m] = p[m];
        }
        else {
            first = ready[m];
            second = first->next;
            while (second != NULL) {
                first = second;
                second = first->next;
            }
            first->next = p[m];
        }
        return;
    }
    int insert = 0;//表示插入状态
    if ((ready[m] == NULL) || ((p[m]->sign) > (ready[m]->sign)))/*若队空或插入作业优先数比当前队首大*/
    {
        //插入到队首
        p[m]->next = ready[m];
        ready[m] = p[m];
    }
    else /*作业比较优先级,插入适当的位置中*/
    {
        first = ready[m];
        second = first->next;
        while (second != NULL)//未到达队尾或未成功插入
        {
            if ((p[m]->sign) > (second->sign))/*若插入作业比当前进程优先级大*/
            {
                /*插入到当前作业前面*/
                p[m]->next = second;
                first->next = p[m];
                second = NULL; //提前终止循环
                insert = 1; //插入成功
            }

            else//与下一个作业比较
            {
                first = second;
                second = second->next;
            }
        }
        //到达队尾仍未成功插入,说明插入作业优先级最低
        if (insert == 0) first->next = p[m];//插入到队尾
    }
}

void inital()//初始化函数
{
    int i, j;
    printf("\n输入作业数:\n");
    scanf("%d", &n);
    for (i = 0; i < n; i++)
    {
        p[0] = getjcb(JCB);
        printf("\n\n输入第%d个作业名:\n", i + 1);
        scanf("%s", p[0]->name);

        p[0]->reachtime = i/2;//同一时刻可以到达两道作业
        printf("\n第%d个作业默认到达时间:\n%d\n", i + 1, p[0]->reachtime);

        printf("\n输入第%d个作业要运行的时间:\n", i + 1);
        scanf("%d", &p[0]->needtime);

        printf("\n输入第%d个作业的紧迫程度:\n", i + 1);
        scanf("%d", &p[0]->sign);

        for (j = 0; j < 3; j++)
        {
            printf("\n输入作业对第%d类资源需求:", j + 1);
            scanf("%d", &p[0]->need[j]);
            if (p[0]->need[j] > available[j]) {
                printf("作业资源需求超出系统支持范围!无法进行调度。");
                exit(0);
            }
        }

        p[0]->state = 'W';
        p[0]->next = NULL;
        sort(0);
        getchar();//接收信号,继续执行程序
    }
}

void finish(JCB* q)//显示作业的周转时间及带权周转时间等
{
    printf("\n作业%s正在运行,估计其运行情况:\n", q->name);
    printf("到达时刻:%d\n", q->reachtime);
    printf("开始运行时刻:%d\n", q->starttime);
    printf("完成时刻:%d\n", q->finishtime);
    printf("周转时间:%f\n", q->cycletime);
    printf("带权周转时间:%f\n", q->cltime);
}

void disp(JCB* pr)//显示队列中的作业
{
    printf("\nname    state  reachtime  needtime  need  sign\n");
    printf("|%s\t", pr->name);
    printf("|%c\t", pr->state);
    printf("|%d\t", pr->reachtime);
    printf("|%d\t", pr->needtime);
    printf("|%d %d %d", pr->need[0], pr->need[1], pr->need[2]);
    printf("|%d\t", pr->sign);
    printf("\n");
}

void check()
{
    JCB* pr;
    pr = ready[0];
    printf("\n ****当前就绪队列状态为:\n");/*显示就绪队列作业*/
    while (pr != NULL) {
        disp(pr);
        pr = pr->next;
    }
    printf("\n ****当前阻塞队列状态为:\n");/*显示就绪队列作业*/
    pr = ready[1];
    while (pr != NULL) {
        disp(pr);
        pr = pr->next;
    }
}

int space(int m)
{
    if (ready[m] == NULL) return 0;
    if (ready[m]->next == NULL) return 1;
    int sum = 0;
    JCB* pr;
    pr = ready[m];
    while (pr != NULL)
    {
        sum++;
        pr = pr->next;
    }
    return sum;
}

void running(int m)//m+1号CPU运行作业
{
    if (ready[0] == NULL && ready[1] == NULL) return;

    int sum_R = space(0), sum_B=space(1),num = 0, flag = 1;

    if (sum_B) {//阻塞队列非空
        do {
            //先将要运行的作业从队列中分离出来
            q[m] = ready[1];
            ready[1] = q[m]->next;//分离队头
            q[m]->next = NULL;

            num++;

            //判断系统资源是否充足
            if (q[m]->need[0] <= available[0] &&
                q[m]->need[1] <= available[1] &&
                q[m]->need[2] <= available[2]) {
                flag = 0;
                break;
            }
            else {
                q[m]->CPU = m;
                q[m]->state = 'B';
                p[1] = q[m];
                sort(1);
            }
        } while (num != sum_B);

        if (flag&&sum_R) {//阻塞队列没有可运行作业,从就绪队列中找
            num = 0;
            do {
                //先将要运行的作业从队列中分离出来
                q[m] = ready[0];
                ready[0] = q[m]->next;//分离队头
                q[m]->next = NULL;

                num++;

                //判断系统资源是否充足
                if (q[m]->need[0] <= available[0] &&
                    q[m]->need[1] <= available[1] &&
                    q[m]->need[2] <= available[2]) {
                    flag = 0;
                    break;
                }
                else {
                    q[m]->CPU = m;
                    q[m]->state = 'B';
                    p[1] = q[m];
                    sort(1);
                }
            } while (num != sum_R);
        }

        if (flag) {
            printf("\n当前没有可运行的作业!\n");
            printf("核%d空闲!", m + 1);
            q[m] = NULL;
            if (m) {
                times[1] = times[0];
            }
            else times[0] = times[1];
            return;
        }
    }

    else if (sum_R) {//阻塞队列为空,就绪队列不为空
        do {
            //先将要运行的作业从队列中分离出来
            q[m] = ready[0];
            ready[0] = q[m]->next;//分离队头
            q[m]->next = NULL;

            num++;

            //判断系统资源是否充足
            if (q[m]->need[0] <= available[0] &&
                q[m]->need[1] <= available[1] &&
                q[m]->need[2] <= available[2]) {
                flag = 0;
                break;
            }
            else {
                q[m]->CPU = m;
                q[m]->state = 'B';
                p[1] = q[m];
                sort(1);
            }
        } while (num != sum_R);

        if (flag) {
            printf("\n当前没有可运行的作业!\n");
            printf("核%d空闲!", m + 1);
            q[m] = NULL;
            if (m) {
                times[1] = times[0];
            }
            else times[0] = times[1];
            return;
        }
    }

    //给作业分配资源
    available[0] -= q[m]->need[0];
    available[1] -= q[m]->need[1];
    available[2] -= q[m]->need[2];

    //计算作业的完成时间,周转时间等等
    if (q[m]->reachtime > times[m]) {//如果作业还没到达
        times[m] = q[m]->starttime= q[m]->reachtime;
    }
    else q[m]->starttime = times[m];
    q[m]->state = 'R';
    q[m]->finishtime = q[m]->starttime + q[m]->needtime;
    q[m]->cycletime = (float)(q[m]->finishtime - q[m]->reachtime);
    q[m]->cltime = (float)(q[m]->cycletime / q[m]->needtime);
    T1 += q[m]->cycletime;
    T2 += q[m]->cltime;
    times[m] += q[m]->needtime;//更新系统时间
    printf("\n核%d忙碌!", m + 1);
    finish(q[m]);//显示计算数据

    getchar();//接收信号以继续运行程序
}

void distory(int m)
{
    if (q[m] == NULL) return;
    //作业完成,归还资源,删除作业
    printf("\n%s has been finished!\n", q[m]->name);
    available[0] += q[m]->need[0];
    available[1] += q[m]->need[1];
    available[2] += q[m]->need[2];
    free(q[m]);
    q[m] = NULL;
}

void final()//所有作业运行完后打印平均周转时间,平均带权周转时间
{
    float s, t;
    t = T1 / n;
    s = T2 / n;
    printf("\n\n作业已经全部完成!\n");
    printf("\n%d个作业的平均周转时间是:%f", n, t);
    printf("\n%d个作业的平均带权周转时间是:%f\n", n, s);
}

void control()//基于优先级模式
{
    system("cls");//清屏
    inital();//建立作业控制块队列,并初始化
    running(0);
    running(1);
    distory(0);
    distory(1);
    check();
    while (ready[0] != NULL || ready[1]!= NULL)
    {
        if (times[0] < times[1]) {
            running(0);
            running(1);
            distory(0);
            distory(1);
        }
        else {
            running(1);
            running(0);
            distory(1);
            distory(0);
        }
        check();
    }
    final();//所有作业运行完后查看平均周转时间、平均带权周转时间
}

int main()
{
    q[0] = q[1] = NULL;
    p[0] = p[1] = NULL;
    ready[0] = ready[1] = NULL;
    control();//进行双核下的基于优先级作业调度
    system("pause");//终端窗口停靠
    return 0;
}

 

  • 9
    点赞
  • 73
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赴星辰大海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值