广工大操作系统实验报告-作业调度
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
作业调度模拟程序
一、实验目的
本实验要求学生模拟作业调度的实现,用高级语言编写和调试一个或多个作业调度的模拟程序,了解作业调度在操作系统中的作用,以加深对作业调度算法的理解。
二、实验内容和要求
为单道批处理系统设计一个作业调度程序
(1)编写并调试一个单道处理系统的作业调度模拟程序。
(2)作业调度算法:分别采用先来先服务(FCFS),最短作业优先(SJF)、响应比高者优
先(HRN)的调度算法。
I.先来先服务:就是每次调度都是从后备作业队列中,选择一个最先进入该队列的作
业,将它调入内存,为它分配资源、创建进程,然后放入就绪队列,投入运行,一
直运行到完成或发生某事件而阻塞后,才放弃处理。
II.最短作业优先:是从后备队列中选择一个估计运行时间最短的作业,将它调入内存运行并一直执行到完成,或发生某事件而被阻塞放弃处理时,再重新调度。
III.响应比高者优先:是通过计算出作业的响应比,按响应比高而进行调度的,其计算公式是:优先权=(等待时间+要求服务时间)/要求服务时间.
(3)由于在单道批处理系统中,作业一投入运行,它就占有计算机的一切资源直到作业
完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所占用的
CPU时限等因素。
(4)每个作业由一个作业控制块JCB表示,JCB可以包含如下信息:作业名、提交时间、
所需的运行时间、所需的资源、作业状态、链指针等等。
作业的状态可以是等待
W(Wait)、运行R(Run)和完成F(Finish)三种状态之一。
每个作业的最初状态总是
等待W。
(5)对每种调度算法都要求打印每个作业开始运行时刻、完成时刻、周转时间、带权周
转时间,以及这组作业的平均周转时间及带权平均周转时间,并比较各种算法的优
缺点。
三、实验主要仪器设备和材料
硬件环境:IBM-PC或兼容机
软件环境:C语言编程环境
四、实验原理及设计方案
调度也称dispatcher,这是内核的主要职责之一。
一个良好的任务调度算法应该主要体现在以下几个方面:
1.公平:保证每个进程得到合理的CPU 时间;
2.高效:使CPU 保持忙碌状态,即总是有进程在CPU 上运行;
3.响应时间:使交互用户的响应时间尽可能短;
4.周转时间:使批处理用户等待输出的时间尽可能短;
5.吞吐量:使单位时间内处理的进程尽可能多;很显然在任何操作系统中这几个目标不可能同时达到所以不同的。
操作系统会在这几个方面中做出相应的取舍从而确定自己的调度算法,常用的处理机调度算法有:先来先服务FCFS、短作业优先SJF、优先级、时间片轮转法、多级队列法、多级反馈队列法。
(1)先来先服务(FCFS)
FCFS 是最简单的CPU 调度算法,即按进程到来的先后次序进行调度,这样在系统中等待时间最长的进程被优先调度,而不管其所需运行时间的长短。
(2)作业优先SJF 算法
是指当CPU 可供使用时SJF 算法把CPU 分给需要运行时间最短的进程。
(3)时间片轮转调度法
当两个或两个以上任务有同样优先级,内核允许一个任务运行事先确定的一段时间叫做时间额度quantum ,然后切换给另一个任务也叫做时间片调度time slicing ,内核在满足以下条件时把CPU 控制权交给下一个就绪态的任务,当前任务已无事可做,当前任务在时间片还没结束时已经完成了。
轮转法主要是为分时系统设计的,其中时间片是一个重要的参数,不能取的过大或过小,通常为10 至100ms 数量级,就绪队列可以看成是一个环形队列,CPU 调度程序轮流地把CPU 分给就绪队列中地每个进程。
五、流程图
六、结果过程及截图
主程序菜单
《先来先服务算法》
单道作业批处理系统初始化,输入三个作业,按照提示输入其时间,资源需求等:
第一轮作业调度,如图显示了每个作业提交时间、需求时间、响应比、即时状态、主存需求、磁带机数量等,每次调度完毕输出作业完成时间、周转时间、带权周转时间、释放的资源:
同样,第二轮调度,作业22222完成,如下显示:
同样,第三轮调度,作业33333完成,如下显示:
全部作业运行完毕,计算总的平均周转时间和带权周转时间:
《短作业优先算法》
单道作业批处理系统初始化,输入三个作业,按照提示输入其时间,资源需求等:
第一轮作业调度,如图显示了每个作业提交时间、需求时间、响应比、即时状态、主存需求、磁带机数量等,每次调度完毕输出作业完成时间、周转时间、带权周转时间、释放的资源:
同样,第二轮调度,作业33333完成,输出作业完成时间、周转时间、带权周转时间、释放的资源:
同样,第三轮调度,作业22222完成,输出作业完成时间、周转时间、带权周转时间、释放的资源:
全部作业运行完毕,计算总的平均周转时间和带权周转时间:
《响应比高者优先算法》
单道作业批处理系统初始化,输入三个作业,按照提示输入其时间,资源需求等:
第一轮作业调度,如图显示了每个作业提交时间、需求时间、响应比、即时状态、主存需求、磁带机数量等,11111调度完毕输出作业完成时间、周转时间、带权周转时间、释放的资源:
第二轮作业调度完毕,22222已经完成,输出作业完成时间、周转时间、带权周转时间、释放的资源:
全部作业运行完毕,计算总的平均周转时间和带权周转时间:
七、所遇困难的解决以及心得体会
1)测试的数据必须是符合JCB模块中相同类型的,如在源码中式int类型的,而在测试的时候输入float类型就出错。
2)各个库函数的运用需要掌握相应的功能,否则会照成代码冗余、繁杂、不优化等各种问题。
3)通常在dos下运用的都是英文,而想要用汉字提示就必须考虑一些问题。
在源码中我们用制表符(\t)来控制提示,输出的数字是不能与之对齐的,所以我们要将“\t”改成空格。
4)在编写和调试程序时,为了尽快调通程序应该按照流程图的结构(保证流程图思路是对的情况下)来建立编程思路。
八、源代码
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define getpch(type) (type*)malloc(sizeof(type))
int Select;
int Systemtime = 0; /*系统初始时间*/
int JCBnum = 0; /*总作业数*/ int JCBtime = 0; /*总周转时间*/ double JCBtotaltime =0; /*总带权周转时间*/
struct source{ /*定义资源需求结构*/
char memery[5]; /*主存需求*/
int machine; /*磁带机数量*/
};
struct jcb { /* 定义作业控制块PCB */
char name[10];
char state; /* 状态*/
double super; /* 响应比优先权*/
int ntime; /* 需要运行时间*/
int rtime; /* 开始运行时间*/
int ptime; /*提交时间*/
int ftime; /*完成时间*/
source *needsources; /*资源需求链*/
struct jcb* link; /* 下一个作业控制块的地址*/
}*ready=NULL,*run,*p;
typedef struct jcb JCB;
typedef struct source SOURCE;
void display()
{
int c;
do
{
system("cls");
printf("\n\t\t <<单道批处理系统作业调度演示>>\n");
printf("\n\t\t***************************** ****************\t\t");
printf("\n\t\t\t 1.先来先服务算法.");
printf("\n\t\t\t 2.最短作业优先算法.");
printf("\n\t\t\t 3.响应比高者优先算法");
printf("\n\t\t\t 0.退出程序.");
printf("\n\t\t***************************** ****************\t\t\n");
printf("\t\t\t请输入选择所要操作(0-3):");
scanf("%d",&c);
system("cls");
广东工业大学实验报告
自动化学院网络工程专业11(3)班学号3111001381 姓名何宇航成绩评定_______ 教师签名钟灵
17。