【问题标题】:Scheduler on the processes running in kernel mode在内核模式下运行的进程上的调度程序
【发布时间】:2014-10-23 19:04:17
【问题描述】:

“了解 Linux 内核”一书提到了几种挂起在内核模式下运行的进程的方法(第 1 章,第 22 页)。他们在这里:

  1. 无法立即满足系统调用请求
  2. CPU 检测到异常
  3. 发生硬件中断
  4. 当 CPU 在启用内核抢占的情况下运行时发生中断, 并且可以运行更高优先级的进程。

它没有提到进程用完了它的时间片并且调度器带来另一个相同优先级的进程来运行。我认为这应该是暂停在内核模式下运行的进程的一种情况。请发表评论。

【问题讨论】:

  • 这不是第 4 点吗?调度程序通常在定时器中断时运行。
  • 是的,上下文切换不会自行发生。 CS 在系统定时器中断处理程序中实现。
  • 数字 4 是关于更高优先级的进程可以运行。我担心的是相同或更低优先级的进程。
  • man 7 sched: '要运行的线程是根据仅在此列表中确定的动态优先级从静态优先级 0 列表中选择的。动态优先级基于 nice 值(见下文),并随着线程准备好运行但被调度程序拒绝运行的每个时间片而增加。这确保了所有 SCHED_OTHER 线程之间的公平进展。'

标签: linux linux-kernel


【解决方案1】:

调度器在定时器中断中运行时检测到时间片的结束,低于3。

【讨论】:

    【解决方案2】:

    在 Linux Kernel 中,超出时间片的进程不会自动挂起。发生的情况是,在定时器中断期间,内核检查当前进程是否在 check_preempt_tick() 中运行了足够长的时间。如果运行时间足够长,内核会通过调用resched_curr() 设置TIF_NEED_RESCHED 标志。

    现在当从定时器中断返回时,内核检查当前进程是否设置了TIF_NEED_RESCHED标志。如果设置了它并且启用了抢占,内核调用schedule() 选择运行一个新进程。

    实际上,每当发生中断(甚至不是定时器中断)时,内核都会检查当前进程是否可以被抢占,并相应地调用schedule()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-08
      • 2015-10-15
      • 2011-06-08
      • 1970-01-01
      • 2016-10-21
      • 1970-01-01
      • 2016-05-30
      • 2017-01-07
      相关资源
      最近更新 更多