OS实验批处理系统的作业调度
操作系统短作业优先调度算法1

操作系统短作业优先调度算法1操作系统实验题⽬:实现⾮抢占式短作业优先调度算法要求:1.系统共有100个随机到达的作业。
要求为每个作业设定到达时间和需要运⾏的时间。
2.按照短作业优先进⾏调度,直到所有作业完成。
3.计算每个作业的周转时间,计算平均周转时间。
提交报告1.实验报告打印稿(参照学校有关报告格式)。
2.刻录⼀张光盘。
光盘内容:⽤学号+姓名为每个同学建⽴⽬录,⽂件包括报告的电⼦版,程序源代码。
⼀、主要数据结构及其说明算法的基本概念和原理:本次课程设计主要是采⽤短作业优先算法进程的进程调度过程。
短作业优先调度算法,是指对短作业或短进程优先调度的算法。
他们可以分别⽤于作业调度和进程调度,短作业优先的调度算法是从后备队列中选择⼀个或若⼲个估计运⾏时间最短的作业,将他们调⼊内存运⾏。
⽽短进程优先调度算法则是从就绪队列中选出⼀个估计运⾏时间最短的进程,将处理机分配给他,使它⽴即执⾏并⼀直执⾏到完成,或发⽣某事件⽽被阻塞放弃处理机时再度重新调度。
本程序采⽤了⾮抢占式短作业优先调度。
⽽⾮抢占式这种⽅式,⼀旦把处理机分配给某进程后,便让该进程⼀直执⾏,直⾄该进程完成或发⽣某事件⽽被阻塞时,才再把处理机分配给其它进程,决不允许某进程抢占已经分配出去的处理机。
这种调度⽅式的优点是实现简单,系统开销⼩,适⽤于⼤多数的批处理系统环境。
但它难以满⾜紧急任务的要求——⽴即执⾏,因⽽可能造成难以预料的后果。
因此,在要求⽐较严格的实时系统中,不宜采⽤这种调度⽅式。
本课程设计主要是在满⾜要求多道单处理机的情况下进⾏短作业的优先调度。
算法的简要说明:短作业(进程)优先调度算法SJ(P)F,是指对短作业或短进程优先调度的算法。
它们可以分别⽤于作业调度和进程调度。
短作业优先(SJF)的调度算法是从后备队列中选择⼀个或若⼲个估计运⾏时间最短的作业,将它们调⼊内存运⾏。
⽽短进程(SPF)调度算法则是从就绪队列中选出⼀个估计运⾏时间最短的进程,将处理机分配给它,使它⽴即执⾏并⼀直执⾏到完成,或发⽣某事件⽽被阻塞放弃处理机再重新调度。
作业调度实验报告

一、根据调度算法设计流程图:实验
步骤
}
}
}
三、整合完成所有程序并实现作业调度(见源代码)。
四、进行调试阶段,对程序修改优化,进行数据测试。
五、实验结果分析
六、总结
实验
WindowsXP和CV++6.0集成开发环境
环境
实验运行的初始界面:
实验结
果与分
析
测试数据:
a1 1 2 a1
a2 2 3 a2
运行结果:
进行多次循环录入:返回算法选择界面:
测试数据:
b1 2 4 b1
b2 1 3 b2
运行结果:
实验分析和总结:
1)测试的数据必须是符合JCB模块中相同类型的,如在源码中式int类型的,而在测试的时候输入float类型就出错。
2)各个库函数的运用需要掌握相应的功能,否则会照成代码冗余、繁杂、不优化等各种问题。
3)通常在dos下运用的都是英文,而想要用汉字提示就必须考虑一些问题。
在源码中我们用制表符(\t)来控制提示,输出的数字是不能与之对齐的,所以我们要将“\t”改成空格。
4)这编写和调试程序时,为了尽快调通程序应该按照流程图的结构(保证流程图思路是对的情况下)来建立编程思路。
5)此程序也借用了现有的一些代码,并且它还不是最优化的,它还可以进行改进和优化,比如:在回调函数的引用时跳到了另一个页面,见下图:
继续Enter的时候就到下一页:
而不是在同一页面。
6)总之,在编程旅途中是一个很艰辛的过程,要在这里开拓一片蓝天就必须有孜孜不倦的精神。
操作系统——作业调度

