一、实验目的

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

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

二、实验要求

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

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

     作业调度算法:

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

2)        短作业优先 (SJF) 调度算法,优先调度要求运行时间最短的作业。

3)        响应比高者优先(HRRN)调度算法,为每个作业设置一个优先权(响应比),调度之前先计算各作业的优先权,优先数高者优先调度。RP (响应比)= 作业周转时间 / 作业运行时间=1+作业等待时间/作业运行时间

每个作业由一个作业控制块JCB表示,JCB可以包含以下信息:作业名、提交(到达)时间、所需的运行时间、所需的资源、作业状态、链指针等等。

     作业的状态可以是等待W(Wait)、运行R(Run)和完成F(Finish)三种之一。每个作业的最初状态都是等待W。

 

1、模拟数据的生成

1.            允许用户指定作业的个数(2-24),默认值为5。

2.            允许用户选择输入每个作业的到达时间和所需运行时间。

3.            (**)从文件中读入以上数据。

4.            (**)也允许用户选择通过伪随机数指定每个作业的到达时间(0-30)和所需运行时间(1-8)。

2、 模拟程序的功能

1.            按照模拟数据的到达时间和所需运行时间,执行FCFS, SJF和HRRN调度算法,程序计算各作业的开始执行时间,各作业的完成时间,周转时间和带权周转时间(周转系数)。

2.            动态演示每调度一次,更新现在系统时刻,处于运行状态和等待各作业的相应信息(作业名、到达时间、所需的运行时间等)对于HRRN算法,能在每次调度时显示各作业的响应比R情况。

3.            (**)允许用户在模拟过程中提交新作业。

4.            (**)编写并调度一个多道程序系统的作业调度模拟程序。 只要求作业调度算法:采用基于先来先服务的调度算法。 对于多道程序系统,要假定系统中具有的各种资源及数量、调度作业时必须考虑到每个作业的资源要求。

三、实验方法、步骤及结果测试

1、先来先服务算法

 1 void FCFS(int n)
 2 {
 3     int time=-1,i=0,j,l,k;
 4     sort(n);
 5     while(i<n)
 6     {
 7         l=0;
 8         while(jArray[i].submittime>time)
 9         {
10             l++;
11             time++;
12             printf("\n当前系统时间为:%d\n",time);
13             printf("\n请按任意键继续......");
14             fflush(stdin);
15             getch();
16         }
17         if(l==0)
18         {
19             printf("\n当前系统时间为:%d\n",time);
20             printf("\n请按任意键继续......");
21             fflush(stdin);
22             getch();
23         }
24         printf("\n还未进入后备队列的作业!\n");
25         printf("作业名称\t提交时刻\t运行时间\n");
26         for(j=i+1;j<n;j++)
27         {
28             if(jArray[j].submittime>time)
29             {
30                 printf("%s\t\t%d\t\t%d\n",jArray[j].jobname,jArray[j].submittime,jArray[j].runtime);
31             }
32         }
33         printf("\n进入后备队列的作业!\n");
34         printf("作业名称\t提交时刻\t运行时间\n");
35         for(j=i;j<n;j++)
36         {
37             if(jArray[j].submittime<=time)
38             {
39                 printf("%s\t\t%d\t\t%d\n",jArray[j].jobname,jArray[j].submittime,jArray[j].runtime);
40             }
41         }
42         printf("\n处于运行的作业为:%s\n",jArray[i].jobname);
43         jArray[i].starttime=time;
44         jArray[i].finishtime=jArray[i].starttime+jArray[i].runtime;
45         jArray[i].turnovertime=jArray[i].finishtime-jArray[i].submittime;
46         jArray[i].turnnumber=(float)jArray[i].turnovertime/jArray[i].runtime;
47         time=jArray[i].finishtime;
48         printf("已完成的作业!\n");
49         printf("\n作业名称   提交时刻   运行时间   开始时刻   完成时间   周转时间   周转系数\n");
50         for(k=0;k<=i;k++)
51         {
52             printf("  %s         %d           %d         %d         %d         %d         %.2f\n\n",jArray[k].jobname,jArray[k].submittime,jArray[k].runtime,jArray[k].starttime,jArray[k].finishtime,jArray[k].turnovertime,jArray[k].turnnumber);
53         }
54         i++;
55     }
56 }

2、短作业优先算法

 1 void SJF(int n)
 2 {
 3     int time=-1,i=0,j,l,k,z,a,b;
 4     sort(n);
 5     while(i<n)
 6     {
 7         l=0;
 8         z=0;
 9         while(jArray[i].submittime>time)
10         {
11             l++;
12             time++;
13             printf("\n当前系统时间为:%d\n",time);
14             printf("\n请按任意键继续......");
15             fflush(stdin);
16             getch();
17         }
18         if(l==0)
19         {
20             printf("\n当前系统时间为:%d\n",time);
21             printf("\n请按任意键继续......");
22             fflush(stdin);
23             getch();
24         }
25         printf("\n还未进入后备队列的作业!\n");
26         printf("作业名称\t提交时刻\t运行时间\n");
27         for(j=i+1;j<n;j++)
28         {
29             if(jArray[j].submittime>time)
30             {
31                 printf("%s\t\t%d\t\t%d\n",jArray[j].jobname,jArray[j].submittime,jArray[j].runtime);
32             }
33         }
34         printf("\n进入后备队列的作业!\n");
35         printf("作业名称\t提交时刻\t运行时间\n");
36         for(j=i;j<n;j++)
37         {
38             if(jArray[j].submittime<=time)
39             {
40                 z++;
41             }
42         }
43         a=i;
44         b=i+z-1;
45         SJFsort(a,b);
46         printf("\n处于运行的作业为:%s\n",jArray[i].jobname);
47         jArray[i].starttime=time;
48         jArray[i].finishtime=jArray[i].starttime+jArray[i].runtime;
49         jArray[i].turnovertime=jArray[i].finishtime-jArray[i].submittime;
50         jArray[i].turnnumber=(float)jArray[i].turnovertime/jArray[i].runtime;
51         time=jArray[i].finishtime;
52         printf("已完成的作业!\n");
53         printf("\n作业名称   提交时刻   运行时间   开始时刻   完成时间   周转时间   周转系数\n");
54         for(k=0;k<=i;k++)
55         {
56             printf("  %s         %d           %d         %d         %d         %d         %.2f\n\n",jArray[k].jobname,jArray[k].submittime,jArray[k].runtime,jArray[k].starttime,jArray[k].finishtime,jArray[k].turnovertime,jArray[k].turnnumber);
57         }
58         i++;
59     }
60 }

3、效果图

四、 实验总结

这个程序的功能还未完善,有些功能没有做出来,只完成了计算周转时间,带权周转时间,当前系统时间是参考别人的,可能还要完善。

 

 

posted on 2016-04-15 11:07  nicole01  阅读(194)  评论(0编辑  收藏  举报