操作系统作业调度实验报告 多道批处理

操作系统作业调度实验报告 多道批处理
操作系统作业调度实验报告 多道批处理

计算机学院计算机科学与技术专业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->rtimentime)

{

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->rtimentime)

{ (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) 扫描算法不仅考虑到欲访问的磁道与当前磁道的距离,更优先考虑的是磁头的当前移动方向。例如,当磁头正在自里向外移动时,扫描算法所选择的下一个访问对象应是其欲访问的磁道既在当前磁道之外,又是距离最近的。这样自里向外地访问,直到

作业批处理调度java代码及实例

代码 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 #include #include #include #include #define TotalSearch 20 //FCFS float Averg_FCFS(int array[],int num) { int i; float averg,sum=0; printf("FCFS算法寻道:\n"); for(i=0;i

printf("SSTF算法寻道:\n"); for(i=0;i

实验1-批处理作业调度

批处理系统的作业调度 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 #include #include #define getpch(type) (type*)malloc(sizeof(type)) #define NULL 0 int n; float T1=0,T2=0; int times=0; struct jcb //作业控制块 { char name[10]; //作业名 int reachtime; //作业到达时间

操作系统实验报告-作业调度

作业调度 一、实验目的 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 #include #include #define getpch(type) (type*)malloc(sizeof(type)) #define NULL 0 int n; float T1=0,T2=0; int times=0; struct jcb //作业控制块 { char name[10]; //作业名 int reachtime; //作业到达时间 int starttime; //作业开始时间 int needtime; //作业需要运行的时间 float super; //作业的响应比 int finishtime; //作业完成时间 float cycletime; //作业周转时间 float cltime; //作业带权周转时间 char state; //作业状态 struct jcb *next; //结构体指针 }*ready=NULL,*p,*q; typedef struct jcb JCB; void inize() //初始化界面 { printf("\n\n\t\t*********************************************\t\t\n"); printf("\t\t\t\t单道批处理作业调度系统\n"); printf("\t\t*********************************************\t\t\n"); printf("\n\n\n\t\t\t\t\t09软件+电子商务2班\n"); printf("\t\t\t\t\t\t黄才旺\n\n"); printf("\n\n\n\t\t请按任意键进入主菜单:"); getch(); } void inital() //建立作业控制块队列,先将其排成先来先服务的模式队列{ int i; printf("\n输入作业数:"); scanf("%d",&n); for(i=0;iname); getch();

实验一 批处理系统的作业调度

实验一批处理系统的作业调度 一、实验目的 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) 实验心得: 通过本次实验,学习了解磁盘调度的工作原理及四种调度方法的工作原理,并且在当中

发现了自己的不足,对以前所学过的知识理解得不够深刻,掌握得不够牢固,看到了自己的实践经验还是比较缺乏,理论联系实际的能力还急需提高。 附录: #include #include #include #include #define maxsize 1000 /*********************判断输入数据是否有效**************************/ int decide(char str[]) //判断输入数据是否有效 { int i=0; while(str[i]!='\0') { if(str[i]<'0'||str[i]>'9') { return 0; break; } i++; } return i; } /******************将字符串转换成数字***********************/ int trans(char str[],int a) //将字符串转换成数字 { int i; int sum=0; for(i=0;icidao[j]) { temp=cidao[i]; cidao[i]=cidao[j]; cidao[j]=temp; } } cout<<" 排序后的磁盘序列为:"; for( i=0;i

操作系统实验报告-作业调度实验

作业调度实验 一.实验目的及要求: 用高级语言编写和调试一个或多个作业调度的模拟程序,以加深对作业调度算法的理解。 二. 实验环境: 操作系统:Windows XP 编译环境:Visual C++ 6.0 三.算法描述 由于在单道批处理系统中,作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所占用的 CPU时限等因素。 作业调度算法:采用先来先服务(FCFS)调度算法,即按作业提交的先后次序进行调度。总是首先调度在系统中等待时间最长的作业。 每个作业由一个作业控制块JCB表示,JCB可以包含如下信息:作业名、提交时间、所需的运行时间、所需的资源、作业状态、链指针等等。 作业的状态可以是等待W(Wait)、运行R(Run)和完成F(Finish)三种状态之一。每个作业的最初状态总是等待W。 各个等待的作业按照提交时刻的先后次序排队,总是首先调度等待队列中队首的作业。 每个作业完成后要打印该作业的开始运行时刻、完成时刻、周转时间和带权周转时间,这一组作业完成后要计算并打印这组作业的平均周转时间、带权平均周转时间。 四. 实验步骤: 1.、作业等待算法:分别采用先来先服务(FCFS),最短作业优先(SJF)调度算法。 对每种调度算法都要求打印每个作业开始运行时刻、完成时刻、周转时间、带权周转时间。 2.程序流程图

3、程序源码结构: void main() { void fcfs(); void sjf(); ... while(1){ printf("\n\t\t/* 1、fcfs */"); printf("\n\t\t/* 2、sjf */"); printf("\n\t\t/* 0、Exit */\n"); printf("\n\n\t请选择:\t"); scanf("%d",&a); printf("\n"); switch(a){ case 1: fcfs();break; case 2: sjf();break; default: break; } if(a!=1&&a!=2) break; } }

天津理工大学操作系统实验3:磁盘调度算法的实现

人和以吟实验报告学院(系)名称:计算机与通信工程学院

【实验过程记录(源程序、测试用例、测试结果及心得体会等) 】 #include #include #include using namespace std; void Inith() { cout<<" 请输入磁道数: "; cin>>M; cout<<" 请输入提出磁盘 I/O 申请的进程数 cin>>N; cout<<" 请依次输入要访问的磁道号: "; for(int i=0;i>TrackOrder[i]; for(int j=0;j>BeginNum; for(int k=0;k=0;i--) for(int j=0;jSortOrder[j+1]) const int MaxNumber=100; int TrackOrder[MaxNumber]; int MoveDistance[MaxNumber]; // ------- int FindOrder[MaxNumber]; // ---------- double AverageDistance; // ----------- bool direction; // int BeginNum; // int M; // int N; // int SortOrder[MaxNumber]; // ------ bool Finished[MaxNumber]; 移动距离 ; 寻好序列。 平均寻道长度 方向 true 时为向外, false 开始磁道号。 磁道数。 提出磁盘 I/O 申请的进程数 排序后的序列 为向里

PBS作业调度使用方法

PBS作业调度使用方法: 1.IBM HPC Platform 作业提交流程 用户需要使用集群资源进行作业计算时,需要使用作业调度系统。 IBM HPC Platform集群采用的是开源的Torque+Maui作业调度系统。 ●任何用户都需要产生Job_que.sh任务作业脚本: >> genQue 当前文件夹下会产生一个Job_que.sh 的shell作业脚本文件 ●编辑Job_que.sh任务作业脚本: >> vi Job_que.sh ●提交Job_que.sh任务作业脚本: >> qsub Job_que.sh 注意:在Job_que.sh中,所有任务的运行时间超过120小时的情况下,job作业将会被自动停止!如果有疑问和延长作业运行时间的需要请直接联系管理员。 具体的更多关于任务作业脚本的说明、使用和提交请参考vi和本章第2小节:Torque PBS作业调度系统使用说明。 2.Torque PBS作业调度系统使用说明 Torque PBS 提供对批处理作业和分散的计算节点(Compute nodes)的控制。 PBS是Protable Batch System的缩写,是一个任务管理系统。当多个用户使用同一个计算资源时,每个用户用PBS脚本提交自己的任务,由PBS对这些任务进行管理和资源的分配。 ●matlab作业的PBS脚本说明:

#!/bin/sh #PBS -N JOB #PBS -l nodes=1:ppn=8 #PBS -l feature=xe #PBS -l naccesspolicy=singlejob #PBS -o RunJob.out #PBS -e RunJob.err #PBS -l walltime=120:00:00 #PBS -q batch echo --------- `date` ---------- echo HomeDirectory is $PWD echo echo Current Dir is $PBS_O_WORKDIR echo cd $PBS_O_WORKDIR echo "------------This is the node file -------------" cat $PBS_NODEFILE echo "-----------------------------------------------" cat $PBS_NODEFILE > host.mpd np=$(cat $PBS_NODEFILE | wc -l) echo The number of core is $np echo echo #-----------------------------------------------------# # OpenMPI Job Submitting Example # # # mpirun -np $np -machinefile host.mpd $BINPATH ... # # #-__--------------------------------------------------# # -__- have fun! # matlab –nojvm –nodesktop < test.m > log 将这个脚本保存成为Job_que.sh后,使用然后qsub Job_que.sh就将这个任务提交给了系统。最后可以通过查看我那件下面log文件查看程序运行结果。

操作系统作业调度实验报告-多道批处理

计算机学院计算机科学与技术专业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)调度算法,

