Linux内核模式下的进程调度

5

以下是从维基百科摘录的一些描述:

在特定情况下,Linux内核提供抢占式调度。直到内核版本2.4之前,仅进程具有可抢占性,即除了时间量的过期外,如果更高动态优先级的进程进入TASK_RUNNING状态,则当前进程在用户模式下的执行将被中断。随着Linux 2.6的发展,增加了一种中断正在执行内核代码的任务的能力,尽管并非内核代码的所有部分都可以被抢占。

然后它还说:

抢占可以提高延迟、增加响应速度,并使Linux更适合桌面和实时应用程序。旧版本的内核具有所谓的大内核锁,用于跨整个内核的同步。Arnd Bergmann在2011年最终将其删除。

那么上述陈述是否对当前的Linux内核成立, 即内核抢占是有条件的?例如, 如果一个进程通过系统调用陷入内核模式, 那么这个进程将不会处于可抢占调度的状态吗?

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

---
是的,当前的Linux内核抢占是有条件的。当一个进程进入内核模式时,它将不再处于可抢占调度状态,直到它返回用户模式。
可以在以下链接中找到关于Linux调度的最新介绍文章/书籍:
- https://www.kernel.org/doc/html/latest/scheduler/ - https://lwn.net/Kernel/Index/ - https://www.amazon.com/Linux-Kernel-Development-Robert-Love/dp/0672329468
2个回答

4
当然,内核抢占是有条件的。在持有独占锁或在设备驱动程序中写入时间敏感的硬件寄存器时,你不希望内核切换任务。
但是,Linux内核会尽最大努力减少这些情况,以便尽可能快地发生抢占。
请注意,只有在编译选项CONFIG_PREEMPT为“yes”时,内核才会编译此内核内抢占。还有CONFIG_PREEMPT_VOLUNTARY,它仅在内核明确检查时进行任务切换。
内核抢占具有成本。 快速切换任务需要做大量基本上是浪费的工作而不是实际工作。 这会减慢整个系统的速度并导致完成的工作量减少。 这就是为什么存在这些编译选项的原因。 专门用于数据库或Web服务器的Linux内核根本不应该使用抢占。 专门用于HPC的内核有时被修改为仅在一秒钟内切换一次任务或更少。
所有这些都会因为实时任务而改变。 这些任务依赖于快速反应并在可靠的时间范围内完成。 默认的Linux内核在这方面表现得很好,但有一个名为“-rtpatches”的补丁集可以使其更好。 补丁集会执行各种操作,例如优先处理中断处理程序并更改内核锁,以便可以在稍后放下锁并重新启动锁。

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.

这里指的是每个用户级线程仅映射到一个内核线程。


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