作业调度实验(含代码)

作业调度实验(含代码)
作业调度实验(含代码)

源代码:

#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;i

{

p=getpch(JCB);

printf("\n输入作业名:");

scanf("%s",p->name);

getch();

p->reachtime=i;

printf("作业默认到达时间:%d",i);

printf("\n输入作业需运行时间:");

scanf("%d",&p->needtime);

p->state='W';

p->next=NULL;

if(ready==NULL) ready=q=p;

else{

q->next=p;

q=p;

}

}

}

void disp(JCB* q,int m) //显示作业运行后的周转时间及带权周转时间等{

if(m==3) //显示高响应比算法调度作业后的运行情况 {

printf("\n作业%s正在运行,估计其运行情况:\n",q->name);

printf("\n 开始运行时刻 \t 完成时刻 \t 周转时间 \t 带权周转时间 \t相应比 \n");

printf(" %d \t",q->starttime);

printf(" %d \t",q->finishtime);

printf(" %f \t",q->cycletime);

printf(" %f\t",q->cltime);

printf(" %f\n",q->super);

getch();

}

else // 显示先来先服务,最短作业优先算法调度后作业的运行情况

{

printf("\n作业%s正在运行,估计其运行情况:\n",q->name);

printf("\n 开始运行时刻 \t 完成时刻 \t 周转时间 \t 带权周转时间 \n");

printf(" %d \t",q->starttime);

printf(" %d \t",q->finishtime);

printf(" %f \t",q->cycletime);

printf(" %f\t",q->cltime);

getch();

}

}

void running(JCB *p,int m) //运行作业

{

if(p==ready) //先将要运行的作业从队列中分离出来

{

ready=p->next;

p->next=NULL;

}

else

{

q=ready;

while(q->next!=p) q=q->next;

q->next=p->next;

}

p->starttime=times;//计算作业运行后的完成时间,周转时间等等 p->state='R';

p->finishtime=p->starttime+p->needtime;

p->cycletime=(float)(p->finishtime-p->reachtime);

p->cltime=(float)(p->cycletime/p->needtime);

T1+=p->cycletime;

T2+=p->cltime;

disp(p,m); //调用disp()函数,显示作业运行情况 times+=p->needtime;

p->state='F';

printf("\n%s 作业已完成!\n请按任意键继续...\n",p->name);

free(p); //释放运行后的作业

getch();

}

void super() //计算队列中作业的高响应比

{

JCB *padv;

padv=ready;

do{

if(padv->state=='W'&&padv->reachtime<=times)

padv->super=(float)(times-padv->reachtime+padv->needtime)/padv->n eedtime;

padv=padv->next;

}while(padv!=NULL);

}

void final() //最后打印作业的平均周转时间,平均带权周转时间{

float s,t;

t=T1/n;

s=T2/n;

getch();

printf("\n\n作业已经全部完成!");

printf("\n%d个作业的平均周转时间是:%f",n,t);

printf("\n%d个作业的平均带权周转时间是:%f\n\n\n",n,s);

}

void hrn(int m) //高响应比算法