操作系统实验 FCFS和短作业优先SJF调度算法模拟

. 题目先来先服务FCFS和短作业优先SJF进程调度算法 姓名: 学号: 专业: 学院: 指导教师:林若宁 二零一八年十一月

一、实验目的 模拟单处理器系统的进程调度,分别采用短作业优先和先来先服务的进程调度算法作为进程设计算法,以加深对进程的概念及进程调度算法的理解. 二、实验内容 1. 短作业优先调度算法原理 短作业优先调度算法,是指对短作业或断进程优先调度的算法。它们可以分别可以用于作业调度和进程调度。短作业优先调度算法,是从后备队列中选择一个或若干个运行时间最短的作业,将它们调入内存运行。短进程优先调度算法,是从就绪队列中选出一个估计运行时间最短的进程,将处理机分配给它使它立即执行并一直执行到完成,或发生某事件而被阻塞放弃处理机时再重新调度。 2. 先来先服务调度算法原理 先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可用于进程调度。当在作业调度中采用该算法时,每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将它们调入内存,为它们分配资源、创建进程,然后放入就绪队列。在进程调度中采用FCFS算法时,则每次调度是从就绪队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行。该进程一直运行到完成或发生某事件而阻塞后才放弃处理机。 三、程序设计 1.概要设计 程序包括主函数、FCFS算法函数、SJF算法函数、输出函数;主函数流程:输入文件中的数据—显示各进程数据—选择算法—调用相应算法的函数—输出结果 2.算法流程

