说“ Linux内核是抢占性的是什么意思?

问题描述 投票:29回答:9

我读到Linux内核是抢占式的,这与大多数Unix内核不同。那么,内核抢占到底意味着什么呢?

一些类比或例子将胜于纯理论解释。

ADD 1-11:00 AM 12/7/2018

Preemptive只是多任务处理的一种范例。还有其他类似Cooperative Multi-tasking的文件。通过比较它们可以更好地理解。

linux linux-kernel multitasking preemption
9个回答
21
投票

想象一下抢先式多任务的简单视图。我们有两个用户任务,它们都一直在运行,而没有使用任何I / O或执行内核调用。这两个任务不必执行任何特殊操作即可在多任务操作系统上运行。内核通常基于计时器中断,只是简单地确定是时候暂停一项任务,让另一项任务运行了。有问题的任务完全不知道有任何事情发生。

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

较旧的Linux内核永远无法在任务忙于运行内核代码时抢占该任务。 (请注意,I / O操作总是自愿重新安排。我说的是内核代码具有一些CPU密集型操作(例如对列表进行排序)的情况。)

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

例如,如果在特定的CPU上有两个任务可用,一个执行系统调用需要5毫秒才能完成,而另一个是MP3播放器应用程序,需要每2ms馈送音频管道,您可能会听到声音不连续。

反对抢占的论点是,可能在任务上下文中调用的所有内核代码都必须能够在抢占中幸存-例如,存在许多不良的设备驱动程序代码,如果始终能够完成任务,可能会更好。操作,然后再允许其他任务在该处理器上运行。 (如今,使用多处理器系统作为规则而不是例外,所有内核代码都必须是可重入的,因此该参数在今天已经不那么重要了。)此外,如果可以通过改善syscall来改善不良状况而达到相同的目标。延迟,也许不需要抢占。

妥协是CONFIG_PREEMPT_VOLUNTARY,它允许在内核内部的某些点(但不是在所有地方)进行任务切换。如果只有少数地方可能会使内核代码陷入困境,那么这是一种在保持复杂度可管理的同时减少延迟的廉价方法。


27
投票

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

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


7
投票

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

这使设计内核更加容易,因为您知道一个线程使用内核资源时没有其他线程。因此,不同的线程不会互相干扰。

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

但是在多处理器系统中,您可能会遇到不同处理器或内核上的多个线程都希望同时运行内核代码的情况。这意味着,根据工作负载的类型,您可能有很多处理器,但是所有处理器都会花费大部分时间互相等待。

在Linux 2.6中,内核资源被分成许多较小的单元,并由单个锁保护,并且对内核代码进行了检查,以确保仅在使用相应资源时才持有锁。因此,现在不同的处理器仅在要访问同一资源(例如硬件资源)时才需要互相等待。


5
投票

通过抢占,内核可以实现对并行性的印象:您只有一个处理器(比如说十年前),但是您感觉所有进程都在同时运行。这是因为内核会抢占(即从一个进程中删除执行)该进程的执行,然后将其交给下一个进程(可能是根据其优先级)。

EDIT不是抢占式内核会等待进程交出手(即,在系统调用期间),因此,如果您的进程计算大量数据并且不调用任何类型的yield函数,其他进程将无法执行以执行其调用。这样的系统据说是[[cooperative,因为它们要求流程的合作以确保执行时间的公平性

EDIT 2抢占的主要目标是提高系统在多个任务之间的反应性,这对于最终用户而言是一件好事,而另一方面,服务器希望获得最高的吞吐量,因此它们不需要它:(来自Linux内核配置)


3
投票
这意味着操作系统调度程序可以自由地暂停正在运行的进程的执行,以便在需要时将CPU分配给另一个进程;正常的做法是为等待CPU的每个进程分配一定数量的CPU时间。到期后,调度程序将收回控制权(正在运行的进程无法避免这种情况)将另一个范围分配给另一个进程。

[此方法通常与协作多任务处理相比,在协作多任务处理中,进程将CPU始终保持在需要的时间而不会被中断,并且要让其他应用程序运行,必须显式调用某种“ yield”函数;自然,为了避免给人以系统被卡住的感觉,行为良好的应用程序通常会占用CPU。不过,如果应用程序中存在错误(例如,没有产生yield调用的无限循环),则整个系统都将挂起,因为有问题的程序会完全保留CPU。

几乎所有最新的台式机操作系统都使用抢占式多任务处理,即使在资源方面更昂贵,但总体上还是更稳定的(一个错误的错误应用挂起整个系统更加困难,因为该操作系统始终处于控制之下)。另一方面,当资源紧张且预期应用程序运行良好时,将使用协作式多任务处理。 Windows 3是一个协作的多任务操作系统。最近的示例可以是RockBox,它是开源PMP固件的替代品。


2
投票
Linux内核是整体的,为顺序地所有正在运行的进程提供了很少的计算时间。这意味着进程(例如程序)不会并发运行,但是会定期给它们指定执行时间以执行其逻辑。主要问题是某些逻辑可能需要更长的时间才能终止,并阻止内核为下一个进程留出时间。这导致系统“滞后”。

抢占性内核具有switch context的能力。这意味着即使尚未完成,它也可以停止“挂起”的进程,并按预期的那样将计算时间分配给下一个进程。时间到了,“挂起”进程将继续执行,没有任何问题。

实际上,这意味着内核具有实时完成任务的能力,这对于音频记录和编辑特别有趣。

ubuntu studio districution打包了抢占式内核以及大量专门用于音频和视频版本的高质量免费软件。


1
投票
我认为每个人都很好地解释了这一点,但我只想补充一点点信息。在Linux IRQ,中断和内核调度程序的上下文中。

进程调度程序是操作系统的组件,负责决定当前正在运行的作业/进程是否应该继续运行,如果不继续,则哪个进程应该继续运行。

抢先式调度程序是一个调度程序,它可以被中断,正在运行的进程可以更改其状态,然后让另一个进程运行(因为当前进程被中断)。

另一方面,

non-preemptive

调度程序无法将CPU从进程中夺走(又名合作社)FYI,名称“ cooperative”可能会引起混淆,因为该词的含义不能清楚地表明调度程序实际上是做什么的。例如,像3.1这样的旧Windows具有协作调度程序。

致谢article here的功劳,>


0
投票
我认为它从2.6开始抢占了先机。抢占式表示新进程准备运行时,cpu将分配给新进程,不需要正在运行的进程相互配合并放弃cpu。

0
投票
Linux内核是抢占式,意味着内核支持抢占。
© www.soinside.com 2019 - 2024. All rights reserved.