题目要求

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

三、 实验要求
1、 编写并调试一个单道处理系统的作业等待模拟程序。
  作业等待算法:分别采用先来先服务(FCFS),最短作业优先(SJF)、响应比高者优先(HRN)的调度算法。
  对每种调度算法都要求打印每个作业开始运行时刻、完成时刻、周转时间、带权周转时间,以及这组作业的平均周转时间及带权平均周转时间,以比较各种算法的优缺点。
2、 编写并调度一个多道程序系统的作业调度模拟程序。
  作业调度算法:采用基于先来先服务的调度算法。可以参考课本中的方法进行设计。
  对于多道程序系统,要假定系统中具有的各种资源及数量、调度作业时必须考虑到每个作业的资源要求。
3、 编写并调试一个多道程序系统的作业调度模拟程序。
  作业调度算法:采用基于优先级的作业调度。
可以参考课本中的例子自行设计。

实验报告

1.实验目的

用高级语言编写和调试一个或多个作业调度的模拟程序,以加深对作业调度算法的理解。

2.实验内容与要求

①实验内容
为单道批处理系统设计一个作业调度程序。
由于在单道批处理系统中,作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所占用的 CPU时限等因素。

作业调度算法:采用先来先服务(FCFS)调度算法,即按作业提交的先后次序进行调度。总是首先调度在系统中等待时间最长的作业。每个作业由一个作业控制块JCB表示,JCB可以包含如下信息:作业名、提交时间、所需的运行时间、所需的资源、作业状态、链指针等等。
  
作业的状态可以是等待W(Wait)、运行R(Run)和完成F(Finish)三种状态之一。每个作业的最初状态总是等待W。各个等待的作业按照提交时刻的先后次序排队,总是首先调度等待队列中队首的作业。每个作业完成后要打印该作业的开始运行时刻、完成时刻、周转时间和带权周转时间,这一组作业完成后要计算并打印这组作业的平均周转时间、带权平均周转时间。

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

3.流程图与模块调用

4.实验分析

想要完成操作系统算法,首先要弄清楚操作系统相关的专业术语。弄清各个算法的流程和目的要求。才能模拟出相关算法的过程。
在我的理解中,
FCFS算法:
优先考虑系统中等待时间长的作业,而不管该作业所需执行时间长短。说的通俗点 , 哪个作业先提交 , 哪个作业先进内存。这是对作业调度而言,同样,FCFS算法也可以用于进程调度,此时谁先进内存的谁先上CPU。

那么这样一来就会出现这样的问题:如果一个作业所需运行时间很长(长作业) , 并且它先提交给系统。那么该作业就要长时间的占用CPU,而之后来到的短作业 , 即便它占用cpu的时间很短也上不了CPU。在单位时间内, CPU上执行的作业数会变少,系统吞吐量降低。

为了解决这种情况,采用SJF算法。
SJF算法:
优先考虑短作业,即:不管作业的提交时间,作业服务时间短的先上CPU。这样一来,系统吞吐量提高了。
HRN算法:
FCFS可能造成短作业用户不满,SPF可能使得长作业用户不满,于是提出HRN,选择响应比最高的作业运行。响应比=1+作业等待时间/作业处理时间。

基本概念:
作业周转时间=完成时间-提交时间
作业平均周转时间=周转时间/作业个数
作业带权周转时间=周转时间/运行时间
响应比=(等待时间+运行时间)/运行时间

5.运行情况

①FCFS算法:

②SJF算法:

③hrn算法:

6.实验体会

通过本次实验,我深刻的理解了操作系统中作业资源的分配方式和作业的调度方式及相关的3种算法。操作系统实验重在理解每一个算法的意图和目的,那么就选择适当的数据结构模拟过程就可以完成相关算法了。

先来先服务的作业调度,实现最简单。

最高响应比优先作业调度,既照顾了短作业,又照顾了作业到来的顺序,不会使长作业长期得不到运行,但是每次调度下一个作业前要计算剩余到来作业的响应比,增加了系统的开销。

开始时对作业调度不是很那么地清晰,通过做这个实验,现在对操作系统的作业调度有了清晰的理解,感觉在这个过程中自己就是充当了调度员的角色。

本次实验采用python完成,IDE是pycharm,python的queue库文件很好的支持了我在优先权算法中对队列的相关操作,python的operator库文件,很好的提供了基于类的属性按值排序的功能,这些在算法的编写过程中否起到了很大的作用。

【附】实验代码

