操作系统实验一 进程调度 FCFS_SJF_HRRN_RR算法
FCFS先来先服务-SJF短作业优先-HRRN高响应比优先-RR时间片轮转算法的python实现
需要创建input.txt文件在程序目录下
格式如下
A, 0, 4
B, 1, 3
C, 2, 4
D, 3, 2
E, 4, 4
进程名-到达时间-服务时间,需要用逗号隔开
# coding:utf-8
import os
import copy
from queue import QueueprocList = list()# 录入函数
def inpcb():# 读取文件信息,打印if os.path.exists(os.path.abspath(".\\input.txt")):print("input.txt opening.\n")with open(".\\input.txt", "r") as fp:data = fp.read()print("process list")print(data + "\n")else:print("[-] file doesn't exists.")for each in data.split("\n"): # 按行分片if not len(each.split(",")) == 3: # 判断一行是否有三项:进程名、到达时间、运行时间break# 写入procList.append({"pName": each.split(",")[0],"arriveTime": float(each.split(",")[1]),"serviceTime": float(each.split(",")[2]),"startTime": "", # 开始时间"finishTime": "", # 完成时间"zzTime": "", # 周转时间"dqzzTime": "", # 带权周转时间"procRatio": "" # 响应比})print("Number of Process : "+str(len(procList))+"\n")# 先来先服务算法
def FCFS():# 深拷贝,建立新列表对象FCFS_procList = copy.deepcopy(procList)# 按到达顺序排序FCFS_procList.sort(key=lambda x: x["arriveTime"], reverse=False)for i in range(len(FCFS_procList)):if (i == 0):startTime = FCFS_procList[i]["arriveTime"]FCFS_procList[i]["startTime"] = startTime # 开始时间FCFS_procList[i]["finishTime"] = startTime + FCFS_procList[i]["serviceTime"] # 完成时间# 判断是否就绪,p1完成时间内到达# 已就绪开始时间为上一个进程的完成时间elif (i > 0 and FCFS_procList[i]["arriveTime"] < FCFS_procList[i - 1]["finishTime"]):startTime = FCFS_procList[i - 1]["finishTime"]FCFS_procList[i]["startTime"] = startTimeFCFS_procList[i]["finishTime"] = startTime + FCFS_procList[i]["serviceTime"]# 未就绪开始时间为到达时间else:startTime = FCFS_procList[i]["arriveTime"]FCFS_procList[i]["startTime"] = startTimeFCFS_procList[i]["finishTime"] = startTime + FCFS_procList[i]["serviceTime"]# 计算周转、带权周转时间, 平均周转、平均带权周转时间# 周转时间= 完成时间-到达时间# 带权周转时间=周转时间/运行时间azzTime = 0adqzzTime = 0for i in range(len(FCFS_procList)):FCFS_procList[i]["zzTime"] = FCFS_procList[i]["finishTime"]-FCFS_procList[i]["arriveTime"]FCFS_procList[i]["dqzzTime"] = FCFS_procList[i]["zzTime"]/FCFS_procList[i]["serviceTime"]azzTime += FCFS_procList[i]["zzTime"]adqzzTime += FCFS_procList[i]["dqzzTime"]print("进程:{: <4}到达时间:{: <6}运行时间:{: <6}开始时间:{: <6}完成时间:{: <6}周转时间:{: <6}带权周转时间:{: <6} ".format(FCFS_procList[i]["pName"], FCFS_procList[i]["arriveTime"], FCFS_procList[i]["serviceTime"],FCFS_procList[i]["startTime"],FCFS_procList[i]["finishTime"], FCFS_procList[i]["zzTime"],FCFS_procList[i]["dqzzTime"]))print("平均周转时间:{: <6}\n平均带权周转时间:{: <6}" .format(azzTime/len(FCFS_procList),adqzzTime/len(FCFS_procList)))# 短作业优先算法
def SJF():# 深拷贝,建立新列表对象SJF_procList = copy.deepcopy(procList)# 按到达顺序排序SJF_procList.sort(key=lambda x: x["arriveTime"], reverse=False)# 对等待中的进程按运行时间排序end = SJF_procList[0]["arriveTime"] # 当前时间for i in range(len(SJF_procList)):# 找出所有就绪进程num = 0for n in range(i, len(SJF_procList)):if (SJF_procList[n]["arriveTime"] <= end):num = num+1 # 找到最后一个等待进程的下标# 冒泡排序for m in range(num):# 循环标记(如果没有交换表示有序,结束循环)sign = False# 内循环每次将最大值放在最右边for o in range(num - 1 - m):if SJF_procList[i]["serviceTime"] > SJF_procList[i + 1]["serviceTime"]:SJF_procList[i], SJF_procList[i + 1] = SJF_procList[i + 1], SJF_procList[i]sign = True# 如果没有交换说明列表已经有序,结束循环if not sign:breakend = end + SJF_procList[i]["serviceTime"]# 排序已完成for i in range(len(SJF_procList)):if (i == 0):startTime = SJF_procList[i]["arriveTime"]SJF_procList[i]["startTime"] = startTime # 开始时间SJF_procList[i]["finishTime"] = startTime + SJF_procList[i]["serviceTime"] # 完成时间# 判断是否就绪,p1完成时间内到达# 已就绪开始时间为上一个进程的完成时间elif (i > 0 and SJF_procList[i]["arriveTime"] < SJF_procList[i - 1]["finishTime"]):startTime = SJF_procList[i - 1]["finishTime"]SJF_procList[i]["startTime"] = startTimeSJF_procList[i]["finishTime"] = startTime + SJF_procList[i]["serviceTime"]# 未就绪开始时间为到达时间else:startTime = SJF_procList[i]["arriveTime"]SJF_procList[i]["startTime"] = startTimeSJF_procList[i]["finishTime"] = startTime + SJF_procList[i]["serviceTime"]# 计算周转、带权周转时间, 平均周转、平均带权周转时间# 周转时间= 完成时间-到达时间# 带权周转时间=周转时间/运行时间azzTime = 0adqzzTime = 0for i in range(len(SJF_procList)):SJF_procList[i]["zzTime"] = SJF_procList[i]["finishTime"] - SJF_procList[i]["arriveTime"]SJF_procList[i]["dqzzTime"] = SJF_procList[i]["zzTime"] / SJF_procList[i]["serviceTime"]azzTime += SJF_procList[i]["zzTime"]adqzzTime += SJF_procList[i]["dqzzTime"]print("进程:{: <4}到达时间:{: <6}运行时间:{: <6}开始时间:{: <6}完成时间:{: <6}周转时间:{: <6}带权周转时间:{: <6} ".format(SJF_procList[i]["pName"], SJF_procList[i]["arriveTime"], SJF_procList[i]["serviceTime"],SJF_procList[i]["startTime"], SJF_procList[i]["finishTime"], SJF_procList[i]["zzTime"], SJF_procList[i]["dqzzTime"]))print("平均周转时间:{: <6}\n平均带权周转时间:{: <6}" .format(azzTime / len(SJF_procList), adqzzTime / len(SJF_procList)))# 最高响应比优先算法
def HRRN():# 深拷贝,建立新列表对象HRRN_procList = copy.deepcopy(procList)# 按到达顺序排序HRRN_procList.sort(key=lambda x: x["arriveTime"], reverse=False)# 对等待中的进程按响应比排序end = HRRN_procList[0]["arriveTime"] # 当前时间for i in range(len(HRRN_procList)):# 找出所有就绪进程num = 0for n in range(i, len(HRRN_procList)):if (HRRN_procList[n]["arriveTime"] <= end):num = num + 1 # 找到最后一个等待进程的下标# 只有一个等待进程,无需比较if num == 1:HRRN_procList[i]["procRatio"] = (end - HRRN_procList[i]["arriveTime"] + HRRN_procList[i]["serviceTime"]) / HRRN_procList[i]["serviceTime"]else:# 计算响应比# (等待时间+运行时间)/运行时间for p in range(num):HRRN_procList[i+p]["procRatio"] = (end - HRRN_procList[i+p]["arriveTime"] + HRRN_procList[i+p]["serviceTime"]) / HRRN_procList[i+p]["serviceTime"]# 冒泡排序for m in range(num):# 循环标记(如果没有交换表示有序,结束循环)sign = False# 内循环,每次将响应比最大值放在最左边for o in range(num - 1 - m):# 如果同时到达,响应比一致,先服务运行时间小的if HRRN_procList[i]["procRatio"] == HRRN_procList[i + 1]["procRatio"]:if HRRN_procList[i]["serviceTime"] > HRRN_procList[i + 1]["serviceTime"]:HRRN_procList[i], HRRN_procList[i + 1] = HRRN_procList[i + 1], HRRN_procList[i]sign = Trueelif HRRN_procList[i]["procRatio"] < HRRN_procList[i + 1]["procRatio"]:HRRN_procList[i], HRRN_procList[i + 1] = HRRN_procList[i + 1], HRRN_procList[i]sign = True# 如果没有交换说明列表已经有序,结束循环if not sign:breakend = end + HRRN_procList[i]["serviceTime"]# 排序已完成for k in range(len(HRRN_procList)):if (k == 0):startTime = HRRN_procList[k]["arriveTime"]HRRN_procList[k]["startTime"] = startTime # 开始时间HRRN_procList[k]["finishTime"] = startTime + HRRN_procList[k]["serviceTime"] # 完成时间# 判断是否就绪,p1完成时间内到达# 已就绪开始时间为上一个进程的完成时间elif (k > 0 and HRRN_procList[k]["arriveTime"] < HRRN_procList[k - 1]["finishTime"]):startTime = HRRN_procList[k - 1]["finishTime"]HRRN_procList[k]["startTime"] = startTimeHRRN_procList[k]["finishTime"] = startTime + HRRN_procList[k]["serviceTime"]# 未就绪开始时间为到达时间else:startTime = HRRN_procList[k]["arriveTime"]HRRN_procList[k]["startTime"] = startTimeHRRN_procList[k]["finishTime"] = startTime + HRRN_procList[k]["serviceTime"]# 计算周转、带权周转时间, 平均周转、平均带权周转时间# 周转时间= 完成时间-到达时间# 带权周转时间=周转时间/运行时间azzTime = 0adqzzTime = 0for k in range(len(HRRN_procList)):HRRN_procList[k]["zzTime"] = HRRN_procList[k]["finishTime"] - HRRN_procList[k]["arriveTime"]HRRN_procList[k]["dqzzTime"] = HRRN_procList[k]["zzTime"] / HRRN_procList[k]["serviceTime"]azzTime += HRRN_procList[k]["zzTime"]adqzzTime += HRRN_procList[k]["dqzzTime"]print("进程:{: <4}到达时间:{: <6}运行时间:{: <6}开始时间:{: <6}完成时间:{: <6}周转时间:{: <6}带权周转时间:{: <6} ".format(HRRN_procList[k]["pName"], HRRN_procList[k]["arriveTime"],HRRN_procList[k]["serviceTime"], HRRN_procList[k]["startTime"],HRRN_procList[k]["finishTime"],HRRN_procList[k]["zzTime"], HRRN_procList[k]["dqzzTime"]))print("平均周转时间:{: <6}\n平均带权周转时间:{: <6}".format(azzTime / len(HRRN_procList), adqzzTime / len(HRRN_procList)))# 时间片轮转调度算法
def RR(rr):# 深拷贝,建立新列表对象RR_procList = copy.deepcopy(procList)# 按到达顺序排序RR_procList.sort(key=lambda x: x["arriveTime"], reverse=False)# 深拷贝,建立按到达顺序排序的临时对象temppro = copy.deepcopy(RR_procList)# 建立队列qu = Queue()count = len(RR_procList)# 循环标记sign = True# 记录当前时间nowtime = 0# 记录未完成进程数量flag = count# 进程索引i = 0while sign:# 未完成进程都在队列# 依次出队运行,判断是否运行完成,未完成重新入队if Queue.qsize(qu) == flag:nowP = qu.get()ind = temppro.index(nowP) # 获得该进程的索引# 如果第一次执行(原始运行时间等于剩余运行时间)if RR_procList[ind]["serviceTime"] == nowP["serviceTime"]:# 记录进程开始时间RR_procList[ind]["startTime"] = nowtimeif nowP["serviceTime"] > rr: # 服务时间大于时间片nowP["serviceTime"] -= rr # 还需要服务的时间nowtime += rr # 当前完成时间else: # 服务时间小于等于时间片servicetime = RR_procList[ind]["serviceTime"] # 原始的服务时间nowP["finishTime"] = nowtime + nowP["serviceTime"] # 完成时间nowP["zzTime"] = nowP["finishTime"] - nowP["arriveTime"]nowP["dqzzTime"] = nowP["zzTime"] / servicetimenowtime = nowP["finishTime"] # 更新当前完成时间nowP["serviceTime"] = 0 # 服务结束flag -= 1if nowP["serviceTime"] > 0: # 服务未结束,放到队尾qu.put(nowP)# 有从未运行进程else:# 队列非空if not qu.empty():nowP = qu.get() # 调度当前队头进程ind = temppro.index(nowP) # 获得该进程的索引# 如果第一次执行(原始运行时间等于剩余运行时间)if RR_procList[ind]["serviceTime"] == nowP["serviceTime"]:RR_procList[ind]["startTime"] = nowtimeif nowP["serviceTime"] > rr: # 服务时间大于时间片nowP["serviceTime"] -= rr # 还需要服务的时间nowtime += rr # 当前完成时间else: # 服务时间小于等于时间片servicetime = RR_procList[ind]["serviceTime"] # 原始的服务时间nowP["finishTime"] = nowtime + nowP["serviceTime"] # 完成时间nowP["zzTime"] = nowP["finishTime"] - nowP["arriveTime"]nowP["dqzzTime"] = nowP["zzTime"] / servicetimenowtime = nowP["finishTime"] # 更新当前完成时间nowP["serviceTime"] = 0 # 服务结束flag -= 1# 等待进程数量wait = 0for n in range(i, count, 1):if temppro[n]["arriveTime"] <= nowtime: # 下一个进程已经到达wait += 1# 如果有等待进程,等待进程入队if wait > 0:for m in range(wait):waitP = temppro[i]qu.put(waitP)i += 1 # 进程索引加一if nowP["serviceTime"] > 0: # 服务未结束,放到队尾qu.put(nowP)# 队列已空else:nowP = temppro[i]nowtime = nowP["arriveTime"]qu.put(nowP)i += 1 # 进程索引加一# 结束循环判断for j in range(count):if temppro[j]["serviceTime"] == 0:sign = False # 全部进程执行完成else:sign = True # 还有未服务结束的进程breakazzTime = 0adqzzTime = 0for l in range(count):RR_procList[l]["finishTime"] = temppro[l]["finishTime"]RR_procList[l]["zzTime"] = temppro[l]["zzTime"]RR_procList[l]["dqzzTime"] = temppro[l]["dqzzTime"]azzTime += temppro[l]["zzTime"]adqzzTime += temppro[l]["dqzzTime"]for k in range(count):print("进程:{: <4}到达时间:{: <6}运行时间:{: <6}开始时间:{: <6}完成时间:{: <6}周转时间:{: <6}带权周转时间:{: <6} ".format(RR_procList[k]["pName"], RR_procList[k]["arriveTime"], RR_procList[k]["serviceTime"],RR_procList[k]["startTime"],RR_procList[k]["finishTime"], RR_procList[k]["zzTime"], RR_procList[k]["dqzzTime"]))print("平均周转时间:{: <6}\n平均带权周转时间:{: <6}" .format(azzTime/count, adqzzTime/count))# 主函数
if __name__ == '__main__':inpcb()print("算法一:先来先服务算法-FCFS")print("算法二:短作业优先算法-SJF")print("算法三:最高响应比优先算法-HRRN")print("算法四:时间片轮转调度算法-RR")m = 1while (m == 1):option = input("请输入你要选择的算法(输入1,2,3,4进行选择,其他键退出):")if (option == '1'):FCFS()elif (option == '2'):SJF()elif (option == '3'):HRRN()elif (option == '4'):rr = float(input("请输入时间片长度:"))RR(rr)else:print("退出计算")m = 0
运行结果如下:
操作系统实验一 进程调度 FCFS_SJF_HRRN_RR算法相关推荐
- 计算机操作系统实验之进程调度(一)轮转调度法(C语言)
计算机操作系统实验之进程调度(一)轮转调度法(C语言) 实验目的 实验内容与基本要求 轮转调度法的基本原理 实现思路及功能分析 算法流程图 全部代码 工程图 ProcessScheduling.h P ...
- 操作系统实验(进程调度)
操作系统实验(进程调度) 一.实验目的 二.实验内容 三.实验准备 3.1优先权算法 3.2时间片轮转调度算法 四.实验 一.实验目的 1.1理解有关进程控制块.进程队列的概念. 1.2掌握进 ...
- 广州大学2020操作系统实验二:银行家算法
相关资料 广州大学2020操作系统实验一:进程管理与进程通信 广州大学2020操作系统实验二:银行家算法 广州大学2020操作系统实验三:内存管理 广州大学2020操作系统实验四:文件系统 广州大学2 ...
- 操作系统实验:页面置换算法的模拟实现及命中率对比(学习笔记)
操作系统实验:页面置换算法的模拟实现及命中率对比(学习笔记) 题目要求 输入要求 输出要求 编程平台 实验成果 开始模拟 错误输入 退出程序 代码实现 抽象数据类型定义 指令地址流生成 指令地址流到页 ...
- 操作系统 实验三 进程调度模拟程序
实验三 进程调度模拟程序 ...
- 【南邮操作系统实验】页面置换算法(FIFO、LRU、OPT)图形化界面(JavaFx)
页面置换算法图形化界面 前言 运行效果 源码 FIFO LRU OPT FXML界面 控制器 启动类 前言 其实以前操作系统实验的时候我写过了三份了:(命令行) 页面置换算法 (FIFO.LRU.OP ...
- 皮卡丘忠实粉丝之Web实现操作系统实验(进程调度+存储管理+死锁避免银行家算法)
**皮卡皮卡丘~~~~~~** 目录 进程调度 目的和要求 内容与步骤 运行结果 问题及心得 C语言实现代码 存储管理 目的和要求 内容与步骤 运行结果 问题及心得 C语言实现代码 死锁避免银行家算法 ...
- 广州大学操作系统实验 2020版 银行家算法
银行家算法 银行家算法(Banker's Algorithm)是一个避免死锁(Deadlock)的著名算法,是由艾兹格·迪杰斯特拉在1965年为T.H.E系统设计的一种避免死锁产生的算法.它以银行借贷 ...
- 【南邮操作系统实验】页面置换算法 (FIFO、LRU、OPT)Java 版
页面置换算法Java版 先进先出置换算法(FIFO) 最近最久未使用置换算法(LRU) 最佳置换算法(OPT) 帮女朋友写了份 Python版的,Python版戳这里 帮女朋友舍友写了份 C++ 版的 ...
最新文章
- 云白条,做有温度的金融,帮助有困难的人
- 标识位:可以用以确定鼠标点击的是哪一个按钮或者是文本框
- POJ 1276 完全背包
- windows截图c语言,window 截取屏幕,并实现jpeg压缩
- Linux中查看某个软件的安装路径
- javascript range 转为 html,javascript Range对象跨浏览器常用操作
- [物理学与PDEs]第5章第3节 守恒定律, 应力张量
- 转载——如果让我完善几年前的一个项目,我会做哪些改进?
- iOS--视频播放器之ZFPlayer
- eclipse中文语言包 离线安装
- 计算机ppt密码是什么,PPT怎么设置密码 PPT密码设置教程-电脑教程
- js实现60秒倒计时
- VM/VB虚拟机镜像
- 关于用户表空间配额的问题
- oracle连接超时是什么意思,oracle连接超时自动断开问题
- pandas数据绘制直方图、饼状图、线形图
- pycharm下django案例的环境搭建运行
- c语言线程怎么退出,如何用C语言实现多线程
- 2017湘潭大学邀请赛H题(树的直径)
- 如何将adobe pdf背景设置为护眼色