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算法相关推荐

  1. 计算机操作系统实验之进程调度(一)轮转调度法(C语言)

    计算机操作系统实验之进程调度(一)轮转调度法(C语言) 实验目的 实验内容与基本要求 轮转调度法的基本原理 实现思路及功能分析 算法流程图 全部代码 工程图 ProcessScheduling.h P ...

  2. 操作系统实验(进程调度)

    操作系统实验(进程调度) 一.实验目的 二.实验内容 三.实验准备 3.1优先权算法 3.2时间片轮转调度算法 四.实验 一.实验目的   1.1理解有关进程控制块.进程队列的概念.   1.2掌握进 ...

  3. 广州大学2020操作系统实验二:银行家算法

    相关资料 广州大学2020操作系统实验一:进程管理与进程通信 广州大学2020操作系统实验二:银行家算法 广州大学2020操作系统实验三:内存管理 广州大学2020操作系统实验四:文件系统 广州大学2 ...

  4. 操作系统实验:页面置换算法的模拟实现及命中率对比(学习笔记)

    操作系统实验:页面置换算法的模拟实现及命中率对比(学习笔记) 题目要求 输入要求 输出要求 编程平台 实验成果 开始模拟 错误输入 退出程序 代码实现 抽象数据类型定义 指令地址流生成 指令地址流到页 ...

  5. 操作系统 实验三 进程调度模拟程序

                                                          实验三 进程调度模拟程序                                   ...

  6. 【南邮操作系统实验】页面置换算法(FIFO、LRU、OPT)图形化界面(JavaFx)

    页面置换算法图形化界面 前言 运行效果 源码 FIFO LRU OPT FXML界面 控制器 启动类 前言 其实以前操作系统实验的时候我写过了三份了:(命令行) 页面置换算法 (FIFO.LRU.OP ...

  7. 皮卡丘忠实粉丝之Web实现操作系统实验(进程调度+存储管理+死锁避免银行家算法)

    **皮卡皮卡丘~~~~~~** 目录 进程调度 目的和要求 内容与步骤 运行结果 问题及心得 C语言实现代码 存储管理 目的和要求 内容与步骤 运行结果 问题及心得 C语言实现代码 死锁避免银行家算法 ...

  8. 广州大学操作系统实验 2020版 银行家算法

    银行家算法 银行家算法(Banker's Algorithm)是一个避免死锁(Deadlock)的著名算法,是由艾兹格·迪杰斯特拉在1965年为T.H.E系统设计的一种避免死锁产生的算法.它以银行借贷 ...

  9. 【南邮操作系统实验】页面置换算法 (FIFO、LRU、OPT)Java 版

    页面置换算法Java版 先进先出置换算法(FIFO) 最近最久未使用置换算法(LRU) 最佳置换算法(OPT) 帮女朋友写了份 Python版的,Python版戳这里 帮女朋友舍友写了份 C++ 版的 ...

最新文章

  1. 云白条,做有温度的金融,帮助有困难的人
  2. 标识位:可以用以确定鼠标点击的是哪一个按钮或者是文本框
  3. POJ 1276 完全背包
  4. windows截图c语言,window 截取屏幕,并实现jpeg压缩
  5. Linux中查看某个软件的安装路径
  6. javascript range 转为 html,javascript Range对象跨浏览器常用操作
  7. [物理学与PDEs]第5章第3节 守恒定律, 应力张量
  8. 转载——如果让我完善几年前的一个项目,我会做哪些改进?
  9. iOS--视频播放器之ZFPlayer
  10. eclipse中文语言包 离线安装
  11. 计算机ppt密码是什么,PPT怎么设置密码 PPT密码设置教程-电脑教程
  12. js实现60秒倒计时
  13. VM/VB虚拟机镜像
  14. 关于用户表空间配额的问题
  15. oracle连接超时是什么意思,oracle连接超时自动断开问题
  16. pandas数据绘制直方图、饼状图、线形图
  17. pycharm下django案例的环境搭建运行
  18. c语言线程怎么退出,如何用C语言实现多线程
  19. 2017湘潭大学邀请赛H题(树的直径)
  20. 如何将adobe pdf背景设置为护眼色

热门文章

  1. 如何攻击网络中的计算机,计算机网络攻击的步骤
  2. 3.单例设计模式:恶汉、懒汉
  3. Google word、excel、ppt (Chrome)浏览器插件下载
  4. 你早就知道该怎么用了
  5. 华为ws832虚拟服务器,玩的就是真实力!华为路由WS832实测体验
  6. java基础06_类
  7. Java对图片Base64转码--HTML对Base64解码 [ Java加强版 ]
  8. 怎么查看Linux系统中的内存?
  9. .net Entity Framework
  10. 链路层-滑动窗口协议-回退N帧协议-窗口大小选择问题