import operator
import random
import queueQ = queue.Queue()  # 定义队列
arr_jcb = []
ID = ['A', 'B', 'C', 'D']
T = 0
A=0
B=0class JCB:def __init__(self, id, arriveTime, requestTime, startTime, finishTime, turnaroundTime, W_turnaroundTime, status):self.id = id  # 进程的idself.arriveTime = arriveTime  # 到达时间self.requestTime = requestTime  # 所需运行的时间self.startTime = startTime  # 开始时间self.finishTime = finishTime  # 结束时间self.turnaroundTime = turnaroundTime  # 周转时间self.W_turnaroundTime = W_turnaroundTime  # 带权周转时间self.status = status  # 状态self.ono = 0    # 响应比def func():node = Q.get()if node.arriveTime > T:node.startTime = node.arriveTimeelse:node.startTime = Tnode.finishTime = node.startTime + node.requestTimenode.turnaroundTime = node.finishTime - node.arriveTimenode.W_turnaroundTime = node.turnaroundTime / node.requestTimenode.status = 'finish'print('***执行算法***')for item in arr_jcb:print('进程{} 到达时间:{} 运行时间:{} 开始时间:{} 结束时间:{} 周转时间:{} 带权周转时间:{} 状态:{}'.format(item.id, item.arriveTime,item.requestTime, item.startTime,item.finishTime,item.turnaroundTime,item.W_turnaroundTime, item.status,item.status))return node.finishTimefor i in range(0, 4):arriveTime = random.randint(1, 10)  # 随机生成到达时间requestTime = random.randint(1, 20)  # 随机生成需要时间jcb = JCB(ID[i], arriveTime, requestTime, 0, 0, 0, 0, 'wait')jcb.ono=arriveTime/requestTime+1arr_jcb.append(jcb)print('1、先来先服务算法fcfs算法\t2、最短作业优先算法sjf\t3、最高响应比优先算法hrn')
key = int(input('请输入需要使用的算法编号:'))
if key==1:print('**********初始化生成4个进程**********')for item in arr_jcb:print('进程{} 到达时间:{} 运行时间:{} 开始时间:{} 结束时间:{} 周转时间:{} 带权周转时间:{} 状态:{}'.format(item.id, item.arriveTime,item.requestTime, item.startTime,item.finishTime,item.turnaroundTime,item.W_turnaroundTime, item.status,item.status))arr_jcb.sort(key=operator.attrgetter('arriveTime'))  # 按照状态优先权重的值升序排列for item in arr_jcb:Q.put(item)arr_jcb.sort(key=operator.attrgetter('id'))  # 按照状态优先权重的值升序排列for item in arr_jcb:T = func()print('***总结***')for item in arr_jcb:A += item.turnaroundTimeB += item.W_turnaroundTimeprint('本次fcfs算法,平均周转时间:', A / 4, '平均带权周转时间:', B / 4)
elif key==2:print('**********初始化生成4个进程**********')for item in arr_jcb:print('进程{} 到达时间:{} 运行时间:{} 开始时间:{} 结束时间:{} 周转时间:{} 带权周转时间:{} 状态:{}'.format(item.id, item.arriveTime,item.requestTime, item.startTime,item.finishTime,item.turnaroundTime,item.W_turnaroundTime, item.status,item.status))arr_jcb.sort(key=operator.attrgetter('requestTime'))  # 按照状态优先权重的值升序排列for item in arr_jcb:Q.put(item)arr_jcb.sort(key=operator.attrgetter('id'))  # 按照状态优先权重的值升序排列for item in arr_jcb:T = func()print('***总结***')for item in arr_jcb:A += item.turnaroundTimeB += item.W_turnaroundTimeprint('本次sjf算法,平均周转时间:', A / 4, '平均带权周转时间:', B / 4)
elif key==3:print('**********初始化生成4个进程**********')for item in arr_jcb:print('进程{} 到达时间:{} 运行时间:{} 开始时间:{} 结束时间:{} 周转时间:{} 带权周转时间:{} 状态:{}'.format(item.id, item.arriveTime,item.requestTime, item.startTime,item.finishTime,item.turnaroundTime,item.W_turnaroundTime, item.status,item.status))arr_jcb.sort(key=operator.attrgetter('ono'))  # 按照响应比的值升序排列for item in arr_jcb:Q.put(item)arr_jcb.sort(key=operator.attrgetter('id'))  # 按照状态优先权重的值升序排列for item in arr_jcb:T = func()print('***总结***')for item in arr_jcb:A += item.turnaroundTimeB += item.W_turnaroundTimeprint('本次hrn算法,平均周转时间:', A / 4, '平均带权周转时间:', B / 4)