{

JCB *min;

int i,iden;

system("cls");

inital();

for(i=0;i

{

p=min=ready;iden=1;

super();

do{

if(p->state=='W'&&p->reachtime<=times)

if(iden)

{

min=p;iden=0;

}

else if(p->super>min->super) min=p; p=p->next;

}while(p!=NULL);

if(iden)

{

i--;times++;

if(times>1000)

{printf("\nruntime is too long...error...");getch();} }

else

{

running(min,m); //调用running()函数 }

} //for

final(); //调用running()函数

}

void sjf(int m) // 最短作业优先算法

{

JCB *min;

int i,iden;

system("cls");

inital();

for(i=0;i

{

p=min=ready;iden=1;

do{

if(p->state=='W'&&p->reachtime<=times)

if(iden){

min=p;iden=0;

}

else if(p->needtimeneedtime) min=p;

p=p->next;

}while(p!=NULL) ;

if(iden) {

i--;

times++;

if(times>100){printf("\nruntime is too long...error");getch();} }

else{

running(min,m); //调用running()函数

}

} //for

final(); //调用running()函数

}

void fcfs(int m) //先来先服务算法

{

int i,iden;

system("cls");

inital();

for(i=0;i

{

p=ready;iden=1;

do{

if(p->state=='W'&&p->reachtime<=times) iden=0;

if(iden)p=p->next;

}while(p!=NULL&&iden) ;

if(iden)

{

i--;

printf("\n没有满足要求的进程,需等待");

times++;

if(times>100){printf("\n时间过长");getch();}

}

else{

running(p,m); //调用running()函数

}

}

final(); //调用running()函数

}

void mune()

{

int m;

system("cls");

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\t1.先来先服务算法");

printf("\n\t\t\t2.最短作业优先算法");

printf("\n\t\t\t3.响应比高者优先算法");

printf("\n\t\t\t0.退出程序");

printf("\n\n\t\t\t\t选择算法:");

scanf("%d",&m);

switch(m)

{

case 1:

fcfs(m);

getch();

system("cls");

mune();

break;

case 2:

sjf(m);

getch();

system("cls");

mune();

break;

case 3:

hrn(m);

getch();

system("cls");

mune();

break;

case 0:

system("cls");

break;

default:

printf("选择错误,重新选择.");

getch();

system("cls");

mune();

}

}

main() //主函数

{

inize();

mune();

}

选择1进入“先来先服务算法”作业调度:

选择2进入“最短作业优先算法”作业调度:

选择3进入“响应比高者优先算法”作业调度:

实验五-页面调度算法模拟实验报告

《计算机操作系统》实验报告 实验五:页面调度算法模拟 学校:╳╳╳ 院系:╳╳╳ 班级:╳╳╳ 姓名:╳╳╳ 学号:╳╳╳

指导教师:╳╳╳ 目录 一、实验题目 (3) 二、实验学时 (4) 三、指导老师 (4) 四、实验日期 (4) 五、实验目的 (4) 六、实验原理 (4) 6.1页面的含义 (4) 6.2 页面置换算法的含义 (4) 6.3 置换算法 (4) 6.3.1最佳置换算法(Optimal) (5) 6.3.2先进先出(FIFO)页面置换算法 (5) 6.3.3 LRU置换算法 (5) 七、实验步骤及结果 (5)

7.1 验证最佳置换算法 (5) 7.1.1 实验截图 (5) 7.1.2 实验分析 (6) 7.2 验证先进先出(FIFO)页面置换算法 (7) 7.2.1 实验截图 (7) 7.2.2 实验分析 (7) 7.3 验证LRU置换算法 (8) 7.3.1 实验截图 (8) 7.3.2 实验分析 (8) 八、报告书写人 (9) 附录一最佳置换算法(Optimal) (9) 附录二先进先出(FIFO)页面置换算法 (15) 附录三LRU置换算法 (20) 实验五:页面调度算法模拟 一、实验题目 页面调度算法模拟

二、实验学时 2学时 三、指导老师 ╳╳╳ 四、实验日期 2018年12月10日星期一 五、实验目的 (1)熟悉操作系统页面调度算法 (2)编写程序模拟先进先出、LRU等页面调度算法,体会页面调度算法原理 六、实验原理 6.1页面的含义 分页存储管理将一个进程的逻辑地址空间分成若干大小相等的片,称为页面或页。 6.2 页面置换算法的含义 在进程运行过程中,若其所要访问的页面不在内存而需把它们调入内存,但内存已无空闲空间时,为了保证该进程能正常运行,系统必须从内存中调出一页程序或数据,送磁盘的对换区中。但应将哪个页面调出,须根据一定的算法来确定。通常,把选择换出页面的算法称为页面置换算法(Page_Replacement Algorithms)。 6.3 置换算法 一个好的页面置换算法,应具有较低的页面更换频率。从理论上讲,应将那些以后不再会访问的页面换出,或将那些在较长时间内不会再访问的页面调出。

作业调度_实验报告

实验名 称 作业调度 实验内容1、设计可用于该实验的作业控制块; 2、动态或静态创建多个作业; 3、模拟先来先服务调度算法和短作业优先调度算法。 3、调度所创建的作业并显示调度结果(要求至少显示出各作业的到达时间,服务时间,开始时间,完成时间,周转时间和带权周转时间); 3、比较两种调度算法的优劣。 实验原理一、作业 作业(Job)是系统为完成一个用户的计算任务(或一次事物处理)所做的工作总和,它由程序、数据和作业说明书三部分组成,系统根据该说明书来对程序的运行进行控制。在批处理系统中,是以作业为基本单位从外存调入内存的。 二、作业控制块J C B(J o b C o nt r o l Bl o ck) 作业控制块JCB是记录与该作业有关的各种信息的登记表。为了管理和调度作业,在多道批处理系统中为每个作业设置了一个作业控制块,如同进程控制块是进程在系统中存在的标志一样,它是作业在系统中存在的标志,其中保存了系统对作业进行管理和调度所需的全部信息。在JCB中所包含的内容因系统而异,通常应包含的内容有:作业标识、用户名称、用户帐户、作业类型(CPU 繁忙型、I/O 繁忙型、批量型、终端型)、作业状态、调度信息(优先级、作业已运行时间)、资源需求(预计运行时间、要求内存大小、要求I/O设备的类型和数量等)、进入系统时间、开始处理时间、作业完成时间、作业退出时间、资源使用情况等。 三、作业调度 作业调度的主要功能是根据作业控制块中的信息,审查系统能否满足用户作业的资源需求,以及按照一定的算法,从外存的后备队列中选取某些作业调入内存,并为它们创建进程、分配必要的资源。然后再将新创建的进程插入就绪队列,准备执行。 四、选择调度算法的准则 1).面向用户的准则 (1) 周转时间短。通常把周转时间的长短作为评价批处理系统的性能、选择作业调度方式与算法的重要准则之一。所谓周转时间,是指从作业被提交给系统开始,到作业完成为止的这段时间间隔(称

作业调度实验报告

作业调度实验报告 Document number:NOCG-YUNOO-BUYTT-UU986-1986UT

实验二作业调度 一.实验题目 1、编写并调试一个单道处理系统的作业等待模拟程序。 作业调度算法:分别采用先来先服务(FCFS),最短作业优先(SJF)、响应比高者优先(HRN)的调度算法。 (1)先来先服务算法:按照作业提交给系统的先后顺序来挑选作业,先提交的先被挑选。 (2)最短作业优先算法:是以进入系统的作业所提出的“执行时间”为标准,总是优先选取执行时间最短的作业。 (3)响应比高者优先算法:是在每次调度前都要计算所有被选作业(在后备队列中)的响应比,然后选择响应比最高的作业执行。 2、编写并调度一个多道程序系统的作业调度模拟程序。 作业调度算法:采用基于先来先服务的调度算法。可以参考课本中的方法进行设计。 对于多道程序系统,要假定系统中具有的各种资源及数量、调度作业时必须考虑到每个作业的资源要求。 二.实验目的: 本实验要求用高级语言(C语言实验环境)编写和调试一个或多个作业调度的模拟程序,了解作业调度在操作系统中的作用,以加深对作业调度算法的理解三 .实验过程 <一>单道处理系统作业调度 1)单道处理程序作业调度实验的源程序: 执行程序: 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 .\n",p->name); free(p); .wait...",time); if(times>1000) 代替 代替

进程调度算法实验报告

操作系统实验报告(二) 实验题目:进程调度算法 实验环境:C++ 实验目的:编程模拟实现几种常见的进程调度算法,通过对几组进程分别使用不同的调度算法,计算进程的平均周转时间和平均带权周转时间,比较 各种算法的性能优劣。 实验内容:编程实现如下算法: 1.先来先服务算法; 2.短进程优先算法; 3.时间片轮转调度算法。 设计分析: 程序流程图: 1.先来先服务算法 开始 初始化PCB,输入进程信息 各进程按先来先到的顺序进入就绪队列 结束 就绪队列? 运行 运行进程所需CPU时间 取消该进程 2.短进程优先算法

3.时间片轮转调度算法 实验代码: 1.先来先服务算法 #include #define n 20 typedef struct { int id; //进程名

int atime; //进程到达时间 int runtime; //进程运行时间 }fcs; void main() { int amount,i,j,diao,huan; fcs f[n]; cout<<"请输入进程个数:"<>amount; for(i=0;i>f[i].id; cin>>f[i].atime; cin>>f[i].runtime; } for(i=0;if[j+1].atime) {diao=f[j].atime; f[j].atime=f[j+1].atime; f[j+1].atime=diao; huan=f[j].id; f[j].id=f[j+1].id; f[j+1].id=huan; } } } for(i=0;i #define n 5 #define num 5 #define max 65535 typedef struct pro { int PRO_ID; int arrive_time;

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

作业调度 一、实验目的 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、编写并调试一个单道处理系统的作业等待模拟程序。 作业调度算法:分别采用先来先服务(FCFS,最短作业优先(SJF)、响应 比高者优先(HRN的调度算法。 (1)先来先服务算法:按照作业提交给系统的先后顺序来挑选作业, 先提交的先被挑选。 (2)最短作业优先算法:是以进入系统的作业所提出的“执行时间”为标准, 总是优先选取执行时间最短的作业。 (3)响应比高者优先算法:是在每次调度前都要计算所有被选作业(在后备队列中)的响应比,然后选择响应比最高的作业执行。 2、编写并调度一个多道程序系统的作业调度模拟程序。 作业调度算法:采用基于先来先服务的调度算法。可以参考课本中的方法进 行设计。 对于多道程序系统,要假定系统中具有的各种资源及数量、调度作业时必须考虑到每个作业的资源要求。 二. 实验目的: 本实验要求用高级语言(C语言实验环境)编写和调试一个或多个作业调度的模拟程序,了解作业调度在操作系统中的作用,以加深对作业调度算法的理解 三. 实验过程 < 一>单道处理系统作业调度 1)单道处理程序作业调度实验的源程序: zuoye.c 执行程序: zuoye.exe 2)实验分析:

1、由于在单道批处理系统中,作业一投入运行,它就占有计算机的一切资 源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到 满足,它所占用的CPU时限等因素。 2、每个作业由一个作业控制块JCB表示,JCB可以包含如下信息:作业名、 提交时间、所需的运行时间、所需的资源、作业状态、链指针等等。作业 的状态可以是等待W(Wait)、运行R(Run)和完成F(Finish)三种状态之一 每个作业的最初状态总是等待W 3、对每种调度算法都要求打印每个作业幵始运行时刻、完成时刻、周转时 间、带权周转时间,以及这组作业的平均周转时间及带权平均周转时间 3) 流程图: .最短作业优先算法 三.高响应比算法 图一.先来先服务流程图 4) 源程序: #in elude #in elude #in elude vconi o.h> #defi ne getpeh(type) (type*)malloc(sizeof(type)) #defi ne NULL 0 int n; float T1=0,T2=0; int times=0;

