请用自己的话解释一下什么是抢占,并且它对于(Linux)内核意味着什么?
有可抢占内核的优缺点是什么?
请用自己的话解释一下什么是抢占,并且它对于(Linux)内核意味着什么?
有可抢占内核的优缺点是什么?
抢占式多任务处理 - 在单个处理器上运行多个进程/线程,创造出它们同时运行的假象,实际上每个进程被分配小的时间片来运行。当一个进程等待下一个时间片时,它就会被“抢占”。
抢占式内核是指可以在执行代码中被中断的内核,例如响应系统调用,以执行其他任务并运行其他线程,可能不在内核内部。
抢占式内核的主要优点是系统调用不会阻塞整个系统。如果系统调用需要很长时间才能完成,则这并不意味着内核在此期间不能执行任何其他操作。 其主要缺点是,这会给内核代码带来更多复杂性,需要处理更多边缘情况,执行更细粒度的锁定或使用无锁结构和算法。
你应该真正使用“抢占式”这个术语。有不同种类的抢占。本质上,它非常简单,而且你可能已经用另一个名称理解了它。一个抢占式操作系统可以在被抢占的应用程序中没有任何特殊编程的情况下,在用户模式线程之间切换上下文。这允许多任务处理。操作系统可以切换到一个进程并返回,这种切换基本上是透明的。还有一种抢占式内核,允许抢占内核模式线程(大多数操作系统不允许这样做,但在某些应用程序中需要,例如实时系统)。注意,这是一个非常简化的解释。
我认为这个帖子可以解答你的问题:
什么是抢占?
操作系统抢占或停止当前的进程,转而执行优先级更高的进程。调度可以是进程、I/O调度等,但不限于此。
什么是抢占内核?
在Linux下,用户空间程序一直是可抢占的:内核会中断用户空间程序并切换到其他线程,使用常规时钟滴答声。因此,内核不会等待用户空间程序显式释放处理器(这在协作式多任务处理中是情况)。这意味着,用户空间程序中的无限循环不能阻塞系统。
然而,在2.6内核之前,内核本身不可抢占:一旦一个线程进入内核,它就不能被抢占以执行另一个线程。当系统调用终止或当前线程显式要求调度程序运行另一个线程时,可以使用处理器来执行另一个线程。这意味着,内核代码中的无限循环会阻塞整个系统,但这并不是真正的问题:内核代码被设计成没有无限循环。
内核抢占已经在2.6内核中引入,可以使用CONFIG_PREEMPT选项启用或禁用它。如果启用了CONFIG_PREEMPT,则内核代码可以在任何地方被抢占,除非代码已禁用本地中断。代码中的无限循环不再能够阻塞整个系统。如果禁用了CONFIG_PREEMPT,则恢复2.4的行为。
优缺点?
优点:抢占内核可以改善延迟和可扩展性,并使高优先级任务及时运行和响应。
缺点:在抢占内核中编写代码很困难,特别是在SMP中,必须考虑许多因素。
其他人已经充分解释了什么是可抢占内核。
它有什么好处?
主要好处包括:
使用不可抢占内核,在单处理器系统上,内核开发人员可能会变得懒惰,并且大部分时间都可以不加锁定地运行 - 当然,在SMP上这是一个巨大的失败。可抢占内核允许他们在没有更多核心的情况下避免这种痛苦。
抢占意味着操作系统支持多个任务(一个独立的、独立的代码片段),并且会按计划在任务之间进行切换。当一个任务被中断时,它被称为“抢占”。现代操作系统都支持这一点,但对于简单的嵌入式系统来说并非必需。支持任务切换所需的开销并不总是值得的。