Python3实现FCFS(先来先服务算法)和SJF(最短进程优先算法)

该博客介绍如何使用Python3实现两种进程调度算法:FCFS(先来先服务)和SJF(最短进程优先)。通过用户输入进程信息,程序计算并输出每个进程的开始时间、完成时间、周转时间和带权周转时间,以及平均周转时间和平均带权周转时间。
摘要由CSDN通过智能技术生成
#--*-- coding:utf-8 --*--
#python3.5
#Author:YouHan

pcb = []
n = int(input("请输入你的进程数:"))

#输入函数
def inPcb():
    i = 0
    while(i < n):
        print("**************************************")
        pName = input("请输入第 %d 个进程名:" % (i+1))
        arriveTime = int(input("请输入到达时间:"))
        serviceTime = int(input("请输入服务时间:"))
        """将数据放入列表中
            startTime=开始时间 finishTime=完成时间 
            zzTime=周转时间 dqzzTime=带权周转时间
            AzzTime=平均周转时间 AdqzzTime=平均带权周转时间
        """
        #           进程名,到达时间,服务时间,开始,完成,周转,带权周转
        pcb.append([pName, arriveTime, serviceTime, 0, 0, 0, 0])
        i += 1


#先来先服务算法
def FCFS():
    #对列表按照到达时间进行升序排序  x:x[1]为依照到达时间进行排序
    pcb.sort(key = lambda x:x[1], reverse = False )
    #计算开始、完成时间
    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 = pcb[i - 1][4]
     
以下是先来先服务FCFS)和最短作业优先SJF)同时实现的代码: ```python class Process: def __init__(self, pid, arrival_time, burst_time): self.pid = pid self.arrival_time = arrival_time self.burst_time = burst_time def __lt__(self, other): return self.burst_time < other.burst_time def fcfs_sjf(processes): n = len(processes) burst_times = [process.burst_time for process in processes] waiting_times = [0] * n turnaround_times = [0] * n # Sort the processes by their arrival time processes.sort(key=lambda x: x.arrival_time) current_time = 0 queue = [] i = 0 while i < n or queue: if not queue: current_time = processes[i].arrival_time while i < n and processes[i].arrival_time <= current_time: queue.append(processes[i]) i += 1 queue.sort() process = queue.pop(0) waiting_times[process.pid] = current_time - process.arrival_time turnaround_times[process.pid] = waiting_times[process.pid] + process.burst_time current_time += process.burst_time avg_waiting_time = sum(waiting_times) / n avg_turnaround_time = sum(turnaround_times) / n print("FCFS-SJF Scheduling:") print("Avg Waiting Time: ", round(avg_waiting_time, 2)) print("Avg Turnaround Time: ", round(avg_turnaround_time, 2)) # Example usage processes = [Process(0, 0, 6), Process(1, 2, 4), Process(2, 4, 2), Process(3, 5, 1)] fcfs_sjf(processes) ``` 该代码中,Process 类表示一个进程,包含进程 ID,到达时间和运行时间。我们还实现了一个 FCFS-SJF 调度算法函数 fcfs_sjf,它同时考虑了先来先服务最短作业优先两个因素。在该函数中,我们首先按到达时间对进程进行排序,并将它们加入到队列中。然后,我们按照当前队列中剩余运行时间最短进程运行,直到所有进程都完成。最后,我们计算出平均等待时间和平均周转时间。 请注意,在该代码中,我们使用 Python 内置的 sort 函数来对队列中的进程按照剩余运行时间进行排序。为了使 sort 函数能够正常工作,我们在 Process 类中实现了 __lt__ 方法,该方法定义了进程之间的小于比较运算符,用于排序。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值