Linux 进程调度程序 - 他们自己会消耗 CPU 吗?
Linux process schedulers - do they themselves consume a CPU?
我一直在研究 unix/linux 系统基础知识,尤其是在现代计算机系统中如何处理一系列任务或进程。
我找到了很多资源,这些资源似乎是对内核所做的 context switching 以及如何处理信号 (SIGXXX) 的标准解释:
- 一个进程 运行 秒,持续一段时间或直到出现中断
收到
- 内核从运行ning内存卸载进程
(缓存),将有关其上下文的数据存储在其他地方的内存中以加载
下一个过程需要 CPU 时间。
- 如果信号 (SIGXXX) 正在等待
过程中,内核尝试调用适当的处理程序
过程。如果 none 存在,则不会再次加载进程
(被杀)。
- 新进程加载到内存并运行s;周期
继续
(理解有误请告知)
我一直在努力解决的问题是,如果这一切都发生在单核、单线程上 CPU,物理上是什么 运行调度程序?我错过了一些非常简单的东西,但我陷入了这种先有鸡还是先有蛋的思维方式。
此外,在具有多个内核、线程和大量 CPU 可用资源的现代系统中,调度程序是否会自行消耗一个内核来 运行?
我读了很多关于不同进程调度器的文章,原始的 O(n),2.6 及更高版本中引入的较新的 O(1),以及(我认为?)使用的 CFS 调度器在当今的大多数 Linux 中。他们所有人都在谈论他们如何对进程进行优先级排序和排队,其中 none 详细介绍了调度程序实际上是如何以及何时 运行 完成其所有任务的。
调度程序是否共享 CPU 时间?以某种方式将 本身 移入和移出 CPU?如果是这样,CPU 如何知道何时停止进程并让调度程序 运行 做它的事情?
调度程序是内核的一部分,是的,它当然会消耗 CPU。在最简单的情况下,您可以考虑将计时器附加到 CPU,例如每 10 毫秒计时一次。在每个 tick 上,CPU 得到 'interrupted',也就是说,它跳转到调度程序所在的某个 pre-defined 地址。调度程序然后将一些 process-related 数据保存到某个内部结构,选择另一个进程,加载其数据并跳转到该进程正在执行的地址。
那些O(n)和O(1)恰好是调度器的时间复杂度,也就是说,调度器需要多少时间来决定接下来调度哪个任务。
if this is all occurring on a single-core, single-thread CPU, what's physically running the scheduler?
你的想法是正确的,它需要是内核之外的东西,因为当前线程正忙于做事和发出系统调用。关键思想是内核在CPU内核中注册了一个时钟中断,具体实现因设备而异,但是CPU内核本身调用注册的interrupt handler (aka ISR) every time the timer interval is over or a kernel signal has occurred. The ISR is in effect a memory pointer to your interrupt function you give to the kernel. Before the interrupt function would return back to user space (i.e. the currently working thread) the scheduler is called (more details here)
调度频率取决于clock speed of the cpu。
does the scheduler consume a core by itself to run?
不,调度程序自己在每个核心上运行,也有可能在另一个核心上调度线程。
进一步阅读:
我一直在研究 unix/linux 系统基础知识,尤其是在现代计算机系统中如何处理一系列任务或进程。
我找到了很多资源,这些资源似乎是对内核所做的 context switching 以及如何处理信号 (SIGXXX) 的标准解释:
- 一个进程 运行 秒,持续一段时间或直到出现中断 收到
- 内核从运行ning内存卸载进程 (缓存),将有关其上下文的数据存储在其他地方的内存中以加载 下一个过程需要 CPU 时间。
- 如果信号 (SIGXXX) 正在等待 过程中,内核尝试调用适当的处理程序 过程。如果 none 存在,则不会再次加载进程 (被杀)。
- 新进程加载到内存并运行s;周期 继续
(理解有误请告知)
我一直在努力解决的问题是,如果这一切都发生在单核、单线程上 CPU,物理上是什么 运行调度程序?我错过了一些非常简单的东西,但我陷入了这种先有鸡还是先有蛋的思维方式。
此外,在具有多个内核、线程和大量 CPU 可用资源的现代系统中,调度程序是否会自行消耗一个内核来 运行?
我读了很多关于不同进程调度器的文章,原始的 O(n),2.6 及更高版本中引入的较新的 O(1),以及(我认为?)使用的 CFS 调度器在当今的大多数 Linux 中。他们所有人都在谈论他们如何对进程进行优先级排序和排队,其中 none 详细介绍了调度程序实际上是如何以及何时 运行 完成其所有任务的。
调度程序是否共享 CPU 时间?以某种方式将 本身 移入和移出 CPU?如果是这样,CPU 如何知道何时停止进程并让调度程序 运行 做它的事情?
调度程序是内核的一部分,是的,它当然会消耗 CPU。在最简单的情况下,您可以考虑将计时器附加到 CPU,例如每 10 毫秒计时一次。在每个 tick 上,CPU 得到 'interrupted',也就是说,它跳转到调度程序所在的某个 pre-defined 地址。调度程序然后将一些 process-related 数据保存到某个内部结构,选择另一个进程,加载其数据并跳转到该进程正在执行的地址。
那些O(n)和O(1)恰好是调度器的时间复杂度,也就是说,调度器需要多少时间来决定接下来调度哪个任务。
if this is all occurring on a single-core, single-thread CPU, what's physically running the scheduler?
你的想法是正确的,它需要是内核之外的东西,因为当前线程正忙于做事和发出系统调用。关键思想是内核在CPU内核中注册了一个时钟中断,具体实现因设备而异,但是CPU内核本身调用注册的interrupt handler (aka ISR) every time the timer interval is over or a kernel signal has occurred. The ISR is in effect a memory pointer to your interrupt function you give to the kernel. Before the interrupt function would return back to user space (i.e. the currently working thread) the scheduler is called (more details here)
调度频率取决于clock speed of the cpu。
does the scheduler consume a core by itself to run?
不,调度程序自己在每个核心上运行,也有可能在另一个核心上调度线程。
进一步阅读: