Linux进程之调度器

1. Linux调度器的原理

Linux调度器(Linux Scheduler)负责管理这一进程在CPU上运行时的资源分配。它根据选定策略和所估算的进程行为,考量各种因素的权重,对等待在运行队列的进程按优先级排列,从而决定哪个进程能够接下来获得CPU时间。

Linux的调度器可以使用不同的调度策略,有两个主要的类型是:抢占式(preemptive)和非抢占式(non-preemptive)。

  • 抢占式调度器:允许正在运行的进程在它完成任务之前被中断,从而使其他进程有机会使用CPU资源。这常用于希望响应实时交互的环境,例如桌面系统或游戏。

  • 非抢占式调度器:一旦进程占有CPU,它将保持运行状态,直至它结束本次CPU周期,除非它被阻塞等待一个事件(如I/O操作)。这种策略常运用于批处理环境,如数据分析或科学计算。

自从 Linux 2.6.23 版本引入以来,Linux 默认使用的是完全公平调度器(CFS,Completely Fair Scheduler)。基于虚拟运行时间,CFS适应抢占式任务调度,试图为每一个运行的任务平等分配CPU时间。

CFS主要通过以下两种方式确保公平性:

  1. CFS使用"红黑树"(Red-Black Tree)数据结构保存待运行的任务,该数据结构能够在O(log n)时间复杂度内插入、删除和查找元素。每个进程都分配有一个虚拟运行时间,表示其获得的CPU时间。CFS调度器总是选取虚拟运行时间最小的任务来执行。

  2. 跟踪每个任务的虚拟运行时间改变,使之与"运行时间"保持一致,其中,运行时间是任务在过去一段时间内占CPU的实际时间。虚拟运行时间以不同速率增长,取决于任务优先级。优先级较高(nice值小)的任务将看到他们的虚拟运行时间以较快的速率增长。

虽然有许多其他因素(如处理器亲和性、实时优先级等)会影响具体的调度决策,但CFS的基本原则是确保所有进程都能得到公平的CPU时间分配。

2. Linux中有哪些调度器类,各自调度策略是什么

在 Linux 中,有几种主要的调度器类,他们分别为不同类型的任务提供了不同的调度策略:

  • 完全公平调度器(Completely Fair Scheduler,CFS):CFS 是用于普通进程的默认调度器。它使用一种称为公平队列(Fair Queuing)的算法,以保证所有进程能得到公平的 CPU 时间。CFS 被 SCHED_NORMALSCHED_BATCH 策略使用。

  • 实时调度器(Real-time Scheduler):Linux 内核支持两种实时调度策略:SCHED_FIFOSCHED_RR。实时调度器确保实时任务得到及时的调度,优先级靠前的任务总是先于优先级靠后的任务运行。

  • Deadline 调度器(SCHED_DEADLINE):这是 Linux 中较新的调度器,它为任务提供了更强的实时性保证。每个任务都需要指定它的运行周期和运行时间,调度器会确保在每个运行周期内,任务都能在指定的运行时间内完成。

  • 空闲调度器(Idle Task Scheduler,SCHED_IDLE):用于非常低优先级的任务,只在系统闲置,无其他任务执行时,才会运行这类任务。

根据具体的应用需求和场景,开发者可以选择最适合的调度策略,以满足他们的性能和响应时间需求。例如,实时任务,比如音频处理或者医疗设备通常会使用实时调度策略;而 CPU 密集型的后台任务则可能会选择 SCHED_BATCH 策略。

3. Linux中各个调度器类的执行优先级

Linux 系统中的各个调度器类的执行优先级主要取决于它们所使用的策略类型。在大多数情况下,实时进程具有最高的优先级,然后是常规进程,最后是空闲进程。

以下是具体的优先级分类:

  • 实时调度策略(SCHED_FIFOSCHED_RRSCHED_DEADLINE 的任务具有最高优先级。这是因为这些任务通常是时间敏感的,并且需要预测性的响应时间。如果系统中有实时任务在等待运行,那么它们将优先于其他所有类型的任务执行。

  • 常规调度策略 (SCHED_NORMALSCHED_BATCH 的任务优先级次于实时任务。这些任务使用完全公平调度器(CFS),它为每个任务分配公平和均匀的 CPU 时间,但会在有实时任务时让出 CPU。

  • SCHED_IDLE(Idle Task Scheduler) 策略任务的优先级最低,只在没有其他任务时才会运行。

需要注意的是,每种策略中的任务也会根据其优先级进行排序。例如,在实时任务中,具有较高优先级的任务会先于具有较低优先级的任务运行。而在常规任务中,虚拟运行时间(vruntime)最少的进程会被优先运行。 所以总的来说,调度器类的执行优先级主要由它们所使用的策略类型决定。

4. 在完全公平调度器中,进程是如何在就绪队列中排序的

在 Linux 的完全公平调度器(Completely Fair Scheduler,CFS)中,进程在就绪队列中的排序是根据它们的虚拟运行时间(vruntime)排序的。红黑树(红黑树是一种不能有重复节点的二叉查找树,能通过颜色和旋转操作来保证树的平衡)这种数据结构被用来存储和管理就绪队列。

基本的设想是,当进程变为就绪状态时,它将被插入到红黑树中,位置取决于它的虚拟运行时间:虚拟运行时间最小的进程被放在树的最左边,虚拟运行时间最大的进程被放在树的最右边。

调度器每次都选择红黑树最左边的节点(也就是虚拟运行时间最小的进程)来运行。当一个正在运行的进程用完其 CPU 时间片或者被阻塞时,它将从红黑树中移除,调度器再次选择虚拟运行时间最小的进程来运行。

如果有新的进程进入就绪状态,或者一个被阻塞的进程重新变为就绪状态,那么它们将根据它们的虚拟运行时间在红黑树中找到合适的位置插入。重新计算虚拟运行时间后,有可能造成原本正在运行的进程的虚拟运行时间不再是最小,这时就需要进行上下文切换。

通过这种基于虚拟运行时间的排序机制,CFS 能够保证所有进程都公平地获取 CPU 时间,同时还能考虑到进程的优先级。

5. 进程的虚拟运行时间是如何计算的

在 Linux 的完全公平调度器(Completely Fair Scheduler,CFS)中,进程的虚拟运行时间(vruntime&#x

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值