多核Linux调度程序

多核Linux调度程序

因为linux内核是抢占式的:

  1. 调度程序在哪个核心上运行?

  2. 如果内核空间在另一个核心上运行,它如何在另一个核心上进行调度(上下文切换)?

  3. 如果用户空间在另一个核心上运行,它如何在另一个核心上进行调度(上下文切换)?

  4. 如果内核可以在所有内核上运行 - 是否像分布式算法(每个内核线程独立于其他内核模块 - 并且内核数据结构上有锁) - 或者有一个主要实体来协调所有内核线程?

  5. 因此,为了进行调度,调度程序会更改每个核心中的等待列表(这是一个集中式数据结构吗?),并且每个核心上的每个内核都会查看此数据并选择下一个进程在同一核心上运行?

  6. 当调度程序中断发生时 - 哪个调度程序进程正在运行?或者每个核心上都有调度程序进程,每个核心上都有中断 - 并且每个核心上的每个调度程序进程 - 从其运行队列进行调度或使用迁移线程将进程移动到其他运行队列?

答案1

调度程序在哪个核心上运行?

在所有核心上

如果内核空间在另一个核心上运行,它如何在另一个核心上进行调度(上下文切换)?

事情就是这样——上下文切换是在核心本地发生的事情。因此,不存在“在另一个核心上运行”的情况。

不太确定您是否真的理解了“上下文切换”的正确含义。我想你的意思可能是“在不同的核心上重新安排任务”。

另外,提示:不要将事情视为“正在运行”;这并不是计算机实际工作的方式,在事情变得美好并通过您想要理解的机制进行抽象之前。

想一想:“这个 CPU 核心现在正在执行哪段代码?”,您会意识到基本上所有这些事情都是积极地由执行的代码或某些硬件中断完成。

如果用户空间在另一个核心上运行,它如何在另一个核心上进行调度(上下文切换)?

好吧,如果一个进程没有运行,它就在等待列表中,并且一旦处理器核心上运行的内核代码确定它是空闲时间(例如,通过处理尽可能多的系统调用),就会查询该等待列表通过在该核心本身上运行的代码(这是合乎逻辑的)。 “哦,这个等待过程就是我要进入的”这个决定的完成方式确实涉及地点(即我们是上次执行它的同一个核心吗?),但不完全如此。

它是否像分布式算法(每个内核线程都独立于其他内核模块 - 并且内核数据结构上有锁) - 或者有一个主要实体来协调所有内核线程?

大多是第一个。

答案2

你所谓的调度程序实际上是内核例程的集合,可以在特定事件、中断甚至来自用户态进程的调用之后执行。

调度程序使用的最基本的数据是运行队列。在 CFS 下,每个处理器都有自己的任务运行队列,并且没有任务同时发生在多个运行队列中。

由此得出的结论是,是的,我们可以说 CFS 可以在所有处理器上运行。对于第五个问题,不,它不是一个中心化的数据结构。

雷姆。我同意马库斯·穆勒(Marcus Müller)关于一些误解的回答上下文切换。然后我假设你的问题是关于线程的移民:线程从一个核心到另一个核心的迁移由[migration/x] 内核线程(每个核心一个)

关于锁:是的,内核线程有时会锁定(使用自旋锁和互斥锁),但当然越少越好

相关内容