码迷,mamicode.com
首页 > 其他好文 > 详细

【操作系统】实验二 模拟作业调度

时间:2016-04-21 23:41:06      阅读:484      评论:0      收藏:0      [点我收藏+]

标签:

 

一、目的和要求

1. 实验目的

(1)加深对作业调度算法的理解;

(2)进行程序设计的训练。

2.实验要求

用高级语言编写一个或多个作业调度的模拟程序。

单道批处理系统的作业调度程序。作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所运行的时间等因素。

作业调度算法:

采用先来先服务(FCFS)调度算法,即按作业到达的先后次序进行调度。总是首先调度在系统中等待时间最长的作业。

拓展内容:

  1. 每个作业的到达时间和所需运行时间随机数生产;
  2. 文件读取作业;
  3. 定义一个时间片slot,分步显示每个时刻作业调度的结果,显示运行作业和等待队列;
  4. 增加其他资源竞争,如内存资源,打印机,磁带机等;
  5. 增加2道程序系统设计;
  6. 允许用户在模拟过程中提交新作业。

 

 

#include<stdio.h>
#include<string.h>
#include<time.h>
typedef struct jcb{
    char name[10];//作业名
    int arrtime;//到达时间
    int reqtime;//要求服务时间
    int startime;//调度时间
    int finitime;//结束时间
    float TAtime,TAWtime;//周转时间,带权周转时间(周转时间/服务时间)
    int shebei1,shebei2;
}JCB;
int systime=0;
int intarr=0,intfin=0,intjob=0;//到达作业个数,完成作业个数,未到达作业个数
JCB jobarr[24],jobfin[24],job[24];

void Mune()
{
    printf("\n\n");
    printf("\t\t|------------------------------------------------|\n");
    printf("\t\t|                 作业调度模拟程序               |\n");
    printf("\t\t|------------------------------------------------|\n");
    printf("\t\t|       0:退出                                   |\n");
    printf("\t\t|       1:从文件读取输入                         |\n");
    printf("\t\t|       2:伪随机数产生                           |\n");
    printf("\t\t|       3:自己输入模拟数据                       |\n");
    printf("\t\t|------------------------------------------------|\n");
    printf("请选择<0~3>:");
}
//从文件读取
int ReadFile()
{
    int i=0;
    FILE *fp;     //定义文件指针
    fp=fopen("3.txt","r");  //打开文件
    if(fp==NULL)
    {
        printf("File open error !\n");
        exit(0);
    }
    while(!feof(fp))
    {
        fscanf(fp,"%s%d%d%d%d",&job[i].name,&job[i].arrtime,&job[i].reqtime,&job[i].shebei1,&job[i].shebei2);  //fscanf()函数将数据读入
        i++;
    };

    if(fclose(fp))     //关闭文件
    {
        printf("Can not close the file !\n");
        exit(0);
    }
    return i;

}
//伪随机数产生

void Pseudo_random_number()
{
    int i;
    char str[25];
    srand((unsigned)time(0));  //参数seed是rand()的种子,用来初始化rand()的起始值。
    //输入作业数
    intjob=rand()%23+5;
    for(i=1;i<=intjob;i++)
    {   
        itoa(i, str, 10);//数字转换成字符
        strcpy(job[i].name,str);
        //作业到达时间
        job[i].arrtime=rand()%29+1;
        //作业运行时间
        job[i].reqtime=rand()%7+1;
        //是否使用设备1
        job[i].shebei1=rand()%2;
        //是否使用设备2
        job[i].shebei2=rand()%2;
    }
}
void Input()//手动输入
{
    int i;
    int j;
    int n=0;
    printf("请输入作业个数:");
    scanf("%d",&n);
    for(i=0;i<n;i++,intjob++)
    {
        printf("\n第%d个作业:\n请输入作业名:",i+1);
        scanf("%s",job[intjob].name);
        do{
        printf("请输入到达时间:");
        scanf("%d",&job[intjob].arrtime);
        if(job[i].arrtime<systime)
            printf("到达时间小于当前系统时间!请重新输入:");
        }while(job[i].arrtime<systime);
        printf("请输入要求服务时间:");
        scanf("%d",&job[intjob].reqtime);
        printf("请输入占用设备I1的时间:");
        scanf("%f",&job[intjob].shebei1);
        printf("请输入占用设备I2的时间:");
        scanf("%f",&job[intjob].shebei2);
        job[i].startime=0;
        job[i].finitime=0;
        job[i].TAtime=0;
        job[i].TAWtime=0;
    }
    for(i=0;i<intjob;i++)//若输入到达时间为现在的系统时间
    {
        if(job[i].arrtime==systime)
        {
            jobarr[intarr]=job[i];
            for(j=i;j<=intjob;j++)
            {
                job[j]=job[j+1];

            }
            intarr++;
            intjob--;
            i--;
        }
        else if(job[i].arrtime<systime)
        {
            printf("到达时间小于当前系统时间!请重新输入");
        }
    }
}

