实验一 作业调度指导
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验一作业调度
实验目的
1) 加深作业概念的理解;
2) 掌握选择作业调度算法的准则;
3) 掌握作业调度算法。
实验要求
1) 编写程序完成实验内容;
2) 对测试数据进行分析;
3) 撰写实验报告。
实验内容
1) 设计可用于该实验的作业控制块;
2) 动态或静态创建多个作业;
3) 模拟先来先服务调度算法和短作业优先调度算法。
4) 调度所创建的作业并显示调度结果(要求至少显示出各作业的到达时间,服务时间,开始时间,完成时间,周转时间和带权周转时间);
5)比较两种调度算法的优劣。
实验原理
1.作业
作业(Job)是一个比程序更为广泛的概念,它不仅包含了通常的程序和数据,而且还应配有一份作业说明书,系统根据该说明书来对程序的运行进行控制。在批处理系统中,是以作业为基本单位从外存调入内存的。
2.作业控制块JCB(Job Control Block)
为了管理和调度作业,在多道批处理系统中为每个作业设置了一个作业控制块,如同进程控制块是进程在系统中存在的标志一样,它是作业在系统中存在的标志,其中保存了系统对作业进行管理和调度所需的全部信息。在JCB中所包含的内容因系统而异,通常应包含的内容有:作业标识、用户名称、用户帐户、作业类型(CPU 繁忙型、I/O 繁忙型、批量型、终端型)、作业状态、调度信息(优先级、作业已运行时间)、资源需求(预计运行时间、要求内存大小、要求I/O设备的类型和数量等)、进入系统时间、开始处理时间、作业完成时间、作业退出时间、资源使用情况等。
3.作业调度
作业调度的主要功能是根据作业控制块中的信息,审查系统能否满足用户作业的资源需求,以及按照一定的算法,从外存的后备队列中选取某些作业调入内存,并为它们创建进程、
分配必要的资源。然后再将新创建的进程插入就绪队列,准备执行。
4.选择调度算法的准则
1.面向用户的准则
(1) 周转时间短。 (2) 响应时间快。 (3) 截止时间的保证。 (4) 优先权准则。
2.面向系统的准则
这是为了满足系统要求而应遵循的一些准则。其中,较重要的有以下几点:
(1) 系统吞吐量高。 (2) 处理机利用率好。(3) 各类资源的平衡利用。
5.作业调度算法
1).先来先服务调度算法
先来先服务(FCFS)调度算法是一种最简单的调度算法,每次调度都从后备作业队列中选择一个或多个最先进入该队列的作业,将它们调入内存,为它们分配资源、创建进程,然后放入就绪队列。
2).短作业优先调度算法
短作业优先调度算法SJF,是指对短作业优先调度的算法。短作业优先(SJF)的调度算法是从后备队列中选择一个或若干个估计运行时间最短的作业,将它们调入内存运行。
3).最高优先权优先调度算法
为了照顾紧迫型作业,使之在进入系统后便获得优先处理,引入了最高优先权优先(FPF)调度算法。系统从后备队列中选择若干个优先权最高的作业装入内存。
参考代码(模拟先来先服务调度算法和短作业优先调度算法)
#include "stdio.h"
#define NULL 0
int n=0,time=0;float eti,ewi;
struct jcb{ char name[10]; /* 作业名 */
char state; /* 作业状态 ,'W'表示后备状态,'R'表示运行状态,
'F'表示完成状态*/
int submit_time; /* 提交时间 */
int begin_time; /* 开始运行时间 */
int end_time; /* 完成时间 */
float ti; /* 周转时间 */
float wi; /* 带权周转时间 */
int ntime; /* 作业所需运行时间 */
/*char resource[10]; 所需资源 */
struct jcb *link; /* 结构体指针 */
} *p,*q,*head=NULL;
typedef struct jcb JCB;
void initial(){ /*初始化,将作业链成一个链表*/
int i;
printf("\nInput jcb num\n");
scanf("%d",&n);
printf("Input\nname\tsubmit_time\tntime\n"); /*\t是制表符*/
for(i=0;i p=(JCB*)malloc(sizeof(JCB)); scanf("%s\t%d\t%d",&p->name,&p->submit_time,&p->ntime); p->state='W'; /*'W'表示后备状态*/ p->link=NULL; if(head==NULL) head=q=p; else{ q->link=p; q=p; } } } void print(JCB *pr){ /*打印输出各作业的信息,如果作业已经运行完成,则输出周转时间和带权周转时间,若作业为后备态,只输出基本信息 */ JCB *p; printf("\ntime=%d:",time); printf("\nname\tstate\tsubmit_time\tntime\tbegin_time\tend_time\tti\twi\n"); printf("%s\t%c\t%d\t\t%d\t%d\t\t%d\t\t%4.2f\t%4.2f\n", pr->name,pr->state,pr->submit_time,pr->ntime,pr->begin_time,pr->end_time,pr->ti,pr->wi); p=head; do { if(p->state=='W') printf("%s\t%c\t%d\t\t%d\n", p->name,p->state,p->submit_time,p->ntime); p=p->link; }while(p!=NULL); p=head; do { if(p->state=='F') printf("%s\t%c\t%d\t\t%d\t%d\t\t%d\t\t%4.2f\t%4.2f\n", p->name,p->state,p->submit_time,p->ntime,p->begin_time,p->end_time,p->ti,p->wi); p=p->link; }while(p!=NULL); } void last(){/*计算平均周转时间和平均带权周转时间*/ eti/=n;ewi/=n; printf("\neti=%7.3f\tewi=%7.3f\n",eti,ewi); } void running(JCB *p){ p->begin_time=time;p->state='R'; /*'R'表示运行状态*/ p->end_time=p->begin_time+p->ntime; p->ti=(float)(p->end_time-p->submit_time); p->wi=(float)(p->ti/p->ntime); eti+=p->ti; ewi+=p->wi; print(p); time+=p->ntime; p->state='F'; /*'F'表示已经运行完成*/ printf("\n%s has been finished!\npress any key to continue...\n",p->name); getch();