操作系统——作业调度实验⼆作业调度模拟程序⼀、⽬的和要求 1. 实验⽬的 (1)加深对作业调度算法的理解; (2)进⾏程序设计的训练。
2.实验要求 ⽤⾼级语⾔编写⼀个或多个作业调度的模拟程序。
单道批处理系统的作业调度程序。
作业⼀投⼊运⾏,它就占有计算机的⼀切资源直到作业完成为⽌,因此调度作业时不必考虑它所需要的资源是否得到满⾜,它所运⾏的时间等因素。
作业调度算法: 1) 采⽤先来先服务(FCFS)调度算法,即按作业到达的先后次序进⾏调度。
总是⾸先调度在系统中等待时间最长的作业。
2) 短作业优先 (SJF) 调度算法,优先调度要求运⾏时间最短的作业。
3) 响应⽐⾼者优先(HRRN)调度算法,为每个作业设置⼀个优先权(响应⽐),调度之前先计算各作业的优先权,优先数⾼者优先调度。
RP (响应⽐)=作业周转时间 / 作业运⾏时间=1+作业等待时间/作业运⾏时间每个作业由⼀个作业控制块JCB表⽰,JCB可以包含以下信息:作业名、提交(到达)时间、所需的运⾏时间、所需的资源、作业状态、链指针等等。
作业的状态可以是等待W(Wait)、运⾏R(Run)和完成F(Finish)三种之⼀。
每个作业的最初状态都是等待W。
⼀、模拟数据的⽣成 1.允许⽤户指定作业的个数(2-24),默认值为5。
2. 允许⽤户选择输⼊每个作业的到达时间和所需运⾏时间。
3.(**)从⽂件中读⼊以上数据。
4.(**)也允许⽤户选择通过伪随机数指定每个作业的到达时间(0-30)和所需运⾏时间(1-8)。
⼆、模拟程序的功能 1.按照模拟数据的到达时间和所需运⾏时间,执⾏FCFS, SJF和HRRN调度算法,程序计算各作业的开始执⾏时间,各作业的完成时间,周转时间和带权周转时间(周转系数)。
2. 动态演⽰每调度⼀次,更新现在系统时刻,处于运⾏状态和等待各作业的相应信息(作业名、到达时间、所需的运⾏时间等)对于HRRN算法,能在每次调度时显⽰各作业的响应⽐R情况。
操作系统原理实验教学大纲(本科)-2013

《操作系统原理》实验教学大纲一、实验教学内容与基本要求实验一 批处理系统的作业调度1 目的要求1.加深对作业概念的理解;2.深入了解批处理系统如何组织作业、管理作业和调度作业。
2 实验内容编写程序完成批处理系统中的作业调度,要求采用响应比高者优先的作业调度算法。
实验具体包括:首先确定作业控制块的内容,作业控制块的组成方式;然后完成作业调度;最后编写主函数对所做工作进行测试。
3 所需实验设施设备PC、windows操作系统4 教学形式及过程演示、学生独立完成实验二 进程管理1 目的要求1.加深对进程概念的理解,明确进程和程序的区别。
2.深入了解系统如何组织进程、创建进程。
3.进一步认识如何实现处理器调度。
2 实验内容编写程序完成单处理机系统中的进程调度,要求采用时间片轮转调度算法。
实验具体包括:首先确定进程控制块的内容,进程控制块的组成方式;然后完成进程创建原语和进程调度原语;最后编写主函数对所做工作进行测试。
3 所需实验设施设备PC、windows操作系统4 教学形式及过程演示、学生独立完成实验三 动态分区存储管理方式的主存分配回收1 目的要求深入了解动态分区存储管理方式主存分配回收的实现。
2 实验内容编写程序完成动态分区存储管理方式的主存分配回收的实现。
实验具体包括:首先确定主存空间分配表;然后采用最优适应算法完成主存空间的分配和回收;最后编写主函数对所做工作进行测试。
3 所需实验设施设备PC、windows操作系统4 教学形式及过程演示、学生独立完成实验四 页式虚拟存储管理中地址转换和缺页中断1 目的要求1.深入了解页式存储管理如何实现地址转换;2.进一步认识页式虚拟存储管理中如何处理缺页中断。
2 实验内容编写程序完成页式存储管理中地址转换过程和模拟缺页中断的处理。
实验具体包括:首先对给定的地址进行地址转换工作,若发生缺页则先进行缺页中断处理,然后再进行地址转换;最后编写主函数对所做工作进行测试。
os4-计算机操作系统原理分析(第三版)-丁善镜-清华大学出版社

