什么是抢占/什么是可抢占内核?它有什么好处?

67

请用自己的话解释一下什么是抢占,并且它对于(Linux)内核意味着什么?

有可抢占内核的优缺点是什么?


37
为什么会有人点踩并且说这是“作业”?其实这不是作业。事实上,像我这样对这个问题感兴趣但是不理解常见的维基百科文章的人是存在的。 - Markus
3
预占(Preemption)是计算机操作系统中的一种机制,它允许操作系统在当前进程没有完成之前暂停该进程并开始执行另一个优先级更高的进程。预占可以通过硬件或软件实现,通常用于多任务处理,以确保最紧急或最重要的任务得到优先处理。 - Oli
5个回答

79

抢占式多任务处理 - 在单个处理器上运行多个进程/线程,创造出它们同时运行的假象,实际上每个进程被分配小的时间片来运行。当一个进程等待下一个时间片时,它就会被“抢占”。

抢占式内核是指可以在执行代码中被中断的内核,例如响应系统调用,以执行其他任务并运行其他线程,可能不在内核内部。

抢占式内核的主要优点是系统调用不会阻塞整个系统。如果系统调用需要很长时间才能完成,则这并不意味着内核在此期间不能执行任何其他操作。 其主要缺点是,这会给内核代码带来更多复杂性,需要处理更多边缘情况,执行更细粒度的锁定或使用无锁结构和算法。


10
这就是为什么当文件系统出问题时,特别是网络文件系统时,你可能会发现有一个无法被终止的进程。它一直在等待系统调用来读取文件系统返回,但它永远不会返回,并且无法被中断。 - Schwern

17

你应该真正使用“抢占式”这个术语。有不同种类的抢占。本质上,它非常简单,而且你可能已经用另一个名称理解了它。一个抢占式操作系统可以在被抢占的应用程序中没有任何特殊编程的情况下,在用户模式线程之间切换上下文。这允许多任务处理。操作系统可以切换到一个进程并返回,这种切换基本上是透明的。还有一种抢占式内核,允许抢占内核模式线程(大多数操作系统不允许这样做,但在某些应用程序中需要,例如实时系统)。注意,这是一个非常简化的解释。


1
我知道,你的贡献是一段时间之前做出的,但无论如何,让我问你一个问题。为什么你更喜欢“preemtive”这个术语而不是“preemptible”?特别是对于内核配置,使用后者可能更直观一些。 - Paul Kertscher
关于内核抢占发生的时间:这个问题(https://dev59.com/PWIi5IYBdhLWcg3w9wYU)展示了内核线程可以被抢占的情况。 - Chan Kim

11

我认为这个帖子可以解答你的问题:

什么是抢占?

操作系统抢占或停止当前的进程,转而执行优先级更高的进程。调度可以是进程、I/O调度等,但不限于此。

什么是抢占内核?

在Linux下,用户空间程序一直是可抢占的:内核会中断用户空间程序并切换到其他线程,使用常规时钟滴答声。因此,内核不会等待用户空间程序显式释放处理器(这在协作式多任务处理中是情况)。这意味着,用户空间程序中的无限循环不能阻塞系统。

然而,在2.6内核之前,内核本身不可抢占:一旦一个线程进入内核,它就不能被抢占以执行另一个线程。当系统调用终止或当前线程显式要求调度程序运行另一个线程时,可以使用处理器来执行另一个线程。这意味着,内核代码中的无限循环会阻塞整个系统,但这并不是真正的问题:内核代码被设计成没有无限循环。

内核抢占已经在2.6内核中引入,可以使用CONFIG_PREEMPT选项启用或禁用它。如果启用了CONFIG_PREEMPT,则内核代码可以在任何地方被抢占,除非代码已禁用本地中断。代码中的无限循环不再能够阻塞整个系统。如果禁用了CONFIG_PREEMPT,则恢复2.4的行为。

优缺点?

优点:抢占内核可以改善延迟和可扩展性,并使高优先级任务及时运行和响应。

缺点:在抢占内核中编写代码很困难,特别是在SMP中,必须考虑许多因素。


9

其他人已经充分解释了什么是可抢占内核。

它有什么好处?

主要好处包括:

  • 在非SMP系统上降低延迟 - 通常用于实时系统或其他对延迟很重要的应用程序(例如音频、视频应用程序)
  • 教授没有SMP系统的内核开发人员如何编写正确的SMP代码

使用不可抢占内核,在单处理器系统上,内核开发人员可能会变得懒惰,并且大部分时间都可以不加锁定地运行 - 当然,在SMP上这是一个巨大的失败。可抢占内核允许他们在没有更多核心的情况下避免这种痛苦。


4

抢占意味着操作系统支持多个任务(一个独立的、独立的代码片段),并且会按计划在任务之间进行切换。当一个任务被中断时,它被称为“抢占”。现代操作系统都支持这一点,但对于简单的嵌入式系统来说并非必需。支持任务切换所需的开销并不总是值得的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接