【操作系统】FCFS、SJF、HRRN、RR、EDF、LLF调度算法及python实现代码

文章目录

一、先来先服务调度算法(FCFS)

二、短作业优先调度算法(SJF)

三、高响应比优先调度算法(HRRN)

四、轮转调度算法(RR)

五、最早截至时间优先算法(EDF)

六、最低松弛度优先算法(LLF)

相关时间计算
周转时间 = 作业完成时刻 - 作业到达时刻
等待时间 = 周转时间 - 运行时间
带权周转时间 = 周转时间 / 服务时间
平均周转时间 = 作业周转时间之和 / 作业个数
平均带权周转时间 = 带权周转时间之和 / 作业个数
服务时间:作业的运行时间

一、先来先服务调度算法(FCFS)

如果早就绪的进程排在就绪队列的前面,迟就绪的进程排在就绪队列的后面,那么先来先服务(FCFS: first come first service)总是把当前处于就绪队列之首的那个进程调度到运行状态。也就说,它只考虑进程进入就绪队列的先后,而不考虑它的下一个CPU周期的长短及其他因素。

先来先服务的调度算法是最简单的调度算法,既可以用于作业调度 ,也可以用于程序调度,当作业调度中采用该算法时,系统将按照作业到达的先后次序来进行调度,优先从后备队列中,选择一个或多个位于队列头部的作业,把他们调入内存,分配所需资源、创建进程,然后放入“就绪队列”,直到该进程运行到完成或发生某事件堵塞后,进程调度程序才将处理机分配给其他进程。

实现代码:

avg_turnaround_time = 0.0
aqtt = 0.0

class Progress:
    def __init__(self):
        self.pro_name = ""
        self.arrive_time = 0
        self.service_time = 0
        self.finish_time = 0
        self.cycling_time = 0
        self.float_wi = 0.0

courses = [Progress() for _ in range(80)]

def health_examine(course_num):
    return

def progress_num(course_num):
    i = 0
    for i in range(course_num):
        print("Enter information for process %d" % (i + 1))
        courses[i].pro_name = input("Enter process name: ") #进程名
        courses[i].arrive_time = int(input("Enter arrival time: ")) #到达时间
        courses[i].service_time = int(input("Enter service time: ")) #服务时间
    return

def finish_time(course_num):
    i = 0
    if courses[0].arrive_time != 0:
        courses[0].finish_time = courses[0].arrive_time + courses[0].service_time
    courses[0].finish_time = courses[0].service_time
    for i in range(1, course_num):
        if courses[i - 1].finish_time >= courses[i].arrive_time:
            courses[i].finish_time = courses[i - 1].finish_time + courses[i].service_time
        else:
            courses[i].finish_time = courses[i].arrive_time + courses[i].service_time
    return

def cycling_time(course_num): #周转时间
    for i in range(course_num):
        courses[i].cycling_time = courses[i].finish_time - courses[i].arrive_time
    return

def float_wi(course_num): #带权周转时间
    for i in range(course_num):
        courses[i].float_wi = float(courses[i].cycling_time) / courses[i].service_time
    return

def avg_turnaround_time(course_num): #平均周转时间
    sum_turnaround_time = 0
    for i in range(course_num):
        sum_turnaround_time += courses[i].cycling_time
    global avg_turnaround_time
    avg_turnaround_time = sum_turnaround_time / course_num
    return

def aqtt(course_num): #平均带权周转时间
    sum_float_wi = 0
    for i in range(course_num):
        sum_float_wi += courses[i].float_wi
    global aqtt
    aqtt = sum_float_wi / course_num
    return

def print_fifo(course_num):
    print("Process information:")
    print("Process\tArrival Time\tService Time\tFinish Time\tTurnaround Time\tWeighted Turnaround")
    for i in range(course_num):
        print("%s\t%d\t%d\t%d\t%d\t%.2f" % (courses[i].pro_name, courses[i].arrive_time, courses[i].service_time, courses[i].finish_time, courses[i].cycling_time, courses[i].float_wi))
    print("Average Turnaround Time\tAverage Weighted Turnaround Time")
    print("%.2f\t%.2f" % (avg_turnaround_time, aqtt))
    return

def main():
    course_num = 5
    course_num = int(input("Enter the number of processes: "))
    progress_num(course_num)
    finish_time(course_num)
    cycling_time(course_num)
    float_wi(course_num)
    avg_turnaround_time(course_num)
    aqtt(course_num)
    print_fifo(course_num)

if __name__ == "__main__":
    main()

输出信息:

Enter the number of processes: 3
Enter information for process 1
Enter process name: p1
Enter arrival time: 0
Enter service time: 5
Enter information for process 2
Enter process name: p2
Enter arrival time: 2
Enter service time: 1
Enter information for process 3
Enter process name: p3
Enter arrival time: 3
Enter service time: 4
Process information:
Process	Arrival Time	Service Time	Finish Time	Turnaround Time	Weighted Turnaround
p1	0	5	5	5
### 操作系统的处理器调度算法 #### SJF (Shortest Job First) 算法 最短作业优先(SJF)是一种批处理系统中常见的调度策略,旨在最小化平均等待时间。此算法会先选择预计运行时间最短的进程来执行。然而,在实际应用中预测下一个CPU爆发的时间并不总是可行。 #### 优先级调度算法 通过给每个进程赋予一个优先级数值,操作系统会选择具有最高优先级(通常是最小数代表最高优先级)的进程进行调度[^1]。这种机制可以是非抢占式的也可以是抢占式的;后者允许更高优先级的新到来者打断当前较低优先级正在运行的任务[^2]。 #### 高响应比优先(HRRN) 为了克服简单FCFS可能导致饥饿问题以及SJF可能带来的不公平性,提出了高响应比优先的概念。它计算每一个待处理请求相对于其他请求的重要性程度,并据此决定谁应该被选作下一个被执行的对象。 #### 多级反馈队列(Multilevel Feedback Queue) 这是一种复杂但高效的调度方法,适用于多种类型的负载环境。多个不同级别的队列按照一定规则排列在一起形成一个多层结构。新创建或准备好的进程会被放入最低级别队列中排队等候服务;一旦完成一次完整的扫描而未结束,则提升到更高级别的队列继续竞争CPU资源直到最终得到满足为止。 #### 时间片轮转(Round Robin, RR) 对于交互式或多用户环境中广泛使用的分时系统而言,RR是一个非常合适的选择。这里设定了固定长度的时间片段——称为“量子”,每当一个程序获得了它的份额之后就会被迫让位给下一个候选者,从而实现公平共享硬件设施的目的。 #### EDF (Earliest Deadline First) 和 LLF (Least Laxity First) 这两种都是针对实时应用场景设计出来的特别有效的方案。前者依据绝对期限最早的原则挑选下一个要激活的目标;后者则是考虑剩余松弛度最少的那个作为优选对象,以此确保关键任务能够在规定时间内顺利完成。 ```python def round_robin(processes, time_quantum): queue = processes.copy() while queue: process = queue.pop(0) if process['remaining_time'] > time_quantum: process['remaining_time'] -= time_quantum queue.append(process) else: print(f"Process {process['id']} completed.") ```
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值