进程调度以及丰富的调度算法,这些您都get到了嘛

进程调度

进程调度的时机

当前运行的进程主动放弃处理机

  1. 进程正常终止
  2. 运行过程中发生异常而终止
  3. 进程主动请求阻塞

当前运行的进程被动放弃处理机 4. 分给进程的时间片用完

  1. 有更紧急的事情要处理(例如等待I/O中断)
  2. 有更高优先级的进程进入就绪队列

进程调度的方式

非剥夺调度方式,又称非抢占方式。即,只允许进程主动放弃处理机 。在运行过程中即便有更紧迫的任务到达,当前进程依然会继续使用处理机,直到该进程终止或主动要求进入阻塞态。 剥夺调度方式,又称抢占方式。当一个进程正在处理机上执行时,如果有一个更重要或更紧迫的进程需要使用处理机,则立即暂停正在执行的进程,将处理机分配给更重要紧迫的那个进程

进程的调度和切换是有代价的,并不是调度越频繁,并发度越高

进程调度的算法

先来先服务算法(FCFS)

先来先服务算法(First Come First Serve)顾名思义,此算法就体现了"先来后到 "的思想,主要从"公平 "的角度考虑,按照作业/进程到达的先后顺序进行服务 优点:公平,算法实现简单 缺点:排在长进程(作业)后面的短进程(作业)需要等待很长的时间,对短进程不友好,对长进程友好。 例如疫情期间,某超市一次只允许一个人进入超市,而排在你前面的那个人买了很多东西,长时间不出来,而你只想买一个东西,因此对于你来说是很不方便的 进程长期得不到服务不会导致饥饿(饥饿是指进程长时间得不到服务)

短作业优先算法(SJF)

短作业/进程优先算法(Short Job First),就是每次调度时选择已经到达并且估计服务时间最短的一个或多个作业/进程。 可以是非抢占式的算法,也可以是抢占式的算法 优点:平均等待时间,平均周转时间最短 缺点:不公平,对短作业/进程有利,对长作业不利。 会产生饥饿现象,如果有源源不断的短作业/进程到达,可能会使长作业长时间得不到服务,产生饥饿现象,如果一直得不到,就称长作业"饿死"。

高响应比优先算法(HRRN)

高响应比,就是综合考虑作业/进程的等待时间和要求服务的时间,在每次调度前,先计算各个作业的响应比,选择响应比最高的作业先服务 响应比=(等待时间+要求服务时间)/要求服务时间 高响应比优先算法是非抢占式的算法,因此只有当当前运行的作业主动放弃处理机时,才需要调度。 优缺点:综合考虑了等待时间和运行时间(要求服务时间)等待时间相同时,要求服务时间短的优先(SJF的优点)要求服务时间相同时,等待时间长的优先(FCFS的优点)对于长作业来说,随着等待时间越来越久,其响应比也会越来越大,从而避免了长作业饥饿的问题 并且该算法不会导致饥饿现象

时间片轮转调度算法(RR)

按照各进程到达就绪队列的顺序,轮流让各个进程执行一个时间片(如100ms)。若进程未在一个时间片内执行完,则剥夺处理机,将进程重新放到就绪队列队尾重新排队。 若进程未能在时间片内运行完,将被强行剥夺处理机使用权,因此时间片轮转调度算法属于抢占式的算法。由时钟装置发出时钟中断来通知CPU时间片已到 思想:公平 地、轮流地为各个进程服务,让每个进程在一定时间间隔内都可以得到响应 优点:公平;响应快,适用于分时操作系统; 缺点:由于高频率的进程切换,因此有一定开销不区分任务的紧急程度。 不会导致饥饿现象

优先级调度算法

调度时选择优先级最高的作业/进程 思想:根据任务的紧急程度来决定处理次序 抢占式、非抢占式都有。做题时的区别在于:非抢占式只需在进程主动放弃处理机时进行调度即可,而抢占式还需在就绪队列变化时,检查是否会发生抢占。 优点:用优先级区分紧急程度、重要程度,适用于实时操作系统。可灵活地调整对各种作业/进程的偏好程度。 缺点:若源源不断地有高优先级进程到来,则可能导致饥饿 会导致饥饿

多级反馈队列调度算法

对其它调度算法的折中权衡 1.设置多级就绪队列,各级队列优先级从高到低,时间片从小到大 2.新进程到达时先进入第1级队列,按FCFS原则排队等待被分配时间片,若用完时间片进程还未结束,则进程进入下一级队列队尾。如果此时已经是在最下级的队列,则重新放回该队列队尾

  1. 只有第k级队列为空时,才会为k+1级队头的进程分配时间片度 用于进程调度 抢占式的算法 对各类型进程相对公平(FCFS的优点);每个新到达的进程都可以很快就得到响应(RR的优点);短进程只用较少的时间就可完成(SPF的优点);不必实现估计进程的运行时间(避免用户作假);可灵活地调整对各类进程的偏好程度,比如CPU密集型进程、I/O密集型进程(拓展:可以将因I/O而阻塞的进程重新放回原队列,这样1/O型进程就可以保持较高优先级) 会导致饥饿现象
相关推荐
Easonmax16 小时前
用 Rust 打造可复现的 ASCII 艺术渲染器:从像素到字符的完整工程实践
开发语言·后端·rust
百锦再16 小时前
选择Rust的理由:从内存管理到抛弃抽象
android·java·开发语言·后端·python·rust·go
小羊失眠啦.16 小时前
深入解析Rust的所有权系统:告别空指针和数据竞争
开发语言·后端·rust
q***718517 小时前
Spring Boot 集成 MyBatis 全面讲解
spring boot·后端·mybatis
大象席地抽烟17 小时前
使用 Ollama 本地模型与 Spring AI Alibaba
后端
程序员小假17 小时前
SQL 语句左连接右连接内连接如何使用,区别是什么?
java·后端
小坏讲微服务17 小时前
Spring Cloud Alibaba Gateway 集成 Redis 限流的完整配置
数据库·redis·分布式·后端·spring cloud·架构·gateway
方圆想当图灵18 小时前
Nacos 源码深度畅游:Nacos 配置同步详解(下)
分布式·后端·github
方圆想当图灵18 小时前
Nacos 源码深度畅游:Nacos 配置同步详解(上)
分布式·后端·github
小羊失眠啦.18 小时前
用 Rust 实现高性能并发下载器:从原理到实战
开发语言·后端·rust