先来先服务FCFS和短作业优先SJF进程调度算法_实验报告材料

先来先服务FCFS和短作业优先SJF进程调度算法 1、实验目的 通过这次实验,加深对进程概念的理解,进一步掌握进程状态的转变、进程调度的策略及对系统性能的评价方法。 2、需求分析 (1) 输入的形式和输入值的范围 输入值:进程个数Num 范围:0

说明本程序中用到的所有抽象数据类型的定义、主程序的流程以及各程序模块之间的层次(调用)关系。 4、详细设计 5、调试分析 (1)调试过程中遇到的问题以及解决方法,设计与实现的回顾讨论和分析 ○1开始的时候没有判断进程是否到达,导致短进程优先算法运行结果错误,后来加上了判断语句后就解决了改问题。 ○2 基本完成的设计所要实现的功能,总的来说,FCFS编写容易,SJF 需要先找到已经到达的进程,再从已经到达的进程里找到进程服务时间最短的进程,再进行计算。 (2)算法的改进设想 改进:即使用户输入的进程到达时间没有先后顺序也能准确的计算出结果。(就是再加个循环,判断各个进程的到达时间先后,组成一个有序的序列) (3)经验和体会 通过本次实验,深入理解了先来先服务和短进程优先进程调度算法的思想,培养了自己的动手能力,通过实践加深了记忆。 6、用户使用说明 (1)输入进程个数Num

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