void Output()//输出排序后队列
{
    int i;
    printf("\n\n\n未到达队列的是\n");
    printf("\tname\tarrime\treqtime\tstartime fintime TAtime\tTAWtime\tI1\tI2\n");
    for(i=0;i<intjob;i++){
        printf("N%d\t%s\t%d\t%d\t%d\t %d\t %.2f\t%.2f\t%d\t%d\n",i+1,job[i].name,job[i].arrtime,job[i].reqtime,job[i].startime,job[i].finitime,job[i].TAtime,job[i].TAWtime,job[i].shebei1,job[i].shebei2);
    }
    printf("\n已到达队列的是\n");
    printf("\tname\tarrime\treqtime\tstartime fintime TAtime\tTAWtime\tI1\tI2\n");
        for(i=0;i<intarr;i++){
        printf("N%d\t%s\t%d\t%d\t%d\t %d\t %.2f\t%.2f\t%d\t%d\n",i+1,jobarr[i].name,jobarr[i].arrtime,jobarr[i].reqtime,jobarr[i].startime,jobarr[i].finitime,jobarr[i].TAtime,jobarr[i].TAWtime,jobarr[i].shebei1,jobarr[i].shebei2);
    }
    printf("\n已完成队列的是\n");
    printf("\tname\tarrime\treqtime\tstartime fintime TAtime\tTAWtime\tI1\tI2\n");
        for(i=0;i<intfin;i++){
        printf("N%d\t%s\t%d\t%d\t%d\t %d\t %.2f\t%.2f\t%d\t%d\n",i+1,jobfin[i].name,jobfin[i].arrtime,jobfin[i].reqtime,jobfin[i].startime,jobfin[i].finitime,jobfin[i].TAtime,jobfin[i].TAWtime,jobfin[i].shebei1,jobfin[i].shebei2);
    }
    printf("现在系统时间:%d",systime);
    printf("\n*********************************************\n");
}

void Sort(JCB job[])//排序
{
    int i,j;
    JCB temp;
    for(i=0;i<intjob-1;i++)
    {
        for(j=i+1;j<intjob;j++)
        {
            if(job[i].arrtime>job[j].arrtime)
            {
                temp=job[i];
                job[i]=job[j];
                job[j]=temp;
            }
        }
    }
}
//先来先服务算法
void Fcfs(){
    int i,j=0,k,n,i1,i2;//n记录当前系统运行的作业数,i1、i2记录设备使用情况
    if(job[0].arrtime>systime)
    {
        systime++;
    }
    jobarr[intarr]=job[0];
    for(k=0;k<=intjob;k++)
    {
        job[k]=job[k+1];
    }
    intarr++;
    intjob--;
    while(0<intarr)
    {
        i=0;
        if(jobarr[i].shebei1){
        printf("\n作业%s开始运行...\n",jobarr[i].name);
        jobarr[i].startime=systime;
        jobarr[i].finitime=systime+jobarr[i].reqtime;
        while(jobarr[i].finitime>systime||intjob>0)
        {
            systime++;
            while(job[j].arrtime==systime)//作业从未到达队列进入已到达队列
            {
                jobarr[intarr]=job[0];
                for(k=j;k<=intjob;k++)
                {
                    job[k]=job[k+1];
                }
                intarr++;
                intjob--;
            }
        }
        jobarr[i].TAtime=jobarr[i].finitime-jobarr[i].arrtime;
        jobarr[i].TAWtime=jobarr[i].TAtime/jobarr[i].reqtime;
        jobfin[intfin]=jobarr[i];
        printf("作业%s运行结束!\n",jobarr[i].name);
        printf("\n现在系统时间:%d\n",systime);
        printf("\n*********************************************\n");
        for(k=i;k<=intarr;k++)//队列中剩余元素前移
        {
            jobarr[k]=jobarr[k+1];
        }
        intarr--;
        intfin++;
    }
}


main()
{
    char a;
    char b[20];
    int chose,i,j,key=0;
    Mune();
    scanf("%d",&chose);
    switch(chose)//选择输入
    {
    case 0:exit(0);
    case 1:intjob=ReadFile();break;
    case 2:Pseudo_random_number();break;
    case 3:Input();break;
    }
    for(i=0;i<intjob;i++)//若输入到达时间为现在的系统时间
    {
        if(job[i].arrtime==systime)
        {
            jobarr[intarr]=job[i];
            for(j=i;j<=intjob;j++)
            {
                job[j]=job[j+1];

            }
            intarr++;
            intjob--;
            i--;
        }
    }
    //排序
    Sort(job);
    Sort(jobarr);
    Output();
    systime++;
    while(1)
    {
        printf("\n\nInsert or Delete or Operating or Exit ?(I or D or O or E):");
        getchar();
        scanf("%c",&a);
        if(a==I||a==i)//插入
        {
            Input();
        }
        else if(a==D||a==d)//删除(只删除在等待队列中的)
        {
            printf("请输入要删除的作业名:");
            scanf("%s",b);
            for(i=0;i<intjob;i++)
            {
                if(strcmp(b,job[i].name)==0)
                {
                    key=1;
                    for(j=i;j<=intjob;j++)
                    {
                        job[j]=job[j+1];

                    }
                    intjob--;
                }
            }
            if(key==0)
            {
                printf("查找不到该作业!");
            }

        }
        else if(a==O||a==o)
        {
            Fcfs();
        }
        else if(a==E||a==e)//退出
        {
            exit(0);
        }
        else
        printf("输入错误!");
        Sort(job);
        Sort(jobarr);
        Output();
        systime++;
    }
}

四、实验结果

【操作系统】实验二 模拟作业调度

标签:

原文地址:http://www.cnblogs.com/jinyechutao11/p/5419254.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!