进程调度方式实现进程之间的轮流交替的一个方面。
4.进程调度算法 ➢ 先来先服务算法(FCFS) ➢ 时间片轮转算法(RR)
RR算法需要设计一个定时器,定时器的值为0时将产生一个中断。系统 用分配给进程的时间片设置定时器的初值,之后进程开始执行。进程运 行过程有三种可能情况:
同时到达。已知它们都是纯计算性的简单任务,运行时需要占用处理器时间分别 是10、3、2和5。把到达时间(提交时间)设为0。
TA=10,TB=13,TC=15,TA=20,TB=3,TC=5,
TD=20;
TD=10;
T=( TA+ TB+ TC+ TD)/4 T=( TA+ TB+ TC+TD)/4
• 一个作业的响应比R是
作业等待时间 作业大小
其中,作业等待时间 = 系统当前时间 - 作业提交时刻
• HRN思想 • HRN特点
• 综合了先来先服务算法(FCFS)和短作业优先算法(SJF) • 响应比R与作业的大小成反比,体现SJF算法 • 响应比R与作业的等待时间成正比,体现FCFS算法
4.作业调度算法例子
例4-3:假定某分时系统有3个同时依次到达的进程A、B和C,它们的任务如下:
进程A: 2ms CPU 10ms I/O 2ms CPU
进程B: 9ms CPU 5ms I/O 2ms CPU
进程C: 8ms CPU
在采用简单RR算法,时间片为3ms时,请画出RR算法的调度图。
➢ 响应时间
简单RR算法,假设就绪队列中的进程数为n,时间片为T,那么,响 应时间R,则
9:00
0.8
计算机操作系统部分习题解答

