首页 > 解决方案 > linux内核调度如何在多核处理器上工作?

问题描述

我最近开始阅读 Robert Love 的书“Linux Kernel Development 3rd edition”,并深入研究了调度程序部分,这给我留下了很多问题。

所以首先,我知道有两种情况下调度程序会更改当前运行的任务(如果我不准确,请纠正我),要么是由于它阻塞了某些 I/O 而自愿要求重新调度的任务,要么睡眠,或定时器中断,导致 CPU 跳转到调度程序代码并抢占当前任务(如果它是可中断的)。

  1. 多核处理器中的每个内核是否都会收到与重新调度相关的中断?他们每个人都有不同的计时器,或者说有一个中断在某种类型的算法中每次都会选择一个特定的内核来处理它?

  2. 假设不仅一个核心重新调度每个中断(从那时起,我想可能需要一段时间来交换所有核心上的进程),如果两个核心同时重新调度会发生什么?因为,我假设当你运行调度函数时,任务列表必须被锁定,然后我会想象几个核心同时重新调度他们当前的任务,导致只有一个核心实际执行调度工作,而所有其他核心等待任务列表锁。

  3. 不仅需要任务列表锁来触摸实际的任务列表并说更改任务状态或运行队列顺序,如果当前调度的一个核心计算下一个应该运行哪个任务,同时另一个核心成功完成调度,那会怎样?导致第一个核心计算完全错误,因为成功的重新调度只是严重改变了系统状态?

  4. 我知道在linux中优先级分为-20到19的“nice value”(越高意味着优先级越低,越“nice”)和实时优先级(0-99)。实时优先级值仅对几个调度策略很重要,并且每个进程都可以注册到不同的调度策略。实时策略是否总是击败未注册到实时策略的进程?这意味着如果我运行一个实时进程,我将永远无法执行正常进程?正常进程的“好”值和实时进程的实时优先级值如何在调度程序算法中协同工作?

标签: linuxlinux-kernelkernelscheduler

解决方案


推荐阅读