作业调度实验 一.实验目的及要求: 用高级语言编写和调试一个或多个作业调度的模拟程序,以加深对作业调度算法的理解。 二. 实验环境: 操作系统: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; } }

时间片轮转调度算法实验报告

xx大学操作系统实验报告 姓名:学号:班级: 实验日期: 实验名称:时间片轮转RR进程调度算法 实验二时间片轮转RR进程调度算法 1.实验目的:通过这次实验,理解时间片轮转RR进程调度算法的运行原理,进一步 掌握进程状态的转变、进程调度的策略及对系统性能的评价方法。 2.需求分析 (1) 输入的形式和输入值的范围; 输入:进程个数n 范围:0

(4) 测试数据,包括正确的输入及其输出结果和含有错误的输入及其输出结果。正确输入: 错误输入:

2、概要设计 所有抽象数据类型的定义: static int MaxNum=100 int ArrivalTime //到达时间 int ServiceTime //服务时间 int FinishedTime //结束时间 int WholeTime //周转时间 double WeightWholeTime //带权周转时间double AverageWT //平均周转时间double AverageWWT //平均带权周转时间主程序的流程: 变量初始化

作业调度实验报告

实验项 目名称 作业调度 实验目的及要求一、实验目的: 1、通过模拟作业调度算法的设计加深对作业管理基本原理的理解。 2、深入了解批处理系统如何组织作业、管理作业和调度作业。 3、掌握作业调度算法。 二、实验要求: 1、编写程序完成实验内容; 2、对测试数据进行分析; 3、撰写实验报告。 实验内容1、设计可用于该实验的作业控制块; 2、动态或静态创建多个作业; 3、模拟先来先服务调度算法和短作业优先调度算法。 3、调度所创建的作业并显示调度结果(要求至少显示出各作业的到达时间,服务时间,开始时间,完成时间,周转时间和带权周转时间); 3、比较两种调度算法的优劣。 实验原理一、作业 作业(Job)是系统为完成一个用户的计算任务(或一次事物处理)所做的工作总和,它由程序、数据和作业说明书三部分组成,系统根据该说明书来对程序的运行进行控制。在批处理系统中,是以作业为基本单位从外存调入内存的。 二、作业控制块J C B(J o b C o n t ro l B lo c k) 作业控制块JCB是记录与该作业有关的各种信息的登记表。为了管理和调度作业,在多道批处理系统中为每个作业设置了一个作业控制块,如同进程控制块是进程在系统中存在的标志一样,它是作业在系统中存在的标志,其中保存了系统对作业进行管理和调度所需的全部信息。在JCB中所包含的内容因系统而异,通常应包含的内容有:作业标识、用户名称、用户帐户、作业类型(CPU 繁忙型、I/O 繁忙型、批量型、终端型)、作业状态、调度信息(优先级、作业已运行时间)、资源需求(预计运行时间、要求内存大小、要求I/O设备的类型和数量等)、进入系统时间、开始处理时间、作业完成时间、作业退出时间、资源使用情况等。 三、作业调度 作业调度的主要功能是根据作业控制块中的信息,审查系统能否满足用户作业的资源需求,以及

