5

这是从Wiki引用的一些描述

Linux 内核在特定条件下提供抢占式调度。在内核版本 2.4 之前,只有进程是抢占式的,即除了时间片到期之外,如果更高的动态优先级进程进入 TASK_RUNNING 状态,则当前进程在用户模式下的执行将被中断。在 Linux 2.6 中,添加了中断执行内核代码的任务的能力,尽管并非内核代码的所有部分都可以被抢占。

然后它也这么说,

抢占改善了延迟,提高了响应能力,并使 Linux 更适合桌面和实时应用程序。旧版本的内核有一个所谓的大内核锁,用于在整个内核之间进行同步。这最终在 2011 年被 Arnd Bergmann 删除

那么对于当前的 linux 内核,内核抢占是有条件的,上述说法是否成立?例如,如果一个进程通过进行系统调用被困在内核模式中,这个进程将不会处于抢占式调度之下?

我在哪里可以找到一些关于用户模式和内核模式下 linux 调度的最新介绍文章/书籍?

4

2 回答 2

4

当然,内核抢占是有条件的。您不希望内核在持有独占锁或写入设备驱动程序中对时间敏感的硬件寄存器时切换任务。

但是,Linux 内核会尽最大努力将这些条件最小化,以便尽可能快地进行抢占。

请注意,只有在编译选项 CONFIG_PREEMPT 为 yes 时,才会将这种内核内抢占编译到内核中。还有 CONFIG_PREEMPT_VOLUNTARY 仅在内核显式检查时才进行任务切换。

内核抢占是有代价的。快速切换任务需要做大量大部分浪费的家务工作,而不是实际工作。这会减慢整个系统的速度并导致完成的工作减少。这就是存在这些编译选项的原因。为数据库或 Web 服务器构建的 Linux 内核根本不应该使用抢占。为 HPC 构建的内核有时会被修改为每秒只切换一次任务,或者更少。

对于实时任务,这一切都会发生变化。这些任务依赖于在可靠的时间范围内快速做出反应。默认的 Linux 内核在这方面做得很好,但是有一个名为“-rt 补丁”的补丁集使它非常好。补丁集做了各种各样的事情,比如优先处理中断处理程序和更改内核锁,以便稍后可以删除和重新启动锁。

于 2012-12-06T19:49:46.360 回答
3

CPU 调度决策可能发生在进程:

1. Switches from running to waiting state (e.g. I/O request)
2. Switches from running to ready state (e.g. Interrupt)
3. Switches from waiting to ready (e.g. I/O completion)
4. Terminates

1 和 4 下的调度是非抢占式的,所有其他调度都是抢占式的,必须处理操作(系统调用)可能不完整的可能性。

是的,Linux 在某些条件下提供抢占式调度,这与某些 Unix 变体不同,其中内核在没有抢占的情况下调度直到完成。在 Linux 2.6 中,只要内核不持有锁并且可以安全地重新调度,内核就可以抢占运行任务。

Older versions of the kernel had a so-called big kernel lock for synchronization 
across the entire kernel.

指每个用户级线程只映射到一个内核线程。

于 2012-12-06T19:53:51.853 回答