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

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

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

抢占式多任务 – 在单个处理器上运行多个进程/线程,创build一个错觉,即当每个进程实际上分配了小型多路复用时间片时,它们将同时运行。进程被调度为不执行时等待“抢占”下一次切入。

先发制人的内核是在执行代码过程中可以被中断的一个内核 – 例如响应系统调用 – 执行其他事情并运行其他线程,可能是那些不在内核中的线程。

抢占式内核的主要优点在于,系统调用不会阻塞整个系统。 如果系统调用需要很长时间才能完成,那么这并不意味着内核在这个时候不能做任何事情。 主要缺点是这会给内核代码带来更多的复杂性,不得不处理更多的结束事件,执行更细粒度的locking或使用无锁结构和algorithm。

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

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

到底有什么好处呢?

大部分好处是:

  • 非SMP系统上的延迟更低 – 通常用于实时系统或延迟非常重要的其他事物(audio,video应用程序)
  • 教授没有SMP系统的内核开发人员如何为SMP编写正确的代码

有了一个不可抢占的内核,在一个单一的处理器系统上,内核开发者可能会懒惰,大部分时间都没有任何locking – 当然这是SMP上的一个大失败。 可抢占内核允许他们在没有更多内核的情况下获得这种痛苦。

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

我认为这篇文章解释了你的问题:

什么是抢占?

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

什么是抢占内核?

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

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

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

优点和缺点?

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

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