1.高级调度与低级调度的主要任务是什么?为什么要引入中级调度?答:高级调度主要任务是根据某种算法,把外存上处于后备队列中的那些作业调入内存,也就是说高级调度的调度对象是作业。
低级调度主要任务是:决定就绪队列中的哪个进程应获得处理机,.然后再由分派程序执行把处理机分配给该进程的具体操作。
中级调度的任务:使那些暂时不能运行的进程不再占用宝贵的内存资源,而将它们调至外存上去等待,把此时的进程状态称为就绪驻外存状态或挂起状态。
当这些进程重又具备运行条件且内存又稍有空闲时,由中级调度来决定把外存上的那些又具备运行条件的就绪进程重新调入内存,并修改其状态为就绪状态,挂在就绪队列上等待进程调度。
引入中级调度的主要目的是为了提高内存利用率和系统吞吐量。
2.处理机调度算法的共同目标是什么?批处理系统的调度目标又是什么?答:共同目标:资源利用率,公平性,平衡性,策略强制执行。
批处理系统的调度目标:平均周转时间短,系统吞吐量高,处理机利用率高。
3.在批处理系统、分时系统和实时系统中,各采用哪几种进程(作业)调度算法?答:批处理系统的调度算法:短作业优先、优先权、高响应比优先、多级反馈队列调度算法。
分时系统的调度算法:时间片轮转法。
实时系统的调度算法:最早截止时间优先即EDF、最低松弛度优先即LLF算法。
4.何谓“优先级倒置”现象,可采取什么方法来解决?答:当前0S广泛采用优先级调度算法和抢占方式,然而在系统中存在着影响进程运行的资源而可能产生“优先级倒置”的现象,即高优先级进程(或线程)被低优先级进程(或线程)延迟或阻塞。
5.何谓"死锁"?产生死锁的原因和必要条件是什么?答:死锁:是指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。
产生死锁的原因:(1)竞争资源。
(2)进程间推进顺序非法。
产生死锁的必要条件:(1)互斥条件;(2)请求和保持条件;(3)不剥夺条件;(4)环路等待条件。
操作系统OS课后习题答案(汤小丹著第三版)前五章
操作系统OS课后习题答案(汤小丹著第三版)前五章操作系统引论1. 设计现代OS 的主要目标是什么?方便性,有效性,可扩充性和开放性.2. OS 的作用可表现为哪几个方面?a. OS 作为用户与计算机硬件系统之间的接口;b. OS 作为计算机系统资源的管理者;c. OS 作为扩充机器.3.为什么说OS实现了计算机资源的抽象?P3-4(略)4. 试说明推动多道批处理系统形成和发展的主要动力是什么?不断提高计算机资源利用率和系统吞吐量的需要;5. 何谓脱机I/O 和联机I/O?a. 脱机输入输出方式(Off-Line I/O)是为了解决人机矛盾及CPU 和I/O 设备之间速度不匹配而提出的.它减少了CPU 的空闲等待时间,提高了I/O 速度.具体内容是将用户程序和数据在一台外围机的控制下,预先从低速输入设备输入到磁带上,当CPU 需要这些程序和数据时,在直接从磁带机高速输入到内存,从而大大加快了程序的输入过程,减少了CPU等待输入的时间,这就是脱机输入技术;当程序运行完毕或告一段落,CPU 需要输出时,无需直接把计算结果送至低速输出设备,而是高速把结果输出到磁带上,然后在外围机的控制下,把磁带上的计算结果由相应的输出设备输出,这就是脱机输出技术。
b. 若这种输入输出操作在主机控制下进行则称之为联机输入输出方式.6. 试说明推动分时系统形成和发展的主要动力是什么?用户的需要.即对用户来说,更好的满足了人-机交互,共享主机以及便于用户上机的需求.7. 实现分时系统的关键问题是什么?应如何解决?a. 关键问题:及时接收,及时处理;b. 对于及时接收,只需在系统中设置一多路卡,多路卡作用是使主机能同时接收用户从各个终端上输入的数据;对于及时处理,应使所有的用户作业都直接进入内存,在不长的时间内,能使每个作业都运行一次.清华大学出版社,计算机操作系统课后习题解答8. 为什么要引入实时操作系统?更好地满足实时控制领域和实时信息处理领域的需要.9.什么是硬实时任务和软实时任务?试举例说明。
单道批处理系统作业调度
单道批处理系统作业调度单道批处理系统作业调度是指在单道批处理系统中,根据作业的特性和系统资源的情况,合理地安排作业的执行顺序和分配系统资源的过程。
它是操作系统中的一个重要组成部份,对于提高系统的效率和资源利用率至关重要。
一、作业调度的原则1. 公平性原则:保证每一个作业都有机会获得系统资源,避免某些作业长期占用资源而导致其他作业等待过久。
2. 高效性原则:尽量减少作业的等待时间,提高系统的吞吐量和响应速度。
3. 紧急性原则:优先处理紧急的作业,确保系统的稳定运行。
4. 先来先服务原则:按照作业提交的先后顺序进行调度,保证公平性和公正性。
二、作业调度的算法1. 先来先服务(FCFS)算法:按照作业提交的先后顺序进行调度,先提交的作业先执行。
适合于作业的执行时间相对较短且相对稳定的情况。
2. 短作业优先(SJF)算法:根据作业的执行时间预测,选择执行时间最短的作业优先执行。
适合于作业的执行时间差异较大的情况。
3. 优先级调度算法:为每一个作业分配一个优先级,根据优先级高低进行调度。
适合于需要根据作业的重要性和紧急程度进行调度的情况。
4. 时间片轮转(RR)算法:将系统的执行时间划分为多个时间片,每一个作业在一个时间片内执行一定的时间,然后切换到下一个作业。
适合于多个作业之间的执行时间相对均衡的情况。
三、作业调度的流程1. 作业提交:用户将作业提交到系统中,包括作业的名称、优先级、执行时间等信息。
2. 作业入队:将提交的作业加入到作业队列中,按照先来先服务或者其他调度算法进行排序。
3. 作业调度:根据调度算法选择下一个执行的作业,并将其从作业队列中取出。
4. 资源分配:根据作业的资源需求,分配相应的系统资源给作业,如CPU、内存等。
5. 作业执行:作业开始执行,占用系统资源进行计算、IO操作等。
6. 作业完成:作业执行完毕后,释放占用的系统资源,并将结果返回给用户。
7. 下一个作业:根据调度算法选择下一个执行的作业,重复步骤3-6,直到所有作业执行完毕。
作业调度实验报告
作业调度实验报告作业调度算法实验。
二、实验目标已知n个作业的进入时间和估计运行时间(以分钟计)(1)单道环境下,分别用先来先服务调度算法、短作业优先调度算法、响应比高者优先调度算法,求出批作业的平均周转时间和带权平均周转时间;在多道环境(如2道)下,求出这些作业的平均周转时间和带权平均周转时间(2)就同一批次作业,分别讨论这些算法的优劣;(3)衡量同一调度算法对不同作业流的性能。
三、实验环境要求1.PC机。
2.Windows环境。
3.CodeBlocks四、实验基本原理(1)先来先服务算法:按照作业提交给系统的先后顺序来挑选作业,先提交的先被挑选。
(2)最短作业优先算法:是以进入系统的作业所提出的“执行时间”为标准,总是优先选取执行时间最短的作业。
( 3)响应比高者优先算法:是在每次调度前都要计算所有被选作业(在后备队列中)的响应比,然后选择响应比最高的作业执行。
(4)两道批处理系统中最短作业优先调度算法:内存中可以进入两个作业,这两个作业按照最短作业优先调度算法调整作业执行的次序。
五、数据结构设计使用一维数组来保存多个作业Job job[20];,采用的是顺序存储。
使用queue<Jcb *> q保存调度队列里的作业指针。
struct Date//时间结构体{int hour;//时间的小时int minute;//时间的分钟};struct Jcb//作业结构体,用来描述作业{int no;//作业编号Date enter;//进入时间int operation;//估计运行时间Date start;//开始时间Date over;//结束时间int turnover;//周转时间double weighted;//带权周转时间int state=0;//标记改作业是否进入运行状态};六、流程图单道环境下算法流程图多道环境下的两道批处理系统中最短作业优先作业调度算法的流程图。
七、源代码#include<iostream> #include<stdio.h>#include<cstring>#include<algorithm> #include<queue> using namespace std;struct Date//时间结构体{int hour;//时间的小时int minute;//时间的分钟};struct Jcb//作业结构体,用来描述作业{int no;//作业编号Date enter;//进入时间int operation;//估计运行时间Date start;//开始时间Date over;//结束时间int turnover;//周转时间double weighted;//带权周转时间int state=0;//标记改作业是否进入运行状态};//函数声明void display(Jcb J[],int n);//输出void runing( queue<Jcb *> q,int n);//根据算法将就绪队列排好队后的单道作业的运行主体void fcfs( Jcb J[],int n);//先来先服务作业调度void sfc(Jcb J[],int n);//最短作业优先作业调度void hrfc(Jcb J[],int n);//最高响应比作业调度void text(void (*dispatch)(Jcb J[], int n),Jcb J[],int n,Jcb J1[],int n1, Jcb J2[],int n2);//测试单道环境,不同批次作业,相同算法void mulfc(Jcb J[],int n);//两道环境,内存中可以用两个作业,内存中的这两个作业按照作业长短调整作业执行的次序。
操作系统第3章 处理机调度(调度)
3.2 调度算法
进程调度的核心问题就是采用什么样的算法将处 理机分配给进程,常用的进程调度算法有:
先来先服务调度算法
短作业/进程优先调度算法
优先权调度算法
高响应比优先调度算法
时间片轮转调度算法
多级队列调度算法
多级反馈队列调度算法
返回目录
一、先来先服务调度算法FCFS
基本思想:按照进程进入就绪队列的 先后次序来分配处理机。
抢占(剥夺)方式
非抢占方式
一旦把处理机分配给某进程后,便让该进程 一直执行,直到该进程完成或因某事件而被 阻塞,才再把处理机分配给其它进程,不允 许进程抢占已分配出去的处理机。
特点:实现简单,系统开销小,常用于批处 理系统;但不利于处理紧急任务,故实时、 分时系统不宜采用。
抢占方式
允许调度程序根据某种原则(时间片、优 先权、短进程优先),停止正在执行的进 程,而将处理机重新分配给另一进程。
调度算法(太长---FCFS); 上下文切换(太短---上下文切换频繁); 平均周转时间。
短时间片增加上下文切换频率
周转时间随时间片变化
三、时间片轮转调度算法—例(1)
EG: 进程 到达时间
P1
0
P2
2
P3
4
P4
5
RR(时间片为1)
服务时间
7 4 1 4
P1 P2 P1 P2 P3 P1 P4 P2 P1 P4 P2 P1 P4 P1 P4
FCFS SPF-非 SPF-抢
周转T 124.25 100
75.75
等待T 74.25 49.5
25.25
二、SJF/SPF ——抢占式
到达顺序: 进程名 到达时间 服务时间
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告实验题目:_____ 批处理系统的作业调度___________________ _ 实验概述:【实验目的及要求】一、实验目的1.加深对作业概念的理解。
2.深入了解批处理系统如何组织作业、管理作业和调度作业。
二、实验内容编写程序完成批处理系统中的作业调度,要求采用响应比高者优先的作业调度算法。
实验具体包括:首先确定作业控制块的内容,作业控制块的组成方式;然后完成作业调度;最后编写主函数对所做工作进行测试。
【实验原理】操作系统根据允许并行工作的道数和一定的算法从系统中选取若干作业把它们装入主存储器,使它们有机会获得处理器运行,这项工作被称为”作业调度”。
实现这部分功能的程序就是”作业调度程序”。
作业调度的实现主要有两个问题,一个是如何将系统中的作业组织起来;另一个是如何进行作业调度。
为了将系统中的作业组织起来,需要为每个进入系统的作业建立档案以记录和作业相关的信息,例如作业名、作业所需资源、作业执行时间、作业进入系统的时间、作业信息在存储器中的位置、指向下一个作业控制块的指针等信息。
这个记录作业相关信息的数据块称为作业控制块(jcb),并将系统中等待作业调度的作业控制块组织成一个队列,这个队列称为后备队列。
一个作业全部信息进入系统后,就为其建立作业控制块,并挂入后备队列。
当进行作业调度时,从后备队列中查找选择作业。
由于实验中没有实际作业,作业控制块中的信息内容只使用了实验中需要的数据。
作业控制块中首先应该包括作业名;其次是作业所需资源,根据需要,实验中只包括需要主存的大小(采用可移动的动态分区方式管理主存,作业大小就是需要主存的大小)、需要打印机的数量和需要磁带机的数量;采用响应比作业调度算法,为了计算响应比,还需要有作业的估计执行时间、作业在系统中的等待时间;另外,指向下一个作业控制块的指针必不可少。
【实验环境】(使用的软件)Microsoft Visual C++ 6.0实验内容:【实验方案设计】将作业控制块组织成一个队列,实验中采用静态链表的方式模拟作业的后备队列,如图图l 采用响应比高者优先算法的作业调度程序流程图确定作业组织方式之后,就要开始考虑如何进行作业调度。
尽管不同的计算机系统可以采用不同的调度原则和调度算法,但是都必须遵循一个必要条件,即系统现有的尚未分配的资源可以满足被选作业的资源要求。
就是说,所有的作业调度都是按照一定的算法,从满足必要条件的作业中选择一部分作业装入主存储器。
实验中,主存采用可移动的动态分区管理方法,即只要主存空闲区总和比作业大就可以满足作业对主存的需求:对打印机和磁带机这两种独占型设备采用静态分配法,即作业执行前必须获得所需资源,并且执行完才归还。
常用的作业调度算法有先来先服务算法、计算时间短的作业优先算法、响应比高者优先算法、优先数调度算法和均衡调度算法。
实验中采用响应比高者优先算法,响应比的定义为:响应比=作业的等待时间/作业估计执行时间采用响应比高者优先调度算法,进行调度时必须计算出系统中的所有满足必要条件作业的响应比;从中选择响应比最高的一个作业装入主存储器分配资源,由于是实验,所以就用将作业的作业控制块出队,并输出作业的作业名代替装入主存储器,同时修改系统的资源数量;用同样方法选择第二个、第三个……直到不再有满足必要条件的作业。
采用响应比高者优先算法的作业调度程序流程图如图l所示。
模拟程序中,首先要假设系统的资源情况,假设系统资源只有主存(memory)64MB(以KB为单位分配)、磁带机(tape)4台和打印机(printer)2台;然后,手工输入某个时刻系统中的各个作业情况,最后进行作业调度,并将结果输出。
【实验过程】(实验步骤、记录、数据、分析)#include "string.h"#define n 10 //假定系统中可容纳的作业数量为ntypedef struct jcb{char name[4]; //作业名int length; //作业长度,所需主存大小int printer; //作业执行所需打印机的数量int tape; //作业执行所需磁带机的数量int runtime; //作业估计执行时间int waittime; //作业在系统中的等待时间int next; //指向下一个作业控制块的指针}JCB; //作业控制块类型定义int head; //作业队列头指针定义int tape,printer;long memory;JCB jobtable[n]; //作业表int jobcount=0; //系统内现有作业数量void shedule()//作业调度函数{float xk,k;int p,q,s,t;do{p=head;q=s=-1;k=0;while(p!=-1){if(jobtable[p].length<=memory && jobtable[p].tape<=tape &&jobtable[p].printer<=printer){ //系统可用资源是否满足作业需求xk=(float)(jobtable[p].waittime)/jobtable[p].runtime;if(q==0||xk>k)//满足条件的第一个作业或者作业q的响应比小于作业P的响应比{k=xk; //记录响应比q=p;t=s;}//if}//ifs=p;p=jobtable[p].next; //指针P后移}//whileif(q!= -1){if(t= -1) //是作业队列的第一个head=jobtable[head].next;elsejobtable[t].next=jobtable[q].next;//为作业q分配资源:分配主存空间;分配磁带机j分配打印机 memory=memory-jobtable[q].length;tape=tape-jobtable[q].tape;printer=printer-jobtable[q].printer;printf("选中作业的作业名:%s \n",jobtable[q].name);}}while(q!=-1);} //作业调度函数结束//判断资源是否被占用int full(){int p,q;q=p=head;while(q!=-1){while(p!=-1){p=jobtable[p].next; //指针P后移if(jobtable[q].waittime==jobtable[p].waittime){if(jobtable[q].printer+jobtable[p].printer>2){printf("打印机数不足,无法再创建作业\n");return 0;}if(jobtable[q].tape+jobtable[p].tape>4){ printf("磁带机数不足,无法再创建作业\n");return 0;}}}q=jobtable[q].next; //指针P后移}return 1;}main(){char name[4];int size, tcount , pcount , wtime , rtime,j;int p;//系统数据初始化memory=65536;tape=4;printer=4;head=-1;printf("输入作业相关数据(以作业大小为-1停止输入):\n"); //输入数据,建立作业队列printf("输入作业数据");printf("作业名:");scanf("%s",name);printf("作业大小:");scanf("%d",&size);printf("磁带机数:");scanf("%d",&tcount);printf("打印机数:");scanf("%d",&pcount);printf("等待时间:");scanf("%d",&wtime);printf("估计运行时间:");scanf("%d",&rtime);while(size!=-1){//创建JCBif(jobcount<n && pcount<printer && tcount<tape && size<memory) p=jobcount;else{printf("无法再创建作业\n");break;}jobcount++;j=full();if(j!=0){//填写该作业相关内容strcpy(jobtable[p].name,name);jobtable[p].length=size;jobtable[p].printer=pcount;jobtable[p].tape=tcount;jobtable[p].runtime=rtime;jobtable[p].waittime=wtime;//挂入作业队列队首jobtable[p].next=head;head=p;//输入一个作业数据}printf("输入作业相关数据(以作业大小为-1停止输入):\n"); //输入数据,建立作业队列printf("输入作业数据");printf("作业名:");scanf("%s",name);、printf("作业大小:");scanf("%d",&size);printf("磁带机数:");scanf("%d",&tcount);printf("打印机数:");scanf("%d",&pcount); printf("等待时间:");scanf("%d",&wtime);printf("估计运行时间:");scanf("%d",&rtime);} //whileshedule(); //进行作业调度return 0;}//main()函数结束【结论】(结果)。