【问题标题】:Kernel is non-preemptive.....How?内核是非抢占式的......如何?
【发布时间】:2011-07-10 06:01:12
【问题描述】:

在内核模式下执行的进程不能被抢占。

这怎么可能?

考虑一个进程在内核模式下执行并花费大量时间的情况。因此,其余进程将保留在就绪队列中。

例如,进程如何响应定时器中断(如果它在内核模式下执行)?或者它如何响应高温切断中断。

如果有人能解开我的疑惑,请帮忙

【问题讨论】:

  • 您能否提供一个内核模式下此类操作的示例,因为进程仅在有限的一组操作中进行内核模式转换,整个进程永远不会在内核模式下运行。
  • 假设用户进程运行 4 秒,并在 4 秒时调用系统例程,模式切换到内核模式.....现在处于内核模式..系统调用需要 3 秒.. .所以总共是 4+3=7.让我们假设时间片是 5 秒....那么进程是否会在 5 秒后被抢占。(请记住,在第 5 秒,进程在内核模式下运行)

标签: operating-system stack linux-kernel scheduling


【解决方案1】:

一般来说,中断能够做他们名字所暗示的事情,中断当时正在运行的任何东西,无论是用户空间进程还是内核中运行的系统调用。

【讨论】:

    【解决方案2】:

    首先,您的假设不正确:如果设置了配置选项 CONFIG_PREEMPT_VOLUNTARYCONFIG_PREEMPT,Linux 内核确实提供了有限的内核模式抢占。

    开启抢占后,持有锁的任务不会被抢占;内核开发人员非常关注进程持有锁的时间,并试图减少持有锁的时间。 (部分是为了抢占,部分是因为持有的锁越长,如果多个处理器争用同一个锁,系统的并发性可能就越低。如果锁被持有的时间很短,那么争用就会减少,并且可能会产生更高的吞吐量.)

    此外,内核开发人员试图限制进程在内核模式下的时间长度。毕竟,在内核中花费的时间是在应用程序中花费的时间,无论应用程序做什么。

    如果标准 Linux 内核无法为您提供足够好的硬实时性能处理中断,您当然可以使用 RTLinux 这样的系统,commercial support 是可用的。

    【讨论】:

      猜你喜欢
      • 2018-09-16
      • 2015-03-05
      • 2017-03-05
      • 2011-03-23
      • 2014-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多