什么是抢占/什么是可抢占内核?到底有什么好处呢?

Posted

技术标签:

【中文标题】什么是抢占/什么是可抢占内核?到底有什么好处呢?【英文标题】:What is preemption / What is a preemtible kernel? What is it good for? 【发布时间】:2010-10-23 10:56:49 【问题描述】:

用你自己的话解释一下,什么是抢占,它对(linux)内核意味着什么?

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

【问题讨论】:

为什么要投反对票以及为什么要“做作业”?这不是家庭作业。其实也有人像我一样对这样的问题感兴趣,不理解***的常见文章。 en.wikipedia.org/wiki/Preemption_(computing) 【参考方案1】:

抢占式多任务 - 在单个处理器上运行多个进程/线程,当实际上每个都被分配了小的多路复用时间片来运行时,创造了它们同时运行的错觉。当一个进程被调度为不执行时,它被“抢占”并且等待下一个时间片运行。

抢占式内核是可以在执行代码(例如响应系统调用)的过程中被中断的内核,以执行其他操作并运行其他线程,可能是那些不在内核中的线程。

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

【讨论】:

这就是为什么当文件系统出现问题时,尤其是网络文件系统,您可能会发现自己的进程无法被杀死。它坐在那里等待系统调用以读取文件系统返回,但它永远不会也不会被中断。【参考方案2】:

您确实应该使用“抢占式”一词。有不同种类的抢占。本质上,它非常简单,您可能会用另一个名字来理解它。抢占式操作系统可以在用户模式线程之间切换上下文,而无需在抢占式应用程序中进行任何特殊编程。这允许多任务处理。操作系统可以切换回一个进程,这种切换本质上是透明的。还有诸如抢占式内核之类的东西,它允许抢占内核模式线程(大多数操作系统不允许这样做,但某些应用程序(例如实时系统)需要这样做)。请注意,这是一个非常简单的解释。

【讨论】:

我知道,您的贡献是不久前做出的,但无论如何,让我问您一个问题。为什么你更喜欢“抢占式”这个词而不是“可抢占式”?尤其是内核配置使用后者可能会更直观一点。 关于何时发生内核抢占:这个 (***.com/questions/20769768/…) 问题显示了内核线程可以被抢占的情况。【参考方案3】:

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

它有什么好处?

主要的好处是:

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

对于非抢占式内核,在单处理器系统上,内核开发人员可能会很懒惰,并且大部分时间没有任何锁定就可以逃脱 - 当然,这在 SMP 上是一个很大的失败。可抢占式内核让他们无需更多内核即可获得这种痛苦。

【讨论】:

【参考方案4】:

我认为post 解释了你的问题:

什么是抢占?

操作系统抢占或停止当前计划任务以支持更高优先级任务的能力。调度可以是但不限于进程或I/O调度等之一。

什么是抢占内核?

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

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

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

优点和缺点?

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

缺点:在抢占内核中写代码很困难,尤其是在 SMP 中,你必须考虑很多因素。

【讨论】:

这是我一直在寻找的答案。我认为您的答案应该放在首位,以便更多人可以从中受益。【参考方案5】:

抢占意味着操作系统支持多个任务(一个单独的、独立的代码段),并将按计划在任务之间切换。当一个任务被中断时,它被称为“抢占”。现代操作系统支持这一点——但例如,简单的嵌入式系统不需要它。支持任务切换的开销并不总是值得的。

【讨论】:

以上是关于什么是抢占/什么是可抢占内核?到底有什么好处呢?的主要内容,如果未能解决你的问题,请参考以下文章

为啥“barrier()”足以禁用或启用抢占?

Linux内核调度分析(转,侵删)

抢占式调度会影响移动文件的速度吗?

操作系统中抢占式和非抢占式内核的区别

操作系统中抢占式和非抢占式内核的区别

Linux - 进程调度