博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
操作系统-实验二作业调度模拟程序
阅读量:6272 次
发布时间:2019-06-22

本文共 3951 字,大约阅读时间需要 13 分钟。

实验二作业调度模拟程序

一、目的和要求

1. 实验目的

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

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

2.实验要求

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

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

     作业调度算法:

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

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

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

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

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

 

一、       模拟数据的生成

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

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

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

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

二、       模拟程序的功能

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

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

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

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

三、       模拟数据结果分析

1.            对同一个模拟数据各算法的平均周转时间,周转系数比较。

2.            (**)用曲线图或柱形图表示出以上数据,分析算法的优点和缺点。

四、       实验准备

序号

准备内容

完成情况

1

什么是作业?

 

2

一个作业具备什么信息?

 

3

为了方便模拟调度过程,作业使用什么方式的数据结构存放和表示?JCB

 

4

操作系统中,常用的作业调度算法有哪些?

 

5

如何编程实现作业调度算法?

 

6

模拟程序的输入如何设计更方便、结果输出如何呈现更好?

 

 

五、       其他要求

1.            完成报告书,内容完整,规格规范。

2.            实验须检查,回答实验相关问题。

注:带**号的条目表示选做内容。

二、实验内容

根据指定的实验课题,完成设计、编码和调试工作,完成实验报告。

、实验环境

可以采用TC,也可以选用Windows下的利用各种控件较为方便的VB,VC等可视化环境。也可以自主选择其他实验环境。

四、实验原理及核心算法参考程序段

     单道FCFS算法:

        

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#include<stdio.h>
struct 
jcb
{
    
char 
name[10];         
    
char 
status;          
     
    
int 
arrtime;            
    
int 
startime;         
    
int 
reqtime;       
    
int 
finitime;         
     
    
float 
TAtime;        
    
float 
TAWtime;         
     
    
float 
prio;            
} jobarr[24],jobfin[24],job[24];   
 
void 
Finishtime(
int 
n,jcb job[]);
TAtime(
int 
n,jcb job[],
float 
averageTAtime);
TAWtime(
int 
n,jcb job[],
float 
averageTAWtime);
void 
OrderByarrtime(
int 
n,jcb job[]);
void 
putOutjob(jcb job[],
int 
n);
 
void 
main()
{
    
float 
averageTAtime=0;
    
float 
averageTAWtime=0;
    
int 
n;
    
int 
systime=0; 
    
printf(
"作业数:"
);
    
scanf(
"%d"
,&n);
    
for
(
int 
i=0;i<n;i++)
    
{
        
printf(
"第%d个作业:\n"
,i+1);
        
printf(
"作业名称:"
);
        
scanf(
"%s"
,job[i].name);
        
printf(
"到达时间:"
);
        
scanf(
"%d"
,&job[i].arrtime);
        
printf(
"要求服务时间:"
);
        
scanf(
"%d"
,&job[i].reqtime);
        
printf(
"\n"
);
    
}
    
OrderByarrtime(n,job);
    
Finishtime(n,job);
    
averageTAtime=TAtime(n,job,averageTAtime);
    
averageTAWtime=TAWtime(n,job,averageTAWtime);
    
putOutjob(job,n);
    
printf(
"现在系统时间:%d\n"
,systime);
    
printf(
"平均周转时间=%f\n"
,averageTAtime);
    
printf(
"平均带权周转时间=%f\n"
,averageTAWtime);
 
}
 
 
void 
putOutjob(jcb job[],
int 
n)
{
    
int 
i;
    
printf(
"\n\n作业名|到达时间|服务时间|开始时间|结束时间|周转时间|带权周转时间\n"
);
    
for
(i=0;i<n;i++)
    
{
        
printf(
"%s\t%d\t%d\t%d\t%d\t%f\t%f\n"
,job[i].name,job[i].arrtime,job[i].reqtime,job[i].startime,job[i].finitime,job[i].TAtime,job[i].TAWtime);
 
    
}
}
 
void 
OrderByarrtime(
int 
n,jcb job[])
{
    
int 
i,j;
    
jcb tmp;
    
for
(i=0;i<n-1;i++)
        
for
(j=i+1;j<n;j++)
        
{
            
if
(job[i].arrtime>job[j].arrtime)
            
{
                
tmp=job[i];
                
job[i]=job[j];
                
job[j]=tmp;
            
}
        
}
}
 
 
void 
Finishtime(
int 
n,jcb job[])
{
    
int 
i;
    
for
(i=0;i<n;i++)
    
{
        
if
(i==0)
        
{
            
job[i].finitime=job[i].arrtime+job[i].reqtime;
            
job[i].startime=job[i].finitime;
        
}
        
else
        
{
            
job[i].finitime=job[i-1].startime+job[i].reqtime;
            
job[i].startime=job[i].finitime;
        
}
    
}
}
 
TAtime(
int 
n,jcb job[],
float 
averageTAtime)
{
    
int 
i;
    
float 
sum=0;
    
for
(i=0;i<n;i++)
    
{
        
job[i].TAtime=job[i].finitime-job[i].arrtime;
        
sum=sum+job[i].TAtime;
    
}
    
averageTAtime=sum/(
double
)n;
    
return 
averageTAtime;
}
 
 
TAWtime(
int 
n,jcb job[],
float 
averageTAWtime)
{
    
int 
i;
    
float 
sum=0;
    
for
(i=0;i<n;i++)
    
{
        
job[i].TAWtime=job[i].TAtime/job[i].reqtime;
        
sum=sum+job[i].TAWtime;
    
}
    
averageTAWtime=sum/(
double
)n;
    
return 
averageTAWtime;
}

转载于:https://www.cnblogs.com/chenkaiqi/p/5439321.html

你可能感兴趣的文章
ABP理论学习之MVC控制器(新增)
查看>>
Netty中的三种Reactor(反应堆)
查看>>
网页内容的html标签补全和过滤的两种方法
查看>>
前端源码安全
查看>>
【CodeForces 618B】Guess the Permutation
查看>>
【转】如何实现一个配置中心
查看>>
Docker —— 用于统一开发和部署的轻量级 Linux 容器【转】
查看>>
Threejs 官网 - Three.js 的图形用户界面工具(GUI Tools with Three.js)
查看>>
Atitit.Java exe bat 作为windows系统服务程序运行
查看>>
session的生命周期
查看>>
数据库的本质、概念及其应用实践(二)
查看>>
iOS开发多线程--(NSOperation/Queue)
查看>>
php的ajax简单实例
查看>>
maven常用构建命令
查看>>
C#:关联程序和文件
查看>>
推荐科研软件
查看>>
gradle
查看>>
如何取消未知类型文件默认用记事本打开
查看>>
[Javascript] Immute Object
查看>>
Java 关于finally、static
查看>>