操作系统 作业调度实验报告相关推荐

  1. 《操作系统》实验报告——熟悉Linux基础命令及进程管理

    理论知识 Linux--进程管理 Linux--Linux C语言编程基础知识 手把手教你安装Linux虚拟机 一.实验目的 (1)加深对进程概念的理解,明确进程和程序的区别. (2)进一步认识并发执 ...

  2. 进程同步算法实现实验报告Linux,操作系统进程同步实验报告.doc

    操作系统进程同步实验报告 实验三:进程同步实验 一.实验任务: (1)掌握操作系统的进程同步原理: (2)熟悉linux的进程同步原语: (3)设计程序,实现经典进程同步问题. 二.实验原理: (1) ...

  3. 东北大学软件学院操作系统v实验报告

    课程编号:B080000070     <操作系统>实验报告             姓名   学号   班级   指导教师   实验名称 <操作系统>实验 开设学期 2016 ...

  4. 课程linux实验报告,Linux操作系统课程实验报告.doc

    Linux操作系统课程实验报告.doc Linux操作系统课程实验报告班级姓名学号指导老师田丽华完成时间2014年7月目录一.实验目的1二.实验要求1三.实验内容1[第一题]1[第二题]2[第三题]4 ...

  5. linux课程实验报告,Linux操作系统课程实验报告

    Linux操作系统课程实验报告 Linux操作系统 课程实验报告 班级: 姓名: 学号: 指导老师:田丽华 完成时间:2014年7月 目录 一.实验目的1 二.实验要求1 三.实验内容1 [第一题]1 ...

  6. 《操作系统》实验报告——主存空间的分配与回收

    理论知识 Linux--Linux C语言编程基础知识 一.实验目的 采用可变式分区管理,使用最佳适应算法实现主存的分配与回收. 通过本次实验,帮助学生理解在可变式分区管理方式下,如何实现主存空间的分 ...

  7. 计算机系统结构实验报告Linux,计算机操作系统体系结构实验报告.doc

    操作系统实验报告 实验目的: 随着操作系统应用领域的扩大,以及操作系统硬件平台的多样化,操作系统的体系结构和开发方式都在不断更新,目前通用机上常见操作系统的体系结构有如下几种:模块组合结构.层次结构. ...

  8. 操作系统进程同步实验报告

    华侨大学计算机科学与技术学院 操作系统实验报告 进程同步 课程名称:操作系统实验 实验项目名称:进程同步 学    院:计算机科学与技术学院 专业班级: 姓    名: 学    号: 目录 1.描述 ...

  9. 计算机操作系统存储管理实验报告,《操作系统》存储管理实验报告

    <操作系统>存储管理实验报告 ____大学____学院实验报告课程名称: 计算机操作系统 实验名称: 存储管理实验 实验日期: 班级: 姓名: 学号: 仪器编号: XX 实验报告要求:1. ...

最新文章

  1. win10下Git和Tortoise安装并使用VS15保存到码云
  2. arcsde9.3 the arcsde repository is not successfully created
  3. java system.in 输入不回显_Java安全之URLDNS链
  4. 数据这么多,且看R语言怎么处理!
  5. python遗传算法_基于Python的遗传算法特征约简(附代码)
  6. XML/YAML文件的输入输出
  7. 使用Android Studio打包app
  8. 【转】VC6下安装与配置OpenCV1.0
  9. 1.Head First Java --- 进入Java的世界
  10. C/C++[codeup 2080]整数奇偶排序
  11. ntko 发生错误:保存html到临时文件目录发生错误,【ntko文件存取错误】_如何处理OA系统在线阅读或编辑文档时提示“文件存取错误”的问题...
  12. 十天学会单片机和c语言编程》,求十天学会单片机和C语言编程 ??
  13. Linux dos攻击服务器,Linux服务器如何防止DoS攻击
  14. ISP(图像信号处理)介绍
  15. c语言九宫格的递归算法,九宫格 数独 求解 算法 栈实现
  16. go 并发goroutines,channal
  17. golang 时间格式转换汇总
  18. 考研英语从句详细总结
  19. echarts实现中国地图和各省市地图
  20. epub格式电子书剖析之二:OP…

热门文章

  1. mysql 中is not null 和 !=null的区别
  2. Ubuntu下dex2jar的安装和使用
  3. Python 计算欧氏距离
  4. 柚子的小小笔记本-Linux中的简单运算
  5. JavaScript中的constructor属性
  6. pwd python 安装 模块_Python自动化办公之邮件定时发送
  7. 微生物组-宏基因组分析第8期(报名直播课免费参加线下2020.7,早鸟价仅剩1周)...
  8. “一不小心”成为大佬:Rob Knight 的传奇故事
  9. 学术论文模式图、统计图绘制
  10. R语言ggplot2可视化自动换行适配长文本图例(legend)实战:Multiple Lines for Text per Legend Label