操作系统作业调度实验报告 多道批处理
计算机学院计算机科学与技术专业07班
姓名 ___ 学号—教师评定_____________________
实验题目 __________________ 作业调度______________________
一、实验目的
本实验要求学生模拟作业调度的实现,用高级语言编写和调试一个或多个作业调度的模
拟程序,了解作业调度在操作系统中的作用,以加深对作业调度算法的理解。
二、实验内容和要求
1、为单道批处理系统设计一个作业调度程序
(1) 、编写并调试一个单道处理系统的作业调度模拟程序。
(2) 、作业调度算法:分别采用先来先服务( FCFS),最短作业优先(SJF)的调度算法。
(3) 、由于在单道批处理系统中,作业一投入运行,它就占有计算机的一切资源直到作业完
成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所占用的CPU时限等因素。
(4) 、每个作业由一个作业控制块JCB表示,JCB可以包含如下信息:作业名、提交时间、
所需的运行时间、所需的资源、作业状态、链指针等等。作业的状态可以是等待W(Wait)、运行R(Run)和完成F(Finish)三种状态之一。每个作业的最初状态总是等待W。
(5) 、对每种调度算法都要求打印每个作业开始运行时刻、完成时刻、周转时间、带权周转时间,以及这组作业的平均周转时间及带权平均周转时间,并比较各种算法的优缺点。
2、模拟批处理多道操作系统的作业调度
(1)写并调试一个作业调度模拟程序。
(2)作业调度算法:分别采用先来服务( FCFS)调度算法。
(3 )在批处理系统中,要假定系统中具有的各种资源及数量、调度作业时必须考虑到每个作业的资源要求,所需要的资源是否得到满足。
作业调度程序负责从输入井选择若干个作业进入主存,为它们分配必要的资源,当它们能够被进程调度选中时,就可占用处理机运行。作业调度选择一个作业的必要条件是系统中现有的尚未分配的资源可满足该作业的资源要求。但有时系统中现有的尚未分配的资源既
可满足某个作业的要求也可满足其它一些作业要求,那么,作业调度必须按一定的算法在这
些作业中作出选择。当作业正常运行完毕或因发生错误非正常终止时,作业进入完成状态,此时,系统将收回该作业所占用的全部资源,并清除有关的JCB。并输出显示作业运行情况
及作业输出结果。
三、实验设计方案及原理
假设在单道批处理环境下有四个作业JOB1、JOB2、JOB3、JOB4,已知它们进入系统
的时间、估计运行时间。分别采用先来先服务( FCFS),最短作业优先(SJF)调度算法,计算出作业的平均周转时间和带权的平均周转时间。作业p 的周转时间:p->ttime=p->ftime-p->atime 作业的平均周转时间:total= 全部进程的周转时间/进程个数作业p 的带权周转时间:p->wtime =p->ttime/p->ntime 作业的平均带权周转时间:W= 全部进程的带权周转时间/ 进程个数
1先来先服务调度算法(FCFS):每次调度都是从后备作业队列中,选择一个或多个最先
进入该队列的作业,将它们调入内存,为它们分配资源、创建进程,然后放入就绪队列。在进程调度中采用FCFS算法时,这每次调度是从就绪队列中,选择一个最先进入该队列的进程,为之分配处理机,使之投入运行。该进程一直运行到完成或发生某事件阻赛后,才放弃处理机。
2、最短作业优先(SJF):每次从后备队列中选择一个或若干个估计运行时间最短的作业,将它们调入内存运行。
对每种调度算法都要求打印每个作业开始运行时刻、完成时刻、周转时间、带权周转时间,以及这组作业的平均周转时间及带权平均周转时间,并比较各种算法的优缺点。
3、多道作业调度算法:将作业按FCFS 原则排好队,在输入井中按作业到达的先后次序来挑选作业,先进入输入井的作业优先被挑选,当系统中现有的尚未分配的资源不能满足先进入输入井的作业时,那么顺序挑选后面的作业,把不能满足要求的放回输入井尾部等待,当作业执行结束进入完成状态时,做好释放资源等善后工作。
四、流程图
1 FCFS算法和SJF算法:
计算并打印运行作业P的完成时间ftime , 周
转时间ttime ,带权周转时间wtime
(ftime=btime+ntime;ttime=ftime-atime;wti
me=ttime/ntime )
更改时间量T的值(T=ftime)
继续执行该进
程
(p->rtime)++ 撤销进程,指向下一进程
2.多道作业调度算法
五、给出程序中源程序名和执行程序名:
源程序名:FCFS and SJF,执行程序名:fcfs and sjf.cpp 源程序名:DUODAO 执行程序名:duodao.cpp 六、程序清单
1.FCFS和SJF算法
#include "stdio.h"
#include
#include
#define getpch(type) (type*)malloc(sizeof(type))
struct jcb{
char name[10];
char state;
int atime;// 作业到达时间
int btime;// 作业开始运行时间
int ftime;// 作业完成时间
int ntime;// 作业估计运行时间
int rtime;// 作业执行时间
int ttime;// 周转时间
float wtime;// 带权周转时间(周转时间/估计运行时间)
struct jcb* link;
}*ready=NULL, *p;//ready 指向队头,p 指向正被调度的作业
typedef struct jcb JCB;
int T=0; // 初始化时间量
float total;// 记录所有作业的总时间
double weight;// 记录所有作业的带权周转时间
void sort() /* 建立对作业进行到达时间排列函数*/
{
JCB *first, *second;
int insert=0;
if((ready==NULL)||((p->atime)<(ready->atime))) /* 作业到达时间最短的,插入队首*/ {
p->link=ready;
ready=p;
T=p->atime; // 更改时间量
}
else /* 作业比较到达时间,插入适当的位置中*/
{
first=ready; second=first->link; while(second!=NULL)
{ if((p->atime)<(second->atime)) /* 若插入作业比当前队尾作业到达时间短,*/ { /* 插入到当前队尾作业前面*/
p->link=second; first->link=p;
second=NULL;
insert=1;
}
else /* 插入作业到达时间最长,则插入到队尾*/
{
first=first->link; second=second->link;
}
}
if (insert==0) first->link=p;
}
}
void shortjob() // 获取队列中的最短作业
{
JCB *pr,*min,*qr;
min=ready;//min 指向作业对头
qr=ready;
pr=ready->link;
while(pr!=NULL)
{ if((pr!=NULL)&&(T>=pr->atime)&&(pr->ntime)<(min->ntime))
{//当插入作业到达时间要比时间量T 小
min=pr; //min 指向pr qr->link=pr->link;//qr 的下一个指向pr 的下一个pr->link=ready;
pr=pr->link;
}
else //当pr 的需要时间不小于min 的需要时间
{ qr=pr;
pr=pr->link;}
ready=min;〃把最终获取的min的需要时间赋给ready,开始执行
}
}
void input() /* 建立作业控制块函数*/
{
int i;
printf("\n 请输入4 个作业:");
for(i = 0; i < 4; i++)
{
printf("\n 请输入作业号NO.%d :\n",i);
p = getpch(JCB); printf(" 输入作业名:");
scanf("%s",p->name); printf("\n 输入作业到达时间:"); scanf("%d",&p->atime); printf("\n 输入作业运行时间:"); scanf("%d",&p->ntime); printf("\n"); p->rtime = 0; p->btime=0; p->ftime=0;
p->ttime=0; p->wtime=0; p->state = 'W'; p->link = NULL; sort();
}
}
int space() /* 查看作业个数*/
{
int l = 0;
JCB *pr = ready;
while(pr != NULL)
{
l++;
pr = pr->link;
}
return(l);
}
void disp(JCB *pr) /* 建立作业显示函数,用于显示当前作业*/
{
printf("\n qname \t state \t atime \t ntime \t btime \t rtime \t ftime \t ttime \t wtime \n"); printf(" |%s \t",pr->name);
printf(" |%c \t",pr->state);
printf(" |%d \t",pr->atime);
printf(" |%d \t",pr->ntime);
printf(" |%d \t",pr->btime);
printf(" |%d \t",pr->rtime);
printf(" |%d \t",pr->ftime);
printf(" |%d \t",pr->ttime);
printf(" |%.2f \t",pr->wtime); printf("\n");
}
void check() /* 建立作业查看函数*/
{
JCB* pr;
printf("\n **** 当前正在运行的作业是:%s",p->name); /* 显示当前运行作业*/ disp(p);
pr=ready;
printf("\n **** 当前就绪队列状态为:\n"); /* 显示就绪队列状态*/ while(pr!=NULL)
{
disp(pr); pr=pr->link;
}
}
void destroy()
{
printf("\n 作业[%s] 已完成。\n",p->name);
free(p);
}
void running(JCB *pr) // 计算各个时间
{
if(T>=pr->atime) pr->btime=T;// 插入作业的到达时间比时间量小,T 为该作业的开始时间else pr->btime=pr->atime;// 否则该作业到达时间为它的开始时间pr->ftime=pr->btime+pr->ntime;
pr->ttime=p->ftime-p->atime; pr->wtime=(float)pr->ttime/(float)pr->ntime;
total+=pr->ttime;
weight+=pr->wtime;
T=pr->ftime;//T 为该上一个作业的完成时间
}
void running1(JCB *pr) //分离出要执行的当前作业
{
if(T>=pr->atime) pr->btime=T;
else pr->btime=pr->atime;
}
void running2(JCB *pr) // 判断运行时间和需要运行时间的关系
{
while(pr->rtime
{
pr->state = 'R';
(pr->rtime)=(pr->ntime);
}
printf("\n\n **** 该作业执行完毕时的状态:\n"); pr->state='F';
disp(pr);
destroy();
}
int main()
int i,len, h = 0; char ch; total=0;
weight=0;
printf(
printf(" \n");
printf(”FCFS算法或SJF算法\n");
printf( H********************************************************
input();
len = space();
printf("\n 选择算法: ");
scanf("%d",&i);
switch(i)
case 1:
printf("FCFS 算法:\n");break;
case 2:
printf("SJF 算法:\n");break;
default:printf("FAULSE");
}
if(i==1||i==2)
{
while((len != 0) && (ready != NULL))
{
ch = getchar();
if(i==2) shortjob();
h++;
printf("\n The execute number:%d\n",h);
p = ready; /* 将队首指针赋给p*/
ready = p->link; /*ready 指向原p 的下一个进程*/
p->link = NULL; /*p 的link 赋空*/ p->state = 'R';
p->btime=p->atime;
running1(p);
check();
running(p);
running2(p);
printf("\n 按任一键继续..."); ch
= getchar();
}
printf("\n\n 作业已完成。\n");
ch = getchar();
printf("\n **************************************************** **\n");
printf("\n 平均周转时间:%f",total/(float)4);
printf("\n 平均带权周转时间:%lf",weight/(float)4);
printf("\n **************************************************** **\n");
}
2.多道作业调度算法:#include "stdio.h" #include
#include
#define getpch(type) (type*)malloc(sizeof(type))
#define source 15 struct jcb{
char username[10];
char jobname[10];
char state;
int atime;// 作业到达时间
int ntime;// 作业估计运行时间
int rtime; // 作业的运行时间
int nsource;// 作业所需系统资源
int asource;// 已分配的资源
int need1;
struct jcb* link;
}*ready=NULL, *p;//ready 指向就绪队列的队头,p 指向正被调度的作业typedef struct jcb JCB;
int rsource=15;// 剩下资源
int num,i=0;//num 为作业个数,i 为记录不能满足作业要求调度的次数void destroy(JCB *pr)
{
free(pr);
}
void sort() /* 建立对作业进行到达时间排列函数*/
{
JCB *first, *second;
int insert=0; if((p->nsource<=source)&&(rsource>=0)&&(p->nsource>p->asource))
{// 需要资源要在系统资源范围内,分配资源要在需要资源范围内,剩下资源不能小于0 if((ready==NULL)||((p->atime)<(ready->atime))) /* 作业到达时间最短的,插入队首*/ { p->link=ready; ready=p;
}
else /* 作业比较到达时间,插入适当的位置中*/
{ first=ready; second=first->link; while(second!=NULL)
{ if((p->atime)<(second->atime)) /* 若插入作业比当前队尾作业到达时间短,*/ { /* 插入到当
前队尾作业前面*/ p->link=second; first->link=p;
second=NULL; insert=1;
}
else /* 插入作业到达时间最长,则插入到队尾*/
{ first=first->link; second=second->link;
}
}
if (insert==0) first->link=p;
}
}
else destroy(p);
}
void sort1() /* 对作业进行排列函数*/
{
JCB *first;
if(ready==NULL) /* 如果就绪队列为空*/
{
ready=p; /* 将新建作业放入队列中,将ready 指向队首作业*/
}
else /*队列中有作业在等待,将新建作业插入到队尾*/
first=ready; /*first 指针指向队首作业*/
while(first->link!=NULL) first=first->link; /* 当first 指针没有指向队尾时,指针后移*/
first->link=p;/* 将p 指向的作业插入队尾*/
}
}
void input() /* 建立作业控制块函数*/
{
int i;
printf("\n 请输入作业个数:");
scanf("%d",&num);
for(i=0;i { printf("\n 请输入作业号NO.%d :\n",i); p = getpch(JCB); printf(" 输入作业用户名:"); scanf("%s",p->username); printf("\n 输入作业名:"); scanf("%s",p->jobname); printf("\n 输入作业到达时间:"); scanf("%d",&p->atime); printf("\n 输入作业运行时间:"); scanf("%d",&p->ntime); printf("\n 输入作业所需资源:"); scanf("%d",&p->nsource); printf("\n 输入作业已分配资源:"); scanf("%d",&p->asource); printf("\n"); p->need1=p->nsource-p->asource;// 还需要资源=需要资源-已分配资源 p->state='W'; p->link=NULL; sort(); } } int space() /* 查看作业个数*/ { int l=0; JCB *pr=ready; while(pr!=NULL) { l++; pr=pr->link; return(l); } void disp(JCB *pr) /* 建立作业显示函数,用于显示当前作业*/ { printf("\n 用户N \t 作业N \t 状态S \t 到达T \t 服务T \t 所需S \t 已分S \t 还需S \n"); printf(" |%s \t",pr->username); printf(" |%s \t",pr->jobname); printf(" |%c \t",pr->state); printf(" |%d \t",pr->atime); printf(" |%d \t",pr->ntime); printf(" |%d \t",pr->nsource); printf(" |%d \t",pr->asource); printf(" |%d \t",pr->need1); printf("\n"); } void check() { JCB *pr; printf("\n**** 当前正在运行的作业是:%s",p->jobname); disp(p); pr=ready; printf("\n**** 当前输入井队列状态为:\n"); /* 显示就绪队列状态*/ while(pr != NULL) { disp(pr); pr = pr->link; } } void running(JCB *p)// 对输入井队列中满足资源要求的作业进行服务 { while(p->rtime { (p->rtime)++; } p->state='F'; printf("\n**** 作业运行完成后状态:\n"); disp(p); printf("\n 用户名[%s] 的作业[%s] 已完成。\n",p->username,p->jobname); } void running1()// 计算剩下资源 { JCB *pr; for(pr=ready;pr!=NULL;pr=pr->link) {rsource=rsource-pr->asource;} } void running2(JCB *pr) { if(pr->need1<=rsource) { check(); rsource-=pr->need1; pr->asource+=pr->need1; pr->need1 =0; printf("\t* ****************************************** printf("\n 分配给作业后所剩的资源是:%d \n",rsource); running(pr); rsource = rsource + pr->nsource; printf("\n 释放后的资源是:%d\n",rsource); destroy(pr); } else { printf(" 该作业不能满足要求,调度下一个作业"); sort1(); i++; } } void main() { int len, h=0;//h 表示执行的次数 int flag=0;// 用来记录排在前面却没被调用的作业个数char ch; printf( "******************************************************** printf(" printf( "******************************************************** input(); len = space(); running1(); if(rsource>=0) while((i<=2*num)&&(len!=0)&&(ready!=NULL)) printf(" 多道作业调度算法\n"); \n"); { ch=getchar(); h++; prin tf("The execue nu mber:%d\n",h); printf("\n 系统可分配资源是:%d",rsource); ch=getchar(); p=ready; ready=ready->li nk; p->li nk=NULL; p->state ='R'; runnin g2(p); printf("\n 按任一键继续..."); ch=getchar(); } if(i>2) { prin tf("\n******剩下系统资源不能满足作业需要要求了\n ”); printf("\n****** 退出程序"); } else printf("\n 作业已完成\n"); ch=getchar(); } else prin tf("\n\n****因为输入已分配的资源与系统资源不符合错误,所以退出程序} 七、运行结果 [厂4. E#HO.B I 输入作业到达时间:6 输人作业运顾2输入作业运行时间:is ); 皐入作业到达时 间:3 输入作业运彳亍命入作业到达时间;2 输入作业运行时间:12 NO 4: 2.SJF算法 3?多道作业调度算法 操作系统磁盘调度算法 实验报告 Company number:【0089WT-8898YT-W8CCB-BUUT-202108】 目录 1.课程设计目的 编写目的 本课程设计的目的是通过磁盘调度算法设计一个磁盘调度模拟系统,从而使磁盘调度算法更加形象化,容易使人理解,使磁盘调度的特点更简单明了,能使使用者加深对先来先服务算法、最短寻道时间优先算法、扫描算法以及循环扫描算法等磁盘调度算法的理解。 2.课程设计内容 设计内容 系统主界面可以灵活选择某种算法,算法包括:先来先服务算法(FCFS)、最短寻道时间优先算法(SSTF)、扫描算法(SCAN)、循环扫描算法(CSCAN)。 1、先来先服务算法(FCFS) 这是一种比较简单的磁盘调度算法。它根据进程请求访问磁盘的先后次序进行调度。此算法的优点是公平、简单,且每个进 程的请求都能依次得到处理,不会出现某一进程的请求长期得不到满足的情况。此算法由于未对寻道进行优化,在对磁盘的访问请求比较多的情况下,此算法将降低设备服务的吞吐量,致使平均寻道时间可能较长,但各进程得到服务的响应时间的变化幅度较小。 2、最短寻道时间优先算法(SSTF) 该算法选择这样的进程,其要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短,该算法可以得到比较好的吞吐量,但却不能保证平均寻道时间最短。其缺点是对用户的服务请求的响应机会不是均等的,因而导致响应时间的变化幅度很大。在服务请求很多的情况下,对内外边缘磁道的请求将会无限期的被延迟,有些请求的响应时间将不可预期。 3、扫描算法(SCAN) 扫描算法不仅考虑到欲访问的磁道与当前磁道的距离,更优先考虑的是磁头的当前移动方向。例如,当磁头正在自里向外移动时,扫描算法所选择的下一个访问对象应是其欲访问的磁道既在当前磁道之外,又是距离最近的。这样自里向外地访问,直到 代码 FlowShop类 public class FlowShop { static int n, //作业数; f1, //机器1完成处理时间; f, //完成时间和; bestf; //当前最优值; static int [][]m; //各作业所需的处理时间; static int []x; //当前作业调度; static int []bestx; //当前最优作业调度; static int []f2; //机器2完成处理时间; private void backtrack(int i) { if(i>n) { for (int j=1;j<=n;j++) { bestx[j]=x[j]; System.out.print(x[j]+" "); } System.out.println(); bestf=f; System.out.println("每条深度优先搜索结果为:"+bestf); } else for(int j=i;j<=n;j++) { f1+=m[x[j]][0]; f2[i]=((f2[i-1]>f1)? f2[i-1]:f1)+m[x[j]][1]; f+=f2[i]; if(f public void ShowTest() { n=3; bestf=Integer.MAX_VALUE; f1=0; f=0; int [][]m={{0,0},{2,1},{3,1},{2,3}}; int []x={0,1,2,3}; int []bestx={0,1,2,3}; f2=new int[4]; this.m = m; this.x=x; this.bestx=bestx; this.f2=f2; backtrack(1); System.out.println("当前最优值:"+bestf); System.out.println("当前最优作业调度"); for(int i=1;i<=n;i++) { System.out.print(bestx[i]+" "); } } public static void main(String[] args) { FlowShop fs=new FlowShop(); fs.ShowTest(); } } MyMath类 public class MyMath { public void MyMath(){} public static int[] swap(int[] x,int i,int j) { int ex; ex=x[j]; x[j]=x[i]; x[i]=ex; return x; } 石家庄经济学院 实验报告 (学院)系: 信息工程学院 专业: 网络工程 姓名: 何秉乾 班级: 网络2班 学号: 407109070501 指导教师: 王建东 日期:2010 年 1月 22 日 操作系统实验报告 姓名何秉乾学号407109070501 日期2010/1/11-2010/1/22 实验室260机房指导教师王建东设备编号 作业调度 设计题 目 一.设计内容 模拟批处理多道操作系统的作业调度 二.设计目的 每个用户请求计算机计算的一个计算任务叫做一个作业。一个作业从输入初始数据到得到计算结果,要经过若干个步骤的相继执行。例如,编辑、编译、运行等,其中每一个步骤称作一个作业步。用户向系统提出作业加工步骤的方式称作业控制方式,作业控制方式有两种:终端控制方式(又称直接控制方式或联机控制方式)和批处理控制方式(又称自动控制方式或脱机控制方式)。 在批处理控制方式下,用户采用系统提供的作业控制语言(JCL)写好作业说明书,说明作业加工的步骤。操作员把一批作业组织成输入流,通过“预输入”手段使每个作业的信息(包括作业说明书、源程序、初始数据等)暂存在辅助存储器的“输入井”中。 批处理多道操作系统的作业管理有两个任务:作业调度和作业控制。采用多道程序设计方法的操作系统,在系统中要经常保留多个运行的作业,以提高系统效率。作业调度从系统已接纳的暂存在输入井中的一批作业中挑选出若干个可运行的作业,并为这些被选中的作业分配所需的系统资源。对被选中运行的作业必须按照它们各自的作业说明书规定的步骤进行控制。 本实习要求学生模拟作业调度的实现,了解作业调度在操作系统中的作用。 三.设计过程 1、数据结构设计: 设计一个结构体数组 typedef struct work{ char username[10]; //用户名 char workname[10]; //作业名 float time; //作业运行时间 char state; //状态R为收容,A表示执行状态,T为完成 int store; //主存 int tape; //磁带 }WORK; WORK w[N]; //工作数组 初始化操作 printf("初始化:\n"); for(i=0;i 计算机操作系统实验报告 班级08计算机2班学号0800303226 姓名罗院 实验目的 编程模拟实现磁盘调度的常用算法或调试分析相关磁盘调度程序,加深对磁盘调度常用算法的理解和实现技巧 实验内容 1、自定义磁盘调度相关的数据结构 2、依据先来先服务(FCFS)、最短寻道时间(SSTF),编写对应函数,模拟系统 的磁盘调度服务 实验代码 #include printf("SSTF算法寻道:\n"); for(i=0;i 批处理系统的作业调度 1.实验目的 加深对作业概念的理解; 深入了解批处理系统如何组织作业、管理作业和调度作业; 2.实验预备知识 作业的概念; 作业的创建; 作业的调度。 3.实验内容 编写程序完成批处理系统中的作业调度,要求采用响应比高者优先的作业调度算法。实验具体包括:首先确定作业控制块的内容,作业控制块的组成方式;然后完成作业调度;最后编写主函数对所作工作进程测试。 4.提示与讲解 操作系统根据允许并行工作的道数和一定的算法从系统中选取若干作业把它们装入主存储器,使它们有机会获得处理器运行,这项工作被称为“作业调度”。实现这部分功能的程序就是“作业调度程序”。 作业调度的实现主要有两个问题,一个是如何将系统中的作业组织起来;另一个是如何进行作业调度。 为了将系统中的作业组织起来,需要为每个进入系统的作业建立档案以记录和作业相关的信息,例如作业名、作业所需资源、作业执行时间、作业进入系统的时间、作业信息在存储器中的位置、指向下一个作业控制块的指针等信息。这个记录作业相关信息的数据块称为作业控制块(JCB),并将系统中等待作业调度的作业控制块组织成一个队列,这个队列称为后备队列。一个作业全部信息进入系统后,就为其建立作业控制块,并挂入后备队列。当进行作业调度时,从后备队列中查找选择作业。 由于实验中没有实际作业,作业控制块中的信息内容只使用了实验中需要的数据。作业控制块中首先应该包括作业名;其次是作业所需资源,根据需要,实验中只包括需要主存的大小(采用可移动的动态分区方式管理主存,作业大小就是需要主存的大小)、需要打印机的数量和需要磁带机的数量;采用响应比作业调度算法,为了计算响应比,还需要有作业的估计执行时间、作业在系统中的等待时间;另外,指向下一个作业控制块的指针必不可少。 实验中,作业控制块及队列的数据结构定义如下。 typedef struct jcb {char name[4]; //作业名 int length; //作业长度,所需主存大小 int printer; //作业执行所需打印机的数量 int tape; //作业执行所需磁带机的数量 int runtime; //作业估计执行时间 int waittime; //作业在系统中的等待时间 int next; //指向下一个作业控制块的指针 }JCB //作业控制块类型定义 实验二作业调度 一.实验题目 1、编写并调试一个单道处理系统的作业等待模拟程序。 作业调度算法:分别采用先来先服务(FCFS),最短作业优先(SJF)的调度算法。 (1)先来先服务算法:按照作业提交给系统的先后顺序来挑选作业,先提交的先被挑选。 (2)最短作业优先算法:是以进入系统的作业所提出的“执行时间”为标准,总是优先选取执行时间最短的作业。 二.实验目的: 本实验要求用高级语言(C语言实验环境)编写和调试一个或多个作业调度的模拟程序,了解作业调度在操作系统中的作用,以加深对作业调度算法的理解 三.实验过程 <一>单道处理系统作业调度 1)单道处理程序作业调度实验的源程序: zuoye.c 执行程序: zuoye.exe 2)实验分析: 1、由于在单道批处理系统中,作业一投入运行,它就占有计算机的一切资源直到作业 完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所占用的 CPU 时限等因素。 2、每个作业由一个作业控制块JCB表示,JCB可以包含如下信息:作业名、提交时间、 所需的运行时间、所需的资源、作业状态、链指针等等。作业的状态可以是等待 W(Wait)、运行R(Run)和完成F(Finish)三种状态之一。每个作业的最初状态总是等待W。 3、对每种调度算法都要求打印每个作业开始运行时刻、完成时刻、周转时间、带权周 转时间,以及这组作业的平均周转时间及带权平均周转时间。 3)流程图: 代替 二.最短作业优先算法 代替 三.高响应比算法 图一.先来先服务流程图 4)源程序: #include 作业调度 一、实验目的 1、对作业调度的相关内容作进一步的理解。 2、明白作业调度的主要任务。 3、通过编程掌握作业调度的主要算法。 二、实验内容及要求 1、对于给定的一组作业, 给出其到达时间和运行时间,例如下表所示: 2、分别用先来先服务算法、短作业优先和响应比高者优先三种算法给出作业的调度顺序。 3、计算每一种算法的平均周转时间及平均带权周转时间并比较不同算法的优劣。 测试数据 workA={'作业名':'A','到达时间':0,'服务时间':6} workB={'作业名':'B','到达时间':2,'服务时间':50} workC={'作业名':'C','到达时间':5,'服务时间':20} workD={'作业名':'D','到达时间':5,'服务时间':10} workE={'作业名':'E','到达时间':12,'服务时间':40} workF={'作业名':'F','到达时间':15,'服务时间':8} 运行结果 先来先服务算法 调度顺序:['A', 'B', 'C', 'D', 'E', 'F'] 周转时间: 带权周转时间: 短作业优先算法 调度顺序:['A', 'D', 'F', 'C', 'E', 'B'] 周转时间: 带权周转时间:1. 响应比高者优先算法 调度顺序:['A', 'D', 'F', 'E', 'C', 'B'] 周转时间: 带权周转时间: 五、代码 #encoding=gbk workA={'作业名':'A','到达时间':0,'服务时间':6,'结束时间':0,'周转时间':0,'带权周转时间':0} workB={'作业名':'B','到达时间':2,'服务时间':50} workC={'作业名':'C','到达时间':5,'服务时间':20} workD={'作业名':'D','到达时间':5,'服务时间':10} workE={'作业名':'E','到达时间':12,'服务时间':40} workF={'作业名':'F','到达时间':15,'服务时间':8} list1=[workB,workA,workC,workD,workE,workF] list2=[workB,workA,workC,workD,workE,workF] list3=[workB,workA,workC,workD,workE,workF] #先来先服务算法 def fcfs(list): resultlist = sorted(list, key=lambda s: s['到达时间']) return resultlist #短作业优先算法 def sjf(list): time=0 resultlist=[] for work1 in list: time+=work1['服务时间'] listdd=[] ctime=0 for i in range(time): for work2 in list: if work2['到达时间']<=ctime: (work2) if len(listdd)!=0: li = sorted(listdd, key=lambda s: s['服务时间']) (li[0]) (li[0]) ctime+=li[0]['服务时间'] listdd=[] 《操作系统原理》 课程设计报告书 题目:磁盘调度 专业:网络工程 学号: 学生姓名: 指导教师: 完成日期: 目录 第一章课程设计目的 (1) 1.1 编写目的 (1) 第二章课程设计内容 (2) 2.1 设计内容 (2) 2.1.1、先来先服务算法(FCFS) (2) 2.1.2、最短寻道时间优先算法(SSTF) (2) 2.1.3、扫描算法(SCAN ) (3) 2.1.4、循环扫描算法(CSCAN ) (3) 第三章系统概要设计 (4) 3.1 模块调度关系图 (4) 3.2 模块程序流程图 (4) 3.2.1 FCFS 算法 (5) 3.2.2 SSTF 算法 (6) 3.2.3 SCAN 算法 (7) 3.2.4 CSCAN 算法 (8) 第四章程序实现 (9) 4.1 主函数的代码实现 (9) 4.2.FCFS 算法的代码实现 (11) 4.3 SSTF 算法的代码实现 ...................................................... 13 4.4 SCAN 算法的代码实现..................................................... 15 4.5 CSCAN 算法的代码实现.................................................... 17 第五章测试数据和结果 (20) 第六章总结 (23) 第一章课程设计目的 1.1 编写目的 本课程设计的目的是通过磁盘调度算法设计一个磁盘调度模拟系统,从而使磁盘调度算法更加形象化,容易使人理解,使磁盘调度的特点更简单明了,能使使用者加深对先来先服务算法、最短寻道时间优先算法、扫描算法以及循环扫描算法等磁盘调度算法的理解 源代码: #include 实验一批处理系统的作业调度 一、实验目的 1.加深对作业概念的理解。 2.深入了解批处理系统如何组织作业、管理作业和调度作业。 二、实验预备知识 1.作业的概念。 2.作业的创建。 3.作业的调度。 三、实验内容 编写程序完成批处理系统中的作业调度,要求采用响应比高者优先的作业调度算法。实验具体包括:首先确定作业控制块的内容,作业控制块的组成方式;然后完成作业调度;最后编写主函数对所做工作进行测试。 四、提示与讲解 操作系统根据允许并行工作的道数和一定的算法从系统中选取若干作业把它们装入主存储器,使它们有机会获得处理器运行,这项工作被称为“作业调度”。实现这部分功能的程序就是“作业调度程序”。 作业调度的实现主要有两个问题,一个是如何将系统中的作业组织起来;另一个是如何进行作业调度。 为了将系统中的作业组织起来,需要为每个进入系统的作业建立档案以记录和作业相关的信息,例如作业名、作业所需资源、作业执行时间、作业进入系统的时间、作业信息在存储器中的位置、指向下一个作业控制块的指针等信息。这个记录作业相关信息的数据块称为作业控制块(JCB),并将系统中等待作业调度的作业控制块组织成一个队列,这个队列称为后备队列。一个作业全部信息进入系统后,就为其建立作业控制块,并挂入后备队列。当进行作业调度时,从后备队列中查找选择作业。 由于实验中没有实际作业,作业控制块中的信息内容只使用了实验中需要的数据。作业控制块中首先应该包括作业名;其次是作业所需资源,根据需要,实验中只包括需要主存的大小(采用可移动的动态分区方式管理主存,作业大小就是需要主存的大小)、需要打印机的数量和需要磁带机的数量;采用响应比作业调度算法,为了计算响应比,还需要有作业的估计执行时间、作业在系统中的等待时间;另外,指向下一个作业控制块的指针必不可少。 实验中,作业控制块及队列的数据结构定义如下: typedef struct jcb { char name[4]; //作业名 int length; //作业长度,所需主存大小 int printer; //作业执行所需打印机的数量 int tape; //作业执行所需磁带机的数量 int runtime; //作业估计执行时间 int waittime; //作业在系统中的等待时间 int next; //指向下一个作业控制块的指针 } JCB //作业控制块类型定义 存放作业控制块的区域: #define n 10 //假定系统中可容纳的作业数量为n JCB jobtable[10]; //作业表 操作系统实验报告课程名称:计算机操作系统 实验项目名称:磁盘调度实验时间: 班级:姓名:学号: 实验目的: 对操作系统的磁盘调度基础理论和重要算法的理解,加强动手能力。 实验环境: PC机 win7 Visual C++ 实验内容: 编程序实现下述磁盘调度算法,并求出每种算法的平均寻道长度,要求设计主界面以灵 活选择某算法,且以下算法都要实现: 1、先来先服务算法(FCFS) 2、最短寻道时间优先算法(SSTF) 3、扫描算法(SCAN) 4、循环扫描算法(CSCAN) 实验过程: 1.依次输入8个磁道数:123 45 31 67 20 19 38,并以0 结束 2.选择调度算法: (1)先来先服务算法(FCFS) (2)最短寻道时间优先算法(SSTF) 成绩: 指导教师(签名): (3)扫描算法(SCAN) (4)循环扫描算法(CSCAN) 实验心得: 通过本次实验,学习了解磁盘调度的工作原理及四种调度方法的工作原理,并且在当中操作系统磁盘调度算法实验报告
作业批处理调度java代码及实例
模拟批处理多道操作系统的作业调度
磁盘调度实验报告
实验1-批处理作业调度
操作系统作业调度实验报告
操作系统实验报告-作业调度
操作系统磁盘调度算法实验报告
作业调度实例(全部代码)
实验一 批处理系统的作业调度
磁盘调度实验报告