进程调度CPU调度
CFS
定义与作用:CFS 是 Linux 内核中用于进程调度的一种调度器,它的主要目标是公平地分配 CPU 时间给各个进程。这意味着在多任务环境下,每个进程都能根据其优先级和对 CPU 的需求,合理地获得 CPU 资源,从而避免某个进程长时间占用 CPU 而导致其他进程 “饥饿” 的情况。
设计理念:CFS 基于公平性原则,它不像一些早期的调度器那样按照固定的时间片来分配 CPU,而是采用了一种虚拟运行时间(virtual runtime)的概念。简单来说,每个进程都有一个虚拟运行时间,CFS 会根据这个虚拟运行时间来决定下一个应该运行的进程,使得所有进程在一段时间内获得的 CPU 时间大致相同。
RT 实时调度
分类与应用场景:
SCHED_FIFO(先进先出实时调度):这是一种简单的实时调度策略。按照进程进入就绪队列的顺序来分配 CPU,一旦一个高优先级的实时进程开始运行,它将一直运行直到结束、阻塞或者被更高优先级的实时进程抢占。主要用于对延迟要求极高的硬实时任务,如工业控制中的某些紧急控制任务、航空航天中的关键飞行控制系统等。
SCHED_RR(时间片轮转实时调度):类似于 SCHED_FIFO,但增加了时间片的概念。每个实时进程在获得 CPU 后会运行一个固定的时间片,时间片用完后,将 CPU 让给同优先级的下一个实时进程。这种调度策略适用于对实时性要求较高且需要公平共享 CPU 的软实时任务,如多媒体播放系统中的音频和视频处理任务,需要在一定时间内完成处理,同时也需要相对公平的资源分配。
BFS
设计理念与目标:BFS 是为了解决 Linux 在高负载和多核心环境下的调度性能问题而设计的。它的目标是减少调度延迟,提高系统的响应速度,尤其是在处理大量线程的复杂场景下。
工作方式的创新点:BFS 采用了一种不同的调度层次结构和队列管理方式。它将所有的线程组织在一个单一的运行队列中,通过一种快速的调度算法来选择下一个要运行的线程。这种方式与传统的调度器(如 CFS)将线程分散在多个队列中的方式不同,能够更有效地利用多核资源,减少线程在队列之间的迁移和等待时间。不过,BFS 目前没有被广泛应用于主流 Linux 发行版,仍处于研究和实验阶段。