作业调度算法(先来先服务算法,短作业算法)

《操作系统》实验报告 题目:作业调度算法 班级:网络工程 姓名:朱锦涛 学号:E31314037

一、实验目的 用代码实现页面调度算法,即先来先服务(FCFS)调度算法、短作业优先算法、高响应比优先调度算法。通过代码的具体实现,加深对算法的核心的理解。 二、实验原理 1.先来先服务(FCFS)调度算法 FCFS是最简单的调度算法,该算法既可用于作业调度,也可用于进程调度。当在作业调度中采用该算法时,系统将按照作业到达的先后次序来进行调度,或者说它是优先考虑在系统中等待时间最长的作业,而不管该作业所需执行的时间的长短,从后备作业队列中选择几个最先进入该队列的作业,将它们调入内存,为它们分配资源和创建进程。然后把它放入就绪队列。 2.短作业优先算法 SJF算法是以作业的长短来计算优先级,作业越短,其优先级越高。作业的长短是以作业所要求的运行时间来衡量的。SJF算法可以分别用于作业和进程调度。在把短作业优先调度算法用于作业调度时,它将从外存的作业后备队列中选择若干个估计运行时间最短的作业,优先将它们调入内存。 3、高响应比优先调度算法

高响应比优先调度算法则是既考虑了作业的等待时间,又考虑了作业的运行时间的算法,因此既照顾了短作业,又不致使长作业等待的时间过长,从而改善了处理机调度的性能。 如果我们引入一个动态优先级,即优先级是可以改变的令它随等待的时间的延长而增加,这将使长作业的优先级在等待期间不断地增加,等到足够的时间后,必然有机会获得处理机。该优先级的变化规律可以描述为: 优先权 = (等待时间 + 要求服务时间)/要求服务时间 三、实验内容 源程序: #include #include #include struct work { i nt id; i nt arrive_time;

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

实验二作业调度 一.实验题目 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.编写并调试一个模拟的进程调度程序,采用“最高优先数优先”调度算法对五个进程进行调度。 “最高优先数优先”调度算法的基本思想是把CPU分配给就绪队列中优先数最高的进程。 静态优先数是在创建进程时确定的,并在整个进程运行期间不再改变。 动态优先数是指进程的优先数在创建进程时可以给定一个初始值,并且可以按一定原则修改优先数。例如:在进程获得一次CPU后就将其优先数减少1。或者,进程等待的时间超过某一时限时增加其优先数的值,等等 该题根据老师给的代码用Visual C++运行,结果以及分析如下: 预习情况操作情况考勤情况数据处理情况

结果分析:根据上述输入的三个进程的信息可以得到:优先级最高的是进程cc 最先调度进程cc的状态为运行态,需要执行的时间为10当前就绪队列状态为:进程aa先级比较高,处于就绪队列前面,而进程bb先级是三者中最低的,所以处于就绪队列的最后。而此时这两个进程的状态都为就绪态。

结果分析:当进程cc了一个时间片之后而它已占用CPU时间已达到所需要的运行时间,则将它的优先级减1之后,再将三个进程按优先级的大小排列,从中选择优先级大的进程进入运行状态,则该次进入运行态的是进程aa 按照这种方式一直运行下去: 直到:

FCFS和SJF进程调度算法实验报告

FCFS和SJF进程调度算法实验报告 【实验题目】:编写程序,实现FCFS和SJF算法,模拟作 业调度过程,加深对作业调度的理解。 【实验内容】 实现FCFS和SJF调度算法。 –数据结构设计(JCB,后备作业队列) –算法实现与模拟(排序、调度) –输出调度结果,展示调度过程并解释 【实验要求】 1. 设计作业控制块(JCB)的数据结构 –应包含实验必须的数据项,如作业ID、需要的服务时间、进入系 统时间、完成时间,以及实验者认为有必要的其他数据项。 2. 实现排序算法(将作业排队) –策略1:按“进入系统时间”对作业队列排序(FCFS) –策略2:按“需要的服务时间”对作业队列排序(SJF) 3. 实现调度过程模拟 (1)每个作业用一个JCB表示,如果模拟FCFS,按策略1将作业排队,如果模拟SJF,按策略2将作业排队(2)选择队首的作业,将其从后备队列移出 (3)(作业运行过程,在本实验中,无需实现,可认为后备队列的 作业一但被调度程序选出,就顺利运行完毕,可以进入第4步) (4)计算选中作业的周转时间 (5)进行下一次调度(去往第2步) 4.实现结果输出 –输出作业状态表,展示调度过程 ?初始作业状态(未调度时) ?每次调度后的作业状态 设计作业控制块(JCB)的数据结构 每个作业由一个作业控制块JCB表示,JCB可以包含如下信息:作业名、提交时间、所需的运行时间、所需的资源、作业状态、链指针等等。具体结构如下:typedef struct jcb{ char name[10]; /* 作业名*/ char state; /* 作业状态*/ int ts; /* 提交时间*/ float super; /* 优先权*/ int tb; /* 开始运行时间*/ int tc; /* 完成时间*/ float ti; /* 周转时间*/ float wi; /* 带权周转时间*/ int ntime; /* 作业所需运行时间*/ char resource[10]; /* 所需资源*/ struct jcb *next; /* 结构体指针*/ } JCB; JCB *p,*tail=NULL,*head=NULL; 作业的状态可以是等待W(Wait)、运行R(Run)和完成F(Finish)三种状态之一。每个作业的最初状态总是等待W。,组成一个后备队列等待,总是首先调度等待队列中队首的作业。

短作业优先调度

实验一进程调度 一、实验目的 编写并调试一个模拟的进程调度程序,以加深对进程的概念及进程调度算法的理解. 二、实验内容 1.采用“短进程优先”调度算法对五个进程进行调度。每个进程有一个进 程控制块( PCB)表示。进程控制块可以包含如下信息:进程名、到达 时间、需要运行时间、已用CPU时间、进程状态等等。 2.每个进程的状态可以是就绪 W(Wait)、运行R(Run)、或完成F(Finish) 三种状态之一。每进行一次调度程序都打印一次运行进程、就绪队列、 以及各个进程的 PCB,以便进行检查。重复以上过程,直到所要进程都 完成为止。 三、实现思路 主函数-输入函数-短作业优先调度函数-输出函数。 这是一条最基础的思路。输入函数使用文本导入完成数据输入,输出函数输出调度结果,主函数完成各子函数连接,最主要的是短作业优先的调度函数。我想到的方法就是排序,不断选择需要运行时间最短的作业,接着进行数据输入计算输出等,遍历全部数据并完成调度。 四、主要的数据结构 struct Process_struct{ char name[MaxNum]; //进程名称 int arrivetime; //到达时间 int servertime; //开始运行时间 int finishtime; //运行结束时间 int runtime; //运行时间 int runflag; //调度标志 int order; //运行次序

double weightwholetime; //周转时间 double averagewt_FCFS,averagewt_SJF; //平均周转时间 double averagewwt_FCFS,averagewwt_SJF; //平均带权周转时间 }pro[MaxNum]; 五、算法流程图 六、运行与测试 用书上数据对程序进行测试,结果如下:

操作系统作业调度实验

实验作业调度 一、实验名称 作业调度算法的模拟实现 二、实验目标 作业调度又称宏观调度,其主要任务是对磁盘设备上大量的后备作业,以一定的原则进行挑选,给选中的作业分配内存等必须的资源,建立其相应的进程,让其投入运行。本实验要求学生用高级程序设计语言编写和调试一个简化的作业调度程序,模拟实现的调度算法包括:先来先服务调度算法,短作业优先调度算法,响应比高者优先调度算法等,并对这些算法的性能做比较和评价。 以加深学生对作业、作业调度以及作业调度的各种算法的理解。 三、实验环境要求 Windows+Visual C++ 6.0; 四、实验基本原理 作业调度主要是完成作业从后备状态到执行状态的转变,以及从执行状态到完成状态的转变。 (1)创建JCB(作业控制块):系统在作业进入后备状态时为每个作业创建一个作业控制块(JCB),从而使该作业可被调度程序感知。当该作业执行完毕进入完成状态时候,系统自动撤销其JCB 并释放有关资源,进而撤销该作业。 (2)按照作业调度算法,从后备队列中挑选一作业投入运行。作业调度程序为运行作业建立相应的进程,并分配资源。 (3)主要的作业调度算法包括:先来先服务(FCFS)、短作业优先和最高

响应比

4)调度策略的指标:最常用的调度性能指标有,周转时间(带权)、吞吐 率、响应时间以及设备利用率。 五、数据结构设计 (1)作业控制块,包括作业的基本信息描述struct time //时间的数据结构 { int hour; int minute; }; struct Job //作业 { string jobname; time intime; int runtime; time starttime; time endtime; int cycletime; float cltime; bool haverun; //作业名 //进入时间//作业估计运行时间//作业开始时间 //作业结束时间 //作业周转时间//作业带权周转时间//是否已运行 };

各类作业调度算法

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

三 . 实习题: 1、编写并调试一个单道处理系统的作业等待模拟程序。 作业等待算法:分别采用先来先服务(FCFS),最短作业优先(SJF)、响应比高者优先(HRN)的调度算法。 对每种调度算法都要求打印每个作业开始运行时刻、完成时刻、周转时间、带权周转时间,以及这组作业的平均周转时间及带权平均周转时间,以比较各种算法的优缺点。 2、编写并调度一个多道程序系统的作业调度模拟程序。

作业调度算法:采用基于先来先服务的调度算法。可以参考课本中的方法进行设计。 对于多道程序系统,要假定系统中具有的各种资源及数量、调度作业时必须考虑到每个作业的资源要求。 3、编写并调试一个多道程序系统的作业调度模拟程序。 作业调度算法:采用基于优先级的作业调度。 可以参考课本中的例子自行设计。 三 . 实验过程: 1、编写并调试一个单道处理系统的作业等待模拟程序。 先来先服务(FCFS): main.cpp: /* **先来先服作业调度算法模拟 */ #include #include #define MAX_SOURCE 1000 //资源总数(对于单通道的作业调度可以忽略系统资源问题) using namespace std; struct jobCB { string name; double subtime;//提交时间 double runtime;//运行时间 double source;//资源 char state;//进程状态 struct jobCB *next; //链指针 }*ready,*rail,*p; int length; double maxsource; double now_source; double allTi;//总周转时间 double allWi;//总带权周转时间 double time;//时钟 void init()

实验一进程调度实验报告

广东技术师范学院实验报告 学院: 计算机科学学 院 专业: 计算机科学与 技术(师范) 班级: 成绩: 姓名: 学号: 组别: 组员: 实验地点: 实验日期: 指导教师签名: 实验名称: 实验一、进程调度实验 一、实验目的 用高级语言编写与调试一个进程调度程序,以加深对进程的概念及进程调度算法的理解 二、实验类别 综合性实验。综合高级语言编程、进程调度模型、进程调度算法及数据结构等多方面的知识 三、实验内容与步骤 1.编写并调试一个模拟的进程调度程序,采用“最高优先数优先”调度算法对五个进程进行调度。 “最高优先数优先”调度算法的基本思想就是把CPU分配给就绪队列中优先数最高的进程。 静态优先数就是在创建进程时确定的,并在整个进程运行期间不再改变。 动态优先数就是指进程的优先数在创建进程时可以给定一个初始值,并且可以按一定原则修改优先数。例如:在进程获得一次CPU后就将其优先数减少1。或者,进程等待的时间超过某一时限时增加其优先数的值,等等 该题根据老师给的代码用Visual C++运行,结果以及分析如下:

结果分析:根据上述输入的三个进程的信息可以得到:优先级最高的就是进程cc最先调度进程cc的状态为运行态,需要执行的时间为10当前就绪队列状态为:进程aa先级比较高,处于就绪队列前面,而进程bb先级就是三者中最低的,所以处于就绪队列的最后。而此时这两个进程的状态都为就绪态。

结果分析:当进程cc了一个时间片之后而它已占用CPU时间已达到所需要的运行时间,则将它的优先级减1之后,再将三个进程按优先级的大小排列,从中选择优先级大的进程进入运行状态,则该次进入运行态的就是进程aa 按照这种方式一直运行下去: 直到:

磁盘调度实验报告

操作系统实验报告 磁 盘 调 度 实验六:磁盘调度算法 一.实验目的 复习模拟实现一种磁盘调度算法,进一步加深对磁盘调度效率的理解。 二.实验属性 该实验为设计性实验。 三.实验仪器设备及器材 普通PC386以上微机

四.实验要求 本实验要求2学时完成。 本实验要求完成如下任务: (1)建立相关的数据结构,作业控制块、已分配分区及未分配分区 (2)实现一个分区分配算法,如最先适应分配算法、最优或最坏适应分配算法 (3)实现一个分区回收算法 (4)给定一批作业/进程,选择一个分配或回收算法,实现分区存储的模拟管理 实验前应复习实验中所涉及的理论知识和算法,针对实验要求完成基本代码编写并完成预习报告、实验中认真调试所编代码并进行必要的测试、记录并分析实验结果。实验后认真书写符合规格式的实验报告(参见附录A),并要求用正规的实验报告纸和封面装订整齐,按时上交。 五.主要算法分析 各个算法分析 1.先来先服务算法(FCFS) 先来先服务(FCFS)调度:按先来后到次序服务,未作优化。 最简单的移臂调度算法是“先来先服务”调度算法,这个算法实际上不考虑访问者要求访问的物理位置,而只是考虑访问者提出访问请求的先后次序。例如,如果现在读写磁头正在50号柱面上执行输出操作,而等待访问者依次要访问的柱面为130、199、32、159、15、148、61、99,那么,当50号柱面上的操作结束后,移动臂将按请求的先后次序先移到130号柱面,最后到达99号柱面。 采用先来先服务算法决定等待访问者执行输入输出操作的次序时,移动臂来回地移动。先来先服务算法花费的寻找时间较长,所以执行输入输出操作的总时间也很长。 2.最短寻道时间优先算法(SSTF) 最短寻找时间优先调度算法总是从等待访问者中挑选寻找时间最短的那个请求先执行的,而不管访问者到来的先后次序。现在仍利用同一个例子来讨论,现在当50号柱面的操作结束后,应该先处理61号柱面的请求,然后到达32号柱面执行操作,随后处理15号柱面请求,后继操作的次序应该是99、130、148、159、199。 采用最短寻找时间优先算法决定等待访问者执行操作的次序时,读写磁头总共移动了200多个柱面的距离,与先来先服务、算法比较,大幅度地减少了寻找时间,因而缩短了为各访问者请求服务的平均时间,也就提高了系统效率。 但最短查找时间优先(SSTF)调度,FCFS会引起读写头在盘面上的大围移动,SSTF查找距离磁头最短(也就是查找时间最短)的请求作为下一次服务的对象。SSTF查找模式有高度局部化的倾向,会推迟一些请求的服务,甚至引起无限拖延(又称饥饿)。 3.扫描算法(SCAN) SCAN 算法又称电梯调度算法。SCAN算法是磁头前进方向上的最短查找时间优先算法,它排除了磁头在盘面局部位置上的往复移动,SCAN算法在很大程度上消除了SSTF算法的不公平性,但仍有利于对中间磁道的请求。 “电梯调度”算法是从移动臂当前位置开始沿着臂的移动方向去选择离当前移动臂最近的那个柱访问者,如果沿臂的移动方向无请求访问时,就改变臂的移动方向再选择。这好比乘电梯,如果电梯已向上运动到4层时,依次有3位乘客生、伍生、生在等候乘电梯。他们的要:生在2层等待去10层;伍生在5层等待去底层;生在8层等待15层。由于电梯目前运动方向是向上,所以电梯的形成是先把乘客生从8层带到15层,然后电梯换成下行

相关文档
最新文档