广东工业大学操作系统实验二——作业调度实验
- 格式:doc
- 大小:46.00 KB
- 文档页数:7
实验二作业调度一、实验题目:1、单道批处理系统的作业调度模拟程序。
2、编写采用先来先服务算法多道批处理系统的作业调度模拟程序。
二、实验目的:通过对单道批处理系统的作业调度和采用先来先服务算法多道批处理系统作业调度的模拟,进一步理解作业调度的过程,加深对单道和多道的作业运行状态和作业调度过程、调度算法的理解。
三、实验设备及环境:1、硬件设备:PC机一台2、软件环境:安装Windows操作系统或者Linux操作系统,并安装相关的程序开发环境,如C \C++\Java 等编程语言环境。
四、实验内容及要求:1、单道批处理系统作业调度(1)由于在单道批处理系统中,作业一旦投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所占用的CPU时限等因素。
(2)每个作业由一个作业控制块JCB表示,JCB可以包含如下信息:作业名name、作业大小size、所需的运行时间ntime、作业已运行时间rtime、所需的资源machine、作业状态state 等。
作业指针link,用来将JCB表排成队列。
作业的状态可以是等待W(Wait)、运行R(Run)和完成F(Finish)三种状态之一。
每个作业的最初状态总是等待W状态。
(3)对每种调度算法都要求显示每个作业开始运行时刻、完成时刻、周转时间、带权周转时间,以及这组作业的平均周转时间及带权平均周转时间。
2、采用先来先服务算法多道批处理系统的作业调度(1)采用多道程序设计方法的操作系统,在系统中要经常保留多个运行的作业,以提高系统效率。
作业调度从系统已接纳的暂存在输入井中的一批作业中挑选出若干个可运行的作业,并为这些被选中的作业分配所需的系统资源。
对被选中运行的作业必须按照它们各自的作业说明书规定的步骤进行控制。
(2)批处理作业调度程序负责从输入井中选择若干个作业进入主存,为它们分配必要的资源,当它们能够被进程调度选中时,就可占用处理器运行。
作业调度实验报告一、实验目的1.掌握作业调度的概念和基本原则;2.理解作业调度算法的原理和实现方式;3.熟悉作业调度过程中的各种参数和指标;4.进一步了解操作系统中的进程调度机制。
二、实验环境本次实验使用的操作系统环境为Windows平台。
三、实验内容1.实现一个简单的作业调度算法,根据作业的重要性和执行时间进行优先级排序;2.设计一个作业队列,模拟一系列作业的到达和执行过程;3.根据作业调度算法,将作业分配给CPU执行,并统计作业的等待时间、完成时间等指标;4.进行多次实验,比较不同调度算法之间的性能差异。
四、实验步骤1.首先,设计一个作业类,包括作业的名称、重要性、到达时间和执行时间等属性;2.定义一个作业队列,用于存储到达的作业,并按照到达时间进行排序;3.实现一个简单的作业调度算法,根据作业的重要性和执行时间进行优先级排序;4.设计一个CPU类,用于执行作业队列中的作业,并记录作业的等待时间、完成时间等指标;5.模拟一系列作业的到达和执行过程,将作业调度给CPU执行,并记录相关指标;6.分别使用不同的调度算法进行多次实验,比较各自的性能差异。
五、实验结果与分析通过多次实验,得到了不同调度算法下的作业等待时间、完成时间等指标,并进行了比较。
结果发现,在作业执行时间相同时,按照作业的重要性进行优先级排序的算法,能够使得较重要的作业尽早执行,因而整体的作业等待时间和完成时间较短。
而对于作业执行时间不一致的情况,采用短作业优先算法,可以使作业平均等待时间较短,但在一些较长的作业上可能会存在饥饿现象。
综合考虑作业的重要性和执行时间,采用带权重的优先级队列算法可以获得较好的调度效果。
六、实验总结通过本次实验,我深入了解了作业调度的概念、原理和实现方式。
通过对比不同调度算法的性能差异,对于实际的作业调度过程具有一定的指导意义。
此外,通过实验设计和代码实现,我也提高了编程和分析问题的能力。
总体而言,本次实验使我对操作系统中的作业调度有了更为深刻的理解,并提高了我的实践能力。
实验报告课程名称操作系统实验学生学院计算机学院专业班级计算机科学与技术学号学生姓名指导教师孙为军2015 年 12 月30日实验一进程调度一、实验目的编写并调试一个模拟的进程调度程序,以加深对进程的概念及进程调度算法的理解.二、实验内容1.采用“短进程优先”调度算法对五个进程进行调度。
每个进程有一个进程控制块( PCB)表示。
进程控制块可以包含如下信息:进程名、到达时间、需要运行时间、已用CPU时间、进程状态等等。
2.每个进程的状态可以是就绪 W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。
每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的 PCB,以便进行检查。
重复以上过程,直到所要进程都完成为止。
三、实现思路先考虑实现进程调度所需要的数据结构,然后根据所需要的算法进行设计。
四、主要的数据结构进程控制块PCB:struct pcb {char name[10];char state;int ntime;int rtime;struct pcb* link;}*ready=NULL,*p;五、算法流程图六、运行与测试输入进程信息:输入完毕,显示当前运行以及就绪的进程:优先运行短进程七、改进的方向界面比较难看,可以中文化信息。
实验二作业调度一、实验目的用高级语言编写和调试一个或多个作业调度的模拟程序,以加深对作业调度算法的理解。
二、实验内容1.写并调试一个单道处理系统的作业等待模拟程序。
2.作业等待算法:分别采用先来先服务(FCFS)、响应比高者优先(HRN)的调度算法。
3.由于在单道批处理系统中,作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所占用的 CPU时限等因素。
4.每个作业由一个作业控制块JCB表示,JCB可以包含如下信息:作业名、提交时间、所需的运行时间、所需的资源、作业状态、链指针等等。
操作系统实验报告——调度算法1. 实验目的本实验旨在探究操作系统中常用的调度算法,通过编写代码模拟不同的调度算法,了解它们的特点和应用场景。
2. 实验环境本次实验使用的操作系统环境为Linux,并采用C语言进行编码。
3. 实验内容3.1 调度算法1:先来先服务(FCFS)FCFS调度算法是一种简单且常见的调度算法。
该算法按照进程到达的先后顺序进行调度。
在本实验中,我们使用C语言编写代码模拟FCFS算法的调度过程,并记录每个进程的等待时间、周转时间和响应时间。
3.2 调度算法2:最短作业优先(SJF)SJF调度算法是一种非抢占式的调度算法,根据进程的执行时间来选择下一个要执行的进程。
在本实验中,我们使用C语言编写代码模拟SJF算法的调度过程,并计算每个进程的等待时间、周转时间和响应时间。
3.3 调度算法3:轮转调度(Round Robin)Round Robin调度算法是一种经典的时间片轮转算法,每个进程在给定的时间片内依次执行一定数量的时间。
如果进程的执行时间超过时间片,进程将被暂时挂起,等待下一次轮转。
在本实验中,我们使用C语言编写代码模拟Round Robin算法的调度过程,并计算每个进程的等待时间、周转时间和响应时间。
4. 实验结果分析通过对不同调度算法的模拟实验结果进行分析,可以得出以下结论:- FCFS算法适用于任务到达的先后顺序不重要的场景,但对于执行时间较长的进程可能会导致下一个进程需要等待较久。
- SJF算法适用于任务的执行时间差异较大的场景,能够提高整体执行效率。
- Round Robin算法适用于时间片相对较小的情况,能够公平地为每个进程提供执行时间。
5. 实验总结本次实验通过模拟不同调度算法的实际执行过程,深入了解了各种调度算法的原理、特点和适用场景。
通过对实验结果的分析,我们可以更好地选择合适的调度算法来满足实际应用的需求。
在后续的学习中,我们将进一步探索更多操作系统相关的实验和算法。
石家庄经济学院实习报告(学院)系: 信息工程学院专业: 计算机科学与技术**: **班级: 专接本2班学号: ****************: ***2012年6 月22 日操作系统课程实习报告学号:511109030201姓名:江丹起迄日期:2012/6/11~2012/6/16指导教师:张有华实习地点:206室实习题目:采用先来先服务算法和运行时间最短者优先算法模拟设计作业调度程序。
1 实习内容模拟批处理多道操作系统的作业调度2 实习目的每个用户请求计算机计算的一个计算任务叫做一个作业。
一个作业从输入初始数据到得到计算结果,要经过若干个步骤的相继执行。
例如,编辑、编译、运行等,其中每一个步骤称作一个作业步。
用户向系统提出作业加工步骤的方式称作业控制方式,作业控制方式有两种:终端控制方式(又称直接控制方式或联机控制方式)和批处理控制方式(又称自动控制方式或脱机控制方式)。
在批处理控制方式下,用户采用系统提供的作业控制语言(JCL)写好作业说明书,说明作业加工的步骤。
操作员把一批作业组织成输入流,通过“预输入”手段使每个作业的信息(包括作业说明书、源程序、初始数据等)暂存在辅助存储器的“输入井”中。
批处理多道操作系统的作业管理有两个任务:作业调度和作业控制。
采用多道程序设计方法的操作系统,在系统中要经常保留多个运行的作业,以提高系统效率。
作业调度从系统已接纳的暂存在输入井中的一批作业中挑选出若干个可运行的作业,并为这些被选中的作业分配所需的系统资源。
对被选中运行的作业必须按照它们各自的作业说明书规定的步骤进行控制。
本实习要求学生模拟作业调度的实现,了解作业调度在操作系统中的作用。
3 实习步骤第一步:首先对整个题目进行分析,包括对作业、主存的定义类型。
第二步:对流程图进行分析,分析一些细节代码。
第三步:根据程序流程图写代码并调节一些细节错误。
第四步:运行看结果,这里主要看内存根据作业的要求对分配情况。
操作系统实验报告-批处理系统的作业调度----241093e8-715f-11ec-b76a-7cb59b590d7d实验一批处理系统的作业调度(1)加深对家庭作业概念的理解。
(2)深入了解批处理系统如何组织作业、管理作业和调度作业。
编写一个程序来完成批处理系统的作业调度,其中需要响应比优先的调度算法。
最高响应比优先法(hrrn)是对fcfs方式和sjf方式的一种综合平衡。
hrrn调度策略同时考虑每个作业的等待时间长短和估计需要的执行时间长短,从中选出响应比最高的作业投入执行。
响应比R的定义如下:R=(W+T)/T=1+W/T其中t为该作业估计需要的执行时间,w为作业在后备状态队列中的等待时间。
无论何时需要作业调度,系统都会计算每个作业的响应率,并选择R最大的作业来执行。
这样,即使对于长时间的作业,w/T也会随着等待时间的增加而增加,并且有机会获得计划的执行。
该算法是FCFS和SJF之间的折衷。
由于长作业也有机会投入运行,同时处理的作业数量明显少于SJF方法,因此hrrn方法的吞吐量将低于SJF方法。
此外,由于在每次调度之前需要计算响应比,因此系统开销将相应增加。
四.实验部分源程序在实验中,作业控制块和队列的数据结构定义如下:structtask{stringname;/*工作编号*/intarrtime;/*作业到达时间*/intsertime;/*运行所需的服务时间*/intwaitime;/*等待时间*/intbegtime;/*开始运行时间*/intfintime;/*结束运行时间*/intturtime;/*周转时间*/intwtutime;/*带权周转时间*/intfinish;/*是否已经完成*/}jcb[10];存放作业控制块的区域:#定义10jcbjobtable[10];intjobcount;将作业控制块组织成一个队列,实验中采用静态链表的方式模拟作业的后备队列,作业队列头指针定义为:int*head;#包括#include#包括#include#包括#includetypedefcharstring[10];/*//将字符串定义为包含10个字符元素的字符数组类型*/structtask{stringname;/*工作编号*/intarrtime;/*作业到达时间*/intsertime;/*运行所需的服务时间*/intwaitime;/*等待时间*/intbegtime;/*开始运行时间*/intfintime;/*结束运行时间*/intturtime;/*周转时间*/intwtutime;/*带权周转时间*/intfinish;/*是否已经完成*/}jcb[10];intnum;voidinput()system("cls");Printf(“\n请输入作业数:”);scanf("%d",&num);对于(i=0;iprintf("\n请输入作业no.%d:\n",i);Printf(“工作名称:”);scanf("%s",jcb[i].name);Printf(“到达时间:”);scanf("%d",&jcb[i].arrtime);Printf(“服务时间:”);scanf("%d",&jcb[i].sertime);jcb[i]。
计算机学院计算机科学与技术专业07班姓名 ___ 学号—教师评定_____________________实验题目 __________________ 作业调度______________________一、实验目的本实验要求学生模拟作业调度的实现,用高级语言编写和调试一个或多个作业调度的模拟程序,了解作业调度在操作系统中的作用,以加深对作业调度算法的理解。
二、实验内容和要求1、为单道批处理系统设计一个作业调度程序(1) 、编写并调试一个单道处理系统的作业调度模拟程序。
(2) 、作业调度算法:分别采用先来先服务( FCFS),最短作业优先(SJF)的调度算法。
(3) 、由于在单道批处理系统中,作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所占用的CPU时限等因素。
(4) 、每个作业由一个作业控制块JCB表示,JCB可以包含如下信息:作业名、提交时间、所需的运行时间、所需的资源、作业状态、链指针等等。
作业的状态可以是等待W(Wait)、运行R(Run)和完成F(Finish)三种状态之一。
每个作业的最初状态总是等待W。
(5) 、对每种调度算法都要求打印每个作业开始运行时刻、完成时刻、周转时间、带权周转时间,以及这组作业的平均周转时间及带权平均周转时间,并比较各种算法的优缺点。
2、模拟批处理多道操作系统的作业调度(1)写并调试一个作业调度模拟程序。
(2)作业调度算法:分别采用先来服务( FCFS)调度算法。
(3 )在批处理系统中,要假定系统中具有的各种资源及数量、调度作业时必须考虑到每个作业的资源要求,所需要的资源是否得到满足。
作业调度程序负责从输入井选择若干个作业进入主存,为它们分配必要的资源,当它们能够被进程调度选中时,就可占用处理机运行。
作业调度选择一个作业的必要条件是系统中现有的尚未分配的资源可满足该作业的资源要求。
但有时系统中现有的尚未分配的资源既可满足某个作业的要求也可满足其它一些作业要求,那么,作业调度必须按一定的算法在这些作业中作出选择。
实验二、作业调度实验实验项目名称:作业调度实验实验项目性质:验证性实验所属课程名称:《操作系统》实验计划学时:2学时一、实验目的本实验要求学生模拟作业调度的实现,用高级语言编写和调试一个或多个作业调度的模拟程序,了解作业调度在操作系统中的作用,以加深对作业调度算法的理解。
二、实验内容和要求为单道批处理系统设计一个作业调度程序(1)、编写并调试一个单道处理系统的作业调度模拟程序。
(2)、作业调度算法:分别采用先来先服务(FCFS),最短作业优先(SJF)、响应比高者优先(HRN)的调度算法。
(3)、由于在单道批处理系统中,作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所占用的CPU时限等因素。
(4)、每个作业由一个作业控制块JCB表示,JCB可以包含如下信息:作业名、提交时间、所需的运行时间、所需的资源、作业状态、链指针等等。
作业的状态可以是等待W(Wait)、运行R(Run)和完成F(Finish)三种状态之一。
每个作业的最初状态总是等待W。
(5)、对每种调度算法都要求打印每个作业开始运行时刻、完成时刻、周转时间、带权周转时间,以及这组作业的平均周转时间及带权平均周转时间,并比较各种算法的优缺点。
三、实验设计方案及原理假设在单道批处理环境下有四个作业JOB1、JOB2、JOB3、JOB4,已知它们进入系统的时间、估计运行时间。
分别采用先来先服务(FCFS),最短作业优先(SJF)、响应比高者优先(HRN)的调度算法,计算出作业的平均周转时间和带权的平均周转时间。
作业i 的周转时间:Ti=Tci-Tpi作业的平均周转时间:T=作业i的带权周转时间:Wi=Ti/Tri作业的平均带权周转时间:W=先来先服务调度算法(FCFS):每次调度都是从后备作业队列中,选择一个或多个最先进入该队列的作业,将它们调入内存,为它们分配资源、创建进程,然后放入就绪队列。
在进程调度中采用FCFS算法时,这每次调度是从就绪队列中,选择一个最先进入该队列的进程,为之分配处理机,使之投入运行。
该进程一直运行到完成或发生某事件阻赛后,才放弃处理机。
最短作业优先(SJF):每次从后备队列中选择一个或若干个估计运行时间最短的作业,将它们调入内存运行。
响应比高者优先(HRN):每次从后备队列中选择一个或若干个估计响应比最高的作业,将它们调入内存运行。
响应比Rp=作业响应时间/运行时间=作业等待时间+作业运行时间=1+作业等待时间/作业运行时间对每种调度算法都要求打印每个作业开始运行时刻、完成时刻、周转时间、带权周转时间,以及这组作业的平均周转时间及带权平均周转时间,并比较各种算法的优缺点。
附件:#include "stdio.h"#include <stdlib.h>#include <conio.h>#define getpch(type) (type*)malloc(sizeof(type))#define NULL 0struct worktime{float Tb; //作业运行时刻float Tc; //作业完成时刻float Ti; //周转时间float Wi; //带权周转时间};struct jcb { /*定义作业控制块JCB */char name[10]; //作业名float subtime; //作业提交时间float runtime; //作业所需的运行时间char resource; //所需资源float Rp; //后备作业响应比char state; //作业状态struct worktime wt;struct jcb* link; //链指针}*jcb_ready=NULL,*j;typedef struct jcb JCB;float T=0;void sort() /* 建立对作业进行提交时间排列函数*/{JCB *first, *second;int insert=0;if((jcb_ready==NULL)||((j->subtime)<(jcb_ready->subtime))) /*作业提交时间最短的,插入队首*/{j->link=jcb_ready;jcb_ready=j;T=j->subtime;j->Rp=1;}else /* 作业比较提交时间,插入适当的位置中*/{first=jcb_ready;second=first->link;while(second!=NULL){if((j->subtime)<(second->subtime)) /*若插入作业比当前作业提交时间短,*/{ /*插入到当前作业前面*/j->link=second;first->link=j;second=NULL;insert=1;}else /* 插入作业优先数最低,则插入到队尾*/{first=first->link;second=second->link;}}if (insert==0) first->link=j;}}void SJFget()/* 获取队列中的最短作业*/{JCB *front,*mintime,*rear;int ipmove=0;mintime=jcb_ready;rear=mintime->link;while(rear!=NULL)if ((rear!=NULL)&&(T>=rear->subtime)&&(mintime->runtime)>(rear->runtime)){front=mintime;mintime=rear;rear=rear->link;ipmove=1;}elserear=rear->link;if (ipmove==1){front->link=mintime->link;mintime->link=jcb_ready;}jcb_ready=mintime;}void HRNget()/* 获取队列中的最高响应作业*/{JCB *front,*mintime,*rear;int ipmove=0;mintime=jcb_ready;rear=mintime->link;while(rear!=NULL)if ((rear!=NULL)&&(T>=rear->subtime)&&(mintime->Rp)<(rear->Rp)){front=mintime;mintime=rear;rear=rear->link;ipmove=1;}elserear=rear->link;if (ipmove==1){front->link=mintime->link;mintime->link=jcb_ready;}jcb_ready=mintime;}void input() /* 建立作业控制块函数*/{int i,num;printf("\n 请输入作业数:?");scanf("%d",&num);for(i=0;i<num;i++){printf("\n 作业号No.%d:\n",i);j=getpch(JCB);printf("\n 输入作业名:");scanf("%s",j->name);printf("\n 输入作业提交时刻:");scanf("%f",&j->subtime);printf("\n 输入作业运行时间:");scanf("%f",&j->runtime);printf("\n");j->state='w';j->link=NULL;sort(); /* 调用sort函数*/}}int space(){int l=0; JCB* jr=jcb_ready;while(jr!=NULL){l++;jr=jr->link;}return(l);}void disp(JCB* jr,int select) /*建立作业显示函数,用于显示当前作业*/{if (select==3) printf("\n 作业服务时间响应比运行时刻完成时刻周转时间带权周转时间\n");else printf("\n 作业服务时间运行时刻完成时刻周转时间带权周转时间\n");printf(" |%s\t",jr->name);printf(" |%.2f\t ",jr->runtime);if (select==3) printf(" |%.2f ",jr->Rp);if (j==jr){printf(" |%.2f\t",jr->wt.Tb);printf(" |%.2f ",jr->wt.Tc);printf(" |%.2f \t",jr->wt.Ti);printf(" |%.2f",jr->wt.Wi);}printf("\n");}int destroy() /*建立作业撤消函数(作业运行结束,撤消作业)*/{printf("\n 作业[%s] 已完成.\n",j->name);free(j);return(1);}void check(int select) /* 建立作业查看函数*/{JCB* jr;printf("\n **** 当前正在运行的作业是:%s",j->name); /*显示当前运行作业*/ disp(j,select);jr=jcb_ready;printf("\n ****当前就绪队列状态为:\n"); /*显示就绪队列状态*/while(jr!=NULL){jr->Rp=(T-jr->subtime)/jr->runtime;disp(jr,select);jr=jr->link;}destroy();}void running(JCB* jr) /* 建立作业就绪函数(作业运行时间到,置就绪状态*/{if (T>=jr->subtime) jr->wt.Tb=T; else jr->wt.Tb=jr->subtime;jr->wt.Tc=jr->wt.Tb+jr->runtime;jr->wt.Ti=jr->wt.Tc-jr->subtime;jr->wt.Wi=jr->wt.Ti/jr->runtime;T=jr->wt.Tc;}int main() /*主函数*/{int select=0,len,h=0;float sumTi=0,sumWi=0;input();len=space();printf("\n\t1.FCFS 2.SJF 3.HRN\n\n请选择作业调度算法:?");scanf("%d",&select);while((len!=0)&&(jcb_ready!=NULL)){h++;printf("\n 执行第%d个作业\n",h);j=jcb_ready;jcb_ready=j->link;j->link=NULL;j->state='R';running(j);sumTi+=j->wt.Ti;sumWi+=j->wt.Wi;check(select);if (select==2&&h<len-1) SJFget();if (select==3&&h<len-1) HRNget();printf("\n 按任一键继续......\n");getchar();getchar();}printf("\n\n 作业已经完成.\n");printf("\t 此组作业的平均周转时间:%.2f\n",sumTi/h);printf("\t 此组作业的带权平均周转时间:%.2f\n",sumWi/h);getchar();}。