《操作系统》实验一:先来先服务FCFS和短作业优先SJF进程调度算法
【实验题目】:先来先服务FCFS和短作业优先SJF进程调度算法
【实验学时】:4学时
【实验目的】
通过这次实验,加深对进程概念的理解,进一步掌握进程状态的转变、进程调度的策略及对系统性能的评价方法。
【实验内容】
问题描述:
设计程序模拟进程的先来先服务FCFS和短作业优先SJF调度过程。假设有n个进程分别在T1, … ,Tn时刻到达系统,它们需要的服务时间分别为S1, … ,Sn。分别采用先来先服务FCFS和短作业优先SJF进程调度算法进行调度,计算每个进程的完成时间,周转时间和带权周转时间,并且统计n个进程的平均周转时间和平均带权周转时间。
程序要求如下:
1)进程个数n;每个进程的到达时间T1, … ,Tn和服务时间S1, … ,Sn;选择算法1-FCFS,2-SJF。
2)要求采用先来先服务FCFS和短作业优先SJF分别调度进程运行,计算每个进程的周转时间,带权周转时间,并且计算所有进程的平均周转时间,带权平均周转时间;
3)输出:要求模拟整个调度过程,输出每个时刻的进程运行状态,如“时刻3:进程B开始运行”等等;
4)输出:要求输出计算出来的每个进程的周转时间,带权周转时间,所有进程的平均周转时间,带权平均周转时间。
【源代码】复制到Pycharm或者jupyter notebook可以直接跑!!!
"""
先进先出算法,按照进程到达时间排序,首先把所有进程按到达时间进行排序
第一个到达的进程直接服务,后续进程要进行判断,判断该进程到达时间与前一个进程结束时间
若进程到达时间较迟,该进程开始时间等于该进程到达时间,
若进程到达时间较早,该进程开始时间等于前一个进程结束时间。
"""
def FCFS(pcb, n):pcb.sort(key=lambda x:x[1],reverse=False) #按照到达时间升序排序#修改pcb中到达时间和完成时间for i in range(n):if i == 0: #如果是第一个到达的进程starttime =int(pcb[i][1]) #开始时间等于第一个进程的到达时间pcb[i][3] = starttime #修改第一个进程的开始时间pcb[i][4] = starttime + int(pcb[i][2]) #第一个进程的完成时间等于开始时间+服务时间elif (i > 0 and int(pcb[i-1][4]) < int(pcb[i][1])): #前一个进程的完成时间早于后一个进程的开始时间starttime = int(pcb[i][1]) #进程开始时间等于该进程到达时间pcb[i][3] = starttime #修改开始时间为该进程到达时间pcb[i][4] = starttime + int(pcb[i][2]) #修改完成时间=开始时间+服务时间else: #前一个进程的完成时间后于后一个进程的开始时间starttime = int(pcb[i-1][4]) #该进程开始时间等于前一进程完成时间pcb[i][3] = starttime #修改开始时间pcb[i][4] = starttime + int(pcb[i][2]) #修改完成时间=开始时间+服务时间#修改pcb中的带权时间和带权周转时间for i in range(n):pcb[i][5] = float(pcb[i][4] - int(pcb[i][1])) #带权时间=完成时间-到达时间pcb[i][6] = float(pcb[i][5] / int(pcb[i][2])) #带权周转时间=带权时间/服务时间#计算平均周转时间和平均带权周转时间zztime = 0dqzztime = 0for i in range(n):zztime = float(zztime + float(pcb[i][5])) #周转时间之和dqzztime = float(dqzztime + float(pcb[i][6])) #带权周转时间之和average_zztime = float(zztime / n )average_dqzztime = float(dqzztime / n)#对pcb按照开始时间进行排序pcb.sort(key = lambda x:x[3], reverse = False)return pcb,average_zztime,average_dqzztime
"""
短作业优先算法按作业的服务时间排序,首先按到达时间排序,第一个进程被服务,开始时间等于进程到达时间
后续进程按服务时间进程排序"""
def SJF(pcb,n):sjf_pcb = []i = 1 #控制从第二个进程开始k = 0 #用于控制循环结束sjf_pcb = pcbsjf_pcb.sort(key=lambda x:x[1],reverse=False) #按照到达时间升序排序#第一个到达的进程先服务,修改第一个进程的周转时间,带权周转时间starttime = int(sjf_pcb[0][1]) #开始时间等于第一个到达进程的开始时间pcb[0][3] = starttime #修改第一个进程的开始时间pcb[0][4] = starttime + int(sjf_pcb[0][2]) #第一个进程的完成时间=开始时间+服务时间sjf_pcb[0][5] = int(sjf_pcb[0][4]) - int(sjf_pcb[0][1]) #计算周转时间=完成时间-到达时间sjf_pcb[0][6] = float(sjf_pcb[0][5]) / int(sjf_pcb[0][2]) #计算带权周转时间=周转时间/服务时间#从第二个进程开始,按服务时间进行排序temp_pcb = sjf_pcb[1:len(sjf_pcb)] #临时存放 temp_pcb.sort(key=lambda x: x[2], reverse=False) #按服务时间进行升序排序sjf_pcb[1:len(sjf_pcb)] = temp_pcb #修改原先进程队列,保存按服务时间排序后的进程顺序#从第二个进程开始while(i < n):h = 1# 比较到达时间和前一者的完成时间while(int(sjf_pcb[i][1]) >= int(sjf_pcb[i - 1][4])): #当前进程到达时间迟于上一个进程完成时间,开始时间要相应推迟if i == n - 1: #如果当前进程是已到达最后一个进程,直接修改进程时间startTime = sjf_pcb[i][1] #开始时间=当前进程到达时间sjf_pcb[i][3] = starttime #开始时间sjf_pcb[i][4] = starttime + int(sjf_pcb[i][2]) #完成时间=开始时间+服务时间sjf_pcb[i][5] = int(sjf_pcb[i][4]) - int(sjf_pcb[i][1]) #周转时间=完成时间-到达时间sjf_pcb[i][6] = float(sjf_pcb[i][5]) / int(sjf_pcb[i][2]) #带权周转时间=周转时间/服务时间k = 1 #说明已经服务完已到达的最后一个进程,可以跳出当前while循环breakelse: #如果当前进程不是最后一个进程,服务完之后,还要对进程顺序重新进行调换temp_sjf_pcb = sjf_pcb[i] #把未被服务的进程放在sjf_pcb列表末尾,便于后续排序sjf_pcb[i] = sjf_pcb[i+h]sjf_pcb[i+h] = temp_sjf_pcbh += 1if h >= n - i - 1: #说明前面的进程完成之后,还有新的进程没有到达,重新排序(可能新到达的进程服务时间更短)temp_pcb2 = sjf_pcb[i:len(sjf_pcb)] temp_pcb2.sort(key=lambda x: x[1], reverse=False) # 后续队列重新按照到达时间顺序进行排序sjf_pcb[i:len(sjf_pcb)] = temp_pcb2sjf_pcb[i][3] = int(sjf_pcb[i][1]) #开始时间=该进程的到达时间sjf_pcb[i][4] = int(sjf_pcb[i][1]) + int(sjf_pcb[i][2]) #完成时间=该进程到达时间+服务时间sjf_pcb[i][5] = int(sjf_pcb[i][4]) - int(sjf_pcb[i][1]) #周转时间=该进程完成时间-到达时间sjf_pcb[i][6] = float(sjf_pcb[i][5]) / int(sjf_pcb[i][2]) #带权周转时间=完成时间/服务时间temp_pcb2 = sjf_pcb[i + 1:len(sjf_pcb)] #保存后续未服务进程temp_pcb2.sort(key=lambda x: x[2], reverse=False) # 对未服务的进程重新按照服务时间排序sjf_pcb[i + 1:len(sjf_pcb)] = temp_pcb2 #修改进程队列h = 1i += 1else:continueif(k == 1): #说明进程服务完成breakelse: #上一进程结束时,该短进程已经到达,对进程进行时间修改starttime = sjf_pcb[i - 1][4] #开始时间=前一个进程的完成时间sjf_pcb[i][3] = starttime #开始时间sjf_pcb[i][4] = starttime + int(sjf_pcb[i][2]) #完成时间=开始时间+服务时间sjf_pcb[i][5] = int(sjf_pcb[i][4]) - int(sjf_pcb[i][1])sjf_pcb[i][6] = float(sjf_pcb[i][5]) / int(sjf_pcb[i][2])i += 1# 计算平均周转时间和平均带权周转时间zztime = 0dqzztime = 0for i in range(n):zzTime = float(zztime + float(pcb[i][5]))dqzzTime = float(dqzztime + float(pcb[i][6]))average_zztime = float(zzTime / n)average_dqzztime = float(dqzzTime / n)# 输出结果,按照开始时间进行排序sjf_pcb.sort(key=lambda x: x[3], reverse=False)return pcb,average_zztime,average_dqzztimedef main():#实现先来先服务pcb = []#确认进程数n = int(input("请输出进程个数"))#输入到达时间和服务时间for i in range(n):pname = input("请输入第"+str(i+1)+"个进程名:")arrivetime = input("请输入到达时间:")servicetime = input("请输入服务时间:")pcb.append([pname,arrivetime,servicetime,0,0,0,0]) #开始,完成,周转,带权周转suanfa = input("请输入你想要执行的算法(FCFS或者SJF)")if suanfa=='FCFS':pcb,average_zztime,average_dqzztime = FCFS(pcb,n)else:pcb,average_zztime,average_dqzztime = SJF(pcb,n)#输出结果for i in range(n):print("进程名: %s 开始时间: %d 完成时间: %d 周转时间: %d 带权周转时间: %.2f " \% (pcb[i][0], int(pcb[i][3]), int(pcb[i][4]), int(pcb[i][5]), float(pcb[i][6])))print("本次调度的平均周转时间为: %.2f" % float(average_zztime))print("本次调度的平均带权周转时间为: %.2f" % float(average_dqzztime))main()
《操作系统》实验一:先来先服务FCFS和短作业优先SJF进程调度算法相关推荐
- 【操作系统 - 1】先来先服务FCFS和短作业优先SJF进程调度算法
操作系统系列 学习至此,发现很多学了但很久没用的知识,久而久之,慢慢遗忘.等哪天还需要的话,却发现已经忘得差不多了,即使整理了文档(word等),还是得从头再学一遍.读研第一学期,发现很多东西都可以从 ...
- 作业调度算法【平均周转时间、平均带权周转时间、先来先服务FCFS、短作业优先SJF、高优先权(级)算法FPF、高响应比优先算法HRRN】
文章目录 先来先服务算法(FCFS) 短作业优先算法(SJF).短进程优先算法(SPF) 周转时间和带权周转时间 高优先权(级)调度算法FPF 高响应比优先调度算法HRRN 先来先服务算法(FCFS) ...
- 【学习笔记】第二章——调度算法:先来先服务FCFS、短作业优先SJF、高响应比HRRN
文章目录 一. 先来先服务(FCFS) 二. 短作业优先(SJF) 三. 高响应比优先 1. 对前面两种算法的思考 2. 描述 四. 一.二.三总结 例子都要手动写一遍哦-这三个是供早期的批处理系统使 ...
- 调度算法——先来先服务(FCFS)、短作业优先(SJF)、高响应比优先(HRRN) 例题详细!!!
文章目录 前言 知识总览 先来先服务(FCFS, First Come First Serve) 短作业优先(SJF, Shortest Job First) 对FCFS和SJF两种算法的思考 高响应 ...
- 操作系统之进程管理:6、调度算法(先来先服务FCFS、最短作业优先SJF、最高响应比优先HRRN、时间片轮转法、优先级调度、多级反馈队列)
6.调度算法 适用于早期批处理机系统的调度算法 思维导图 1.先来先服务FCFS 2.最短作业优先SJF 非抢占式最短作业优先 抢占式最短作业优先(最短剩余时间优先算法) 注 3.最高响应比优先HRR ...
- 【JAVA操作系统——进程调度】非抢占式短作业优先算法
测试要求 进程信息如下: 进程 到达时间 服务时间 A 0 3 B 1 6 C 2 4 D 3 9 E 4 1 请输出进程的调度过程,以及系统平均带权周转时间. 代码实现 package com.zj ...
- 先来先服务和短作业优先调度算法-C语言实现
算法介绍 先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可用于进程调度.当在作业调度中采用该算法时,每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将 ...
- 2.2.4 操作系统之作业/进程调度算法(FCFS先来先服务、SJF短作业优先、HRRN高响应比优先)
文章目录 0.思维导图 1.先来先服务---FCFS 2.短作业优先---SJF 3.高响应比优先---HRRN 4.三种算法的对比和总结 0.思维导图 1.先来先服务-FCFS First come ...
- 短作业优先算法c语言实现,OS短作业优先调度算法C语言
OS短作业优先调度算法C语言 采用短作业优先调度算法调度程序 学 号: 姓 名: 专 业: 指导老师: 日 期: 目录 一.实验题目3 二.课程设计的目的3 三.设计内容3 四.设计要求3 五.主要数 ...
最新文章
- 工作总结 -- 插件篇 目录
- 服务发现 注册中心 consul 的介绍、部署和使用
- 多源最短路径Floyd、Floyd求最小环【模板】
- 程序员过关斩将--数据库的乐观锁和悲观锁并非真实的锁
- 关于php的字符串编码
- SylixOS磁盘高速传输
- ServiceComb微服务开发框架介绍
- HDU 3359 高斯消元模板题,
- 手把手教你搭建 vue 环境
- 图片抓取_小小爬虫批量抓取微信推文里的图片
- 优思学院|一文读懂SFMEA、DFMEA、PFMEA的关系
- 无线通信里的 UAV
- 软件测试 | 手把手教你如何使用 ABD调试工具,学不会算我的!
- 如何快速下载720云高清全景图片
- 回顾12306 成长的烦恼
- 知码开门 装箱问题
- 微信公众平台服务号与订阅号区别详解【有图】
- SylixOS进化简史
- 关于前端后台管理系统总结
- chrome浏览器 在线打开预览pdf文件,而不是下载文件。
热门文章
- XJY-220/43AC220V静态信号继电器
- 【quartz表结构及说明】
- sqlserver 没有备份误删数据_超实用的Word备份和恢复技巧,职场必备,为你的文件保驾护航!...
- thinkphp支付宝资金下发 单笔转账
- oracle 删除一个值,Oracle 删除数据的几种方法
- Amazon SES介绍 - 服务特点
- Docker consul集群
- html中的注释对样式表的影响
- pcap判断是否oracle,pcap的使用之pcap_findalldevs
- 学习前端开发需要的电脑配置需求