说“linux内核抢先”是什么意思?

我读过Linux内核是抢先式的,这与大多数Unix内核不同。 那么,一个内核是否具有先发制人意味着什么呢?

有些比喻或例子比纯粹的理论解释更好。

Solutions Collecting From Web of "说“linux内核抢先”是什么意思?"

在Linux内核版本2.5.4之前,Linux内核不是抢先式的,这意味着在内核模式下运行的进程不能被移出处理器,直到它本身离开处理器,或者它开始等待一些输入输出操作完成。

通常,用户模式下的进程可以使用系统调用进入内核模式。 以前,当内核是非抢占式时,较低优先级的进程可以通过拒绝重复调用系统调用并保持在内核模式而拒绝访问处理器来优先级更高的优先级进程。 即使较低优先级进程的时间片过期,也会继续运行,直到完成其在内核中的工作或自愿放弃控制。 如果等待运行的优先级较高的进程是用户正在打字的文本编辑器或准备好重新填充其音频缓冲区的MP3播放器,则结果是交互性能差。 这种方式非抢先的内核是当时的主要缺点。

想象一下抢先式多任务的简单视图。 我们有两个用户任务,这两个任务都在运行,而不使用任何I / O或执行内核调用。 这两个任务不必做任何特殊的事情就可以在多任务操作系统上运行。 内核,通常基于定时器中断,只是决定是一个任务暂停,让另一个运行的时间。 有关的任务完全不知道发生了什么事。

但是,大多数任务通过系统调用偶尔请求内核。 发生这种情况时,存在相同的用户上下文,但CPU正在代表该任务运行内核代码。

较早的Linux内核在运行内核代码时不会允许抢占任务。 (请注意I / O操作总是自动重新计划,我说的是内核代码有一些CPU密集型操作(如排序列表)。

如果系统在运行内核代码时允许该任务被抢占那么我们就有所谓的“抢占式内核”。 这样的系统不受在系统调用期间可能遇到的不可预知的延迟的影响,所以它可能更适合于嵌入或实时任务。

例如,如果在一个特定的CPU上有两个任务可用,一个系统调用需要5ms完成,另一个是需要每2ms馈送音频管道的MP3播放器应用程序,则可能会听到口吃音频。

反对抢占的观点是,在任务上下文中可能调用的所有内核代码必须能够抢占 – 例如,有很多糟糕的设备驱动程序代码,如果它总是能够在之前完成一个操作允许其他任务在该处理器上运行。 (现在使用多处理器系统的规则而不是例外,所有的内核代码都必须是可重入的,所以这个论点现在不是那么相关)。另外,如果通过改善系统调用延迟,也许抢占是不必要的。

妥协是CONFIG_PREEMPT_VOLUNTARY,它允许在内核中的某些点进行任务切换,但不是在任何地方。 如果只有少数几个内核代码可能陷入困境的地方,这是减少延迟的廉价方法,同时保持复杂性的可管理性。

传统的unix内核只有一个锁,在内核代码运行时由一个线程保存。 因此没有其他内核代码可以中断该线程。

这使得设计内核变得更容易,因为您知道一个线程使用内核资源,而另一个线程不是。 所以不同的线程不能搞乱彼此的工作。

在单处理器系统中,这不会造成太多问题。

但是在多处理器系统中,可能会出现这样的情况:不同处理器或内核上的多个线程都想同时运行内核代码。 这意味着根据工作负载的类型,可以有很多处理器,但是他们大部分时间都在等待对方。

在Linux 2.6中,内核资源被分成小得多的单元,受到单个锁的保护,并检查内核代码,以确保仅在相应的资源被使用时保持锁。 所以现在不同的处理器只需要等待对方,如果他们想访问相同的资源(例如硬件资源)。

抢占允许内核给出并行性的印象:你只有一个处理器(比如十年前),但是你觉得所有的进程都是同步运行的。 这是因为内核抢占(即执行)从一个进程执行到下一个(可能根据他们的优先级)。

编辑不抢先的内核等待进程返回手 (即在系统调用期间),所以如果你的进程计算了大量的数据,并没有调用任何种类的yield函数,其他进程将无法执行到执行他们的电话。 据说这样的系统是合作的,因为他们要求过程的合作来确保执行时间的公平性

编辑2抢占的主要目标是提高系统在多个任务之间的反应性,这对于最终用户是有好处的,而另一方面,服务器想要达到最高的吞吐量,所以他们不需要它: (从Linux内核配置)

  • 可抢占内核 (低延迟桌面)
  • 自愿内核抢占 (桌面)
  • 没有强制抢占 (服务器)

这意味着操作系统调度程序可以自由地暂停正在运行的进程的执行,以便在需要时让CPU进入另一个进程。 正常的做法是给每个正在等待CPU运行CPU时间“量子”的进程。 在过期之后,调度器取回控制权(并且运行过程不能避免这种情况)将另一个量子给另一个过程。

这种方法通常与协作式多任务相比较,在这种多任务中,进程始终保持CPU所需的时间,而不会中断,为了让其他应用程序运行,他们必须显式地调用某种“yield”函数。 自然,为了避免给系统卡住的感觉,乖巧的应用程序会经常产生CPU。 但是,如果应用程序中存在一个错误(例如,没有良率调用的无限循环),则整个系统将挂起,因为CPU完全由有故障的程序保存。

几乎所有最近的桌面操作系统都使用抢先式多任务处理,即使资源成本更高,通常也更稳定(因为操作系统始终处于控制状态,单个错误的应用程序更难以挂起整个系统)。 另一方面,当资源紧张,应用程序预期行为良好时,使用协作式多任务处理。 Windows 3是一个合作的多任务操作系统; 一个更新的例子可以是RockBox,一个开源的PMP固件替代品。

linux内核是单片的,并且对所有正在运行的进程依次给予一点计算时间。 这意味着进程(例如程序)不能同时运行,但是它们会被定期执行逻辑。 主要的问题是,一些逻辑可能需要更长的时间来终止并阻止内核为下一个进程提供时间。 这导致系统“滞后”。

先行内核有切换上下文的能力。 这意味着即使没有完成,也可以停止“挂起”过程,并按照预期将计算时间给予下一个过程。 这个“悬挂”过程将会在没有任何问题的情况下继续执行。

实际上,这意味着内核有能力实时执行任务,这对录音和编辑特别有用。

ubuntu studio districution封装了一个抢先式的内核以及一批专门用于音频和视频版的免费软件。

我认为它从2.6开始抢占先机。 先发制人意味着当一个新进程准备运行时,cpu将被分配给新进程,不需要运行进程合作而放弃cpu。

Linux内核抢占意味着内核支持抢占。

例如,有两个进程读取系统调用的进程P1(较高优先级)和P2(较低优先级),它们以内核模式运行。 假设P2正在运行并处于内核模式,并且P2计划运行。

如果内核抢占可用,那么可以在内核级别发生抢占,即P2可以被抢占,但是进入休眠状态,P1可以继续运行。

如果内核抢占不可用,由于P2处于内核模式,所以系统等待直到P2完成