• 作业调度算法


    #include <stdio.h>
    
    #include <string.h>
    #include <conio.h>/*conio.h是一个包含一些字符处理函数的头文件,如getch(),
    getch()是无显示的从键盘接收一个字符,有显示的接收是getchar()*/
    
    typedef char string[10]; /* //定义string为含有10个字符元素的字符数组类型*/
    struct task {
        string name;  /*作业号*/
        int arrTime; /* 作业到达时间*/
        int serTime; /*作业要求服务时间*/
        int waiTime; /*等待时间*/
        int begTime; /*开始运行时间*/
        int finTime; /*结束运行时间*/
        int turTime; /*周转时间*/
        int wTuTime; /*带权周转时间*/
        int priority;/*优先权*/
        int finish;/*是否已经完成*/
    }JCB[5];
    
    int num;         
    void input()
    {
        int i;
        system("cls");
        printf("\nPlease input task number: ");
        scanf("%d", &num);
        for(i=0;i<num;i++)
        {
            printf("\nPlease input task NO.%d:\n",i);
            printf("  The name of task: ");
            scanf("%s",JCB[i].name);
            printf("  The time arrive:  ");
            scanf("%d",&JCB[i].arrTime);
            printf("  The time need:    ");
            scanf("%d",&JCB[i].serTime);
            JCB[i].priority = 0;
            JCB[i].finish =0;
        }
    }
    
    int FCFS()
    {
        int current;
        int i,j;
        for(i=0; i<num; i++)
        {
            if(!JCB[i].finish)
            {
                current=i; /* 找到第一个还没完成的作业*/
                break;
            }
        }
        for( j=i; j<num; j++) /* 和后面的作业比较*/
        {
            if(!JCB[j].finish && JCB[j].arrTime<JCB[current].arrTime)
            {
                current=j; /*找出先来的未完成作业*/
    
            }
        }
        return current; /* 返回当前作业*/
    }
    
    int SJF(int pre)
    {
        int current,i,j;
        for(i=0; i<num; i++)
        {
            if(!JCB[i].finish)
            {
                current=i; /*找到第一个还没完成的作业*/
    
                break;
            }
        }
        for(j=i; j<num; j++) /* 和后面的作业比较*/
    
        {
            if( !JCB[j].finish) /* 还没完成(运行)*/
            {
                if(JCB[current].arrTime<=JCB[pre].finTime)/*如果作业在上一个作业完成之前到达*/
    
                {
                    if(JCB[j].arrTime<=JCB[pre].finTime && JCB[j].serTime<JCB[current].serTime )
                        current=j; /* 找出到达时间在上一个作业完成之前,服务时间比较小的未完成作业*/
    
                }
                else /*如果作业是在上一个作业完成之后到达*/
    
                {
                    if(JCB[j].arrTime<JCB[current].arrTime)
                        current=j;  /*找出比较早到达的一个*/
    
                    if(JCB[j].arrTime==JCB[current].arrTime)  /*如果同时到达*/
    
                        if(JCB[j].serTime<JCB[current].serTime)
                            current=j; /*找出服务时间比较短的一个*/
          }
            }
        }
        return current;  /*返回当前作业*/
    
    }
    
    int HRN(int pre)
    {
        int current=1,i,j;
        /* 优先权 =(等待时间+服务时间)/服务时间*/
    
        for(i=0; i<num; i++)
        {
            JCB[i].waiTime=JCB[pre].finTime-JCB[i].arrTime; /*等待时间 =上一个作业的完成时间-到达时间*/
    
            JCB[i].priority=(JCB[i].waiTime+JCB[i].serTime)/JCB[i].serTime;
        }
        for(i=0; i<num; i++)
        {
            if(!JCB[i].finish)
            {
                current=i;  /*找到第一个还没完成的作业*/
    
                break;
            }
        }
        for( j=i; j<num; j++) /*和后面的作业比较*/
    
        {
            if( !JCB[j].finish) /* 还没完成(运行)*/
    
            {
                if(JCB[current].arrTime<=JCB[pre].finTime)  /*如果作业在上一个作业完成之前到达*/
    
                {
                    if(JCB[j].arrTime<=JCB[pre].finTime && JCB[j].priority>JCB[current].priority )
                        current=j;/* 找出到达时间在上一个作业完成之前,优先权高的作业*/
    
                }
                else /* 如果作业是在上一个作业完成之后到达*/
    
                {
                    if(JCB[j].arrTime<JCB[current].arrTime)
                        current=j;  /* 找出比较早到达的一个*/
    
                    if(JCB[j].arrTime==JCB[current].arrTime) /* 如果同时到达*/
    
                        if(JCB[j].priority>JCB[current].priority)
                            current=j; /*找出服务时间比较短的一个*/
    
                }
            }
        }
        return current;/*返回当前作业*/
    
    }
    void runing(int i, int times, int pre, int staTime, int endTime)
    {
        if(times==0)
        {
            JCB[i].begTime=JCB[i].arrTime;                        
            JCB[i].finTime=JCB[i].begTime+JCB[i].serTime; 
            JCB[i].turTime=JCB[i].serTime;                        
            JCB[i].wTuTime=1.0;                                        
            staTime=JCB[i].begTime;
        }
        else
        {
            if(JCB[i].arrTime>JCB[pre].finTime) 
                JCB[i].begTime=JCB[i].arrTime;  
            else
                JCB[i].begTime=JCB[pre].finTime; 
            JCB[i].finTime=JCB[i].begTime+JCB[i].serTime;
            JCB[i].turTime=JCB[i].finTime-JCB[i].arrTime; 
            JCB[i].wTuTime=JCB[i].turTime/JCB[i].serTime;    
        }
        if(times==num-1)
            endTime=JCB[i].finTime;
        JCB[i].finish=1;    
    }
    void print(int i,int times)
    {
        if(times==0)
        {
            printf("     name  arrTime  serTime  begTime  finTime  turTime  wTuTime\n");
        }
        printf("%9s%9d%9d%9d%9d%9df%9df\n",
            JCB[i].name,JCB[i].arrTime,JCB[i].serTime,
            JCB[i].begTime,JCB[i].finTime,JCB[i].turTime,JCB[i].wTuTime);
    }
    void check( )
    {
        int i;
        int staTime, endTime, sumTurTime=0.0, sumWTuTime=0.0, aveTurTime, aveWTuTime;
        int current=0, times=0, pre=0; 
        JCB[pre].finTime=0; 
        printf("\n-- FCFS -----------------------------------------------------------------\n");
        for(times=0; times<num; times++)
        {
            current=FCFS();
            runing(current, times, pre, staTime, endTime);
            print(current, times);
            pre=current;
        }
        for(i=0; i<num; i++)
            {
                sumTurTime+=JCB[i].turTime;
                sumWTuTime+=JCB[i].wTuTime;
            }
        aveTurTime=sumTurTime/num;
        aveWTuTime=sumWTuTime/num;
        printf("(total)                    %9.2f%9.2f%9.2f%9.2f\n",staTime,endTime,aveTurTime,aveWTuTime);
        printf("-------------------------------------------------------------------------\n");
        for(i=0; i<num; i++)
        {
            JCB[i].finish=0;    
        }
    
        staTime, endTime, sumTurTime=0.0, sumWTuTime=0.0, aveTurTime, aveWTuTime;
        current=0; times=0; pre=0;
        JCB[pre].finTime=0; 
        printf("\n-- SJF ------------------------------------------------------------------\n");
        for(times=0; times<num; times++)
        {
            current=SJF(pre);
            runing(current, times, pre, staTime, endTime);
            print(current, times);
            pre=current;
        }
        for(i=0; i<num; i++)
            {
                sumTurTime+=JCB[i].turTime;
                sumWTuTime+=JCB[i].wTuTime;
            }
        aveTurTime=sumTurTime/num;
        aveWTuTime=sumWTuTime/num;
        printf("(total)                    %9d%9d%9d%9d\n",staTime,endTime,aveTurTime,aveWTuTime);
        printf("-------------------------------------------------------------------------\n");
        for(i=0; i<num; i++)
        {
            JCB[i].finish=0;     
        }
    
        staTime, endTime, sumTurTime=0.0, sumWTuTime=0.0, aveTurTime, aveWTuTime;
        current=0; times=0; pre=0;
        JCB[pre].finTime=0; 
        printf("\n-- HRN ------------------------------------------------------------------\n");
        for(times=0; times<num; times++)
        {
            current=HRN(pre);
            runing(current, times, pre, staTime, endTime);
            print(current, times);
            pre=current;
        }
        for(i=0; i<num; i++)
            {
                sumTurTime+=JCB[i].turTime;
                sumWTuTime+=JCB[i].wTuTime;
            }
        aveTurTime=sumTurTime/num;
        aveWTuTime=sumWTuTime/num;
        printf("(total)                    %9d%9d%9d f%9df\n",staTime,endTime,aveTurTime,aveWTuTime);
        printf("-------------------------------------------------------------------------\n");
    }
    
    void main()
    {
        char again;
        do {
            system("cls");  /*清屏*/ 
            printf("please input 4 groups of datas:\n");
            input();
            check();
            printf("Continue...(Y/N): ");
            do{
                again = getch();
            }while(again!='Y' && again!='y' && again!='N' && again!='n');
        }while(again=='Y' || again=='y');
    }
  • 相关阅读:
    Python面试
    PyCharm快捷键
    PyCharm安装及使用
    Python环境搭建
    MYSQL的cmake编译单实例安装
    lamp和lnmp环境的搭建
    模拟解决DOS攻击的shell脚本
    责任链模式
    迭代器模式
    备忘录设计模式
  • 原文地址:https://www.cnblogs.com/iTues/p/4468124.html
Copyright © 2020-2023  润新知