SJF算法流程图:

3.详细设计 (1)定义一个结构体 typedef struct PCB { char job_id[10]; //作业ID float Arr_time; //到达时刻 float Fun_time; //估计运行时间 float Wait_time; //等待时间 float Start_time; //开始时刻 float Fin_time; //完成时刻 float Tur_time; //周转时间 float WTur_time; //带权周转时间 int Order; //优先标记 }list; (2)先来先服务算法函数 void fcfs(list *p,int count) //先来先服务算法{ list temp; //临时结构体变量int i; int j;

操作系统实验 磁盘调度算法

操作系统 实验报告 哈尔滨工程大学 计算机科学与技术学院

第六讲磁盘调度算法 一、实验概述 1. 实验名称 磁盘调度算法 2. 实验目的 (1)通过学习EOS 实现磁盘调度算法的机制,掌握磁盘调度算法执行的条件和时机; (2)观察 EOS 实现的FCFS、SSTF和 SCAN磁盘调度算法,了解常用的磁盘调度算法; (3)编写 CSCAN和 N-Step-SCAN磁盘调度算法,加深对各种扫描算法的理解。 3. 实验类型 验证性+设计性实验 4. 实验内容 (1)验证先来先服务(FCFS)磁盘调度算法; (2)验证最短寻道时间优先(SSTF)磁盘调度算法; (3)验证SSTF算法造成的线程“饥饿”现象; (4)验证扫描(SCAN)磁盘调度算法; (5)改写SCAN算法。 二、实验环境 在OS Lab实验环境的基础上,利用EOS操作系统,由汇编语言及C语言编写代码,对需要的项目进行生成、调试、查看和修改,并通过EOS应用程序使内核从源代码变为可以在虚拟机上使用。 三、实验过程 1. 设计思路和流程图 (1)改写SCAN算法 在已有 SCAN 算法源代码的基础上进行改写,要求不再使用双重循环,而是只遍历一次请求队列中的请求,就可以选中下一个要处理的请求。算法流程图如下图所示。 图 3.1.1 SCAN算法IopDiskSchedule函数流程图(2)编写循环扫描(CSCAN)磁盘调度算法 在已经完成的SCAN算法源代码的基础上进行改写,不再使用全局变量ScanInside 确定磁头移动的方向,而是规定磁头只能从外向内移动。当磁头移动到最内的被访问磁道时,磁头立即移动到最外的被访问磁道,即将最大磁道号紧接着最小磁道号构成循环,进行扫描。算法流程图如下图所示。

相关文档
最新文档