以下是Wiki引用的一些描述
Linux内核在某些情况下提供抢占式调度 条件。在内核版本2.4之前,只有进程是先发制人的, 即,除了时间量程到期之外,还执行当前的电流 如果动态优先级较高,则用户模式下的进程将被中断 进程进入TASK_RUNNING状态。走向Linux 2.6,一个 但是,添加了中断执行内核代码的任务的能力 因为并非内核代码的所有部分都可以被抢占。
然后它也说了这个,
抢占可以提高延迟,提高响应速度,并使Linux成为可能 更适合桌面和实时应用。旧版本 内核有一个所谓的大内核锁用于同步 整个内核。这最终被Arnd Bergmann取消了 2011
上面的语句对于内核抢占的当前Linux内核也是如此 条件?例如如果通过进行系统调用将进程陷入内核模式,则此进程不会处于抢占式调度之下?
在哪里可以找到有关用户模式和内核模式下linux调度的最新介绍文章/书籍?
答案 0 :(得分:4)
当然内核抢占是有条件的。您不希望内核在保持独占锁定或在设备驱动程序中写入时间敏感的硬件寄存器时切换任务。
然而,Linux内核尽力减少这些条件,以便尽快发生抢占。
请注意,当编译选项CONFIG_PREEMPT为yes时,此内核内抢占仅编译到内核中。还有CONFIG_PREEMPT_VOLUNTARY只在内核明确检查时才进行任务切换。
内核抢占需要付出代价。快速切换任务需要做很多大部分浪费的家政工作而不是实际工作。这会减慢整个系统的速度,从而减少工作量。这就是存在这些编译选项的原因。为数据库或Web服务器构建的Linux内核根本不应使用抢占。为HPC构建的内核有时会被修改为每秒只切换一次或更少的任务。
所有实时任务都发生了变化。这些任务依赖于在可靠的时间范围内快速做出反应。默认的Linux内核相当不错,但是有一个名为“-rt patches”的补丁集使它非常好。补丁集可以执行各种操作,例如优先处理中断处理程序和更改内核锁,以便以后可以删除锁并重新启动。
答案 1 :(得分: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.
指的是每个用户级线程仅映射到一个内核线程。