内核模式下的Linux进程调度

以下是Wiki引用的一些说明

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

然后它也说这个,

抢占可提高延迟,提高响应速度,并使Linux更适合于桌面和实时应用程序。 较早版本的内核在整个内核中都有一个所谓的大内核锁定用于同步。 2011年,Arnd Bergmann终于将其删除

那么上面的语句对于当前的内核来说是否适用于内核抢占是有条件的? 例如,如果某个进程通过进行系统调用而陷入内核模式,那么这个进程将不会处于抢先调度状态?

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


一个进程可能会发生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.

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


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

然而,Linux内核尽最大努力使这些条件最小化,以使抢占尽可能快地发生。

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

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

这一切都改变为实时任务。 这些任务依赖于在可靠的时间范围内迅速做出反应。 默认的Linux内核在这方面非常出色,但是有一个名为“-rt patches”的补丁集,使它非常好。 该补丁集可以执行各种操作,如优先处理中断处理程序并更改内核锁,以便稍后可以删除并重新启动锁。

链接地址: http://www.djcxy.com/p/43621.html

上一篇: Linux process scheduling in kernel mode

下一篇: Understanding discrepancy between POSIX and Linux/glibc sched