【问题标题】:Linux process scheduling in kernel modeLinux内核模式下的进程调度
【发布时间】:2012-12-06 19:16:02
【问题描述】:

这里是引用自维基的一些描述

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

那么它也这么说,

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

对于当前的 linux 内核来说,上述说法是否适用于内核抢占 有条件的?例如如果一个进程通过系统调用被困在内核态,这个进程不会处于抢占式调度之下吗?

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

【问题讨论】:

    标签: linux scheduling


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      【解决方案2】:

      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.
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-14
        • 2011-09-11
        • 1970-01-01
        • 2013-10-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多