我一直在研究unix/linux系统的基础知识,特别是如何在现代计算机系统中处理任务或进程列表。Linux进程调度程序 - 它们自己是否使用CPU?
我发现了大量的资源,让这似乎是内核不和如何信号(SIGXXX)被处理的context switching的标准解释:
- 一个过程,一组量运行的时间或直到中断被接收到
- 内核从运行内存中卸载进程 (缓存),将有关其上下文的数据存储在其他位置以加载需要CPU时间的下一个进程。
- 如果一个信号(SIGXXX)正在等待 的进程,内核会尝试调用 这个进程中的相应处理程序。如果不存在,则该过程不会再被装回 (杀死)。
- 新进程被加载到内存中并运行;循环 继续
(请让我知道,如果这种认识是不正确的)
我一直在挣扎是的事情,如果这一切发生在一个单核单线程CPU ,物理上运行调度程序的是什么?我错过了一件非常简单的事情,但我陷入了这种鸡肉或鸡蛋的思维。
此外,在具有多个内核,线程和大量可用CPU资源的现代系统中,调度程序是否自己消耗一个内核来运行?我已经阅读了很多关于不同进程调度器,原始O(n),在2.6及更高版本中引入的较新O(1)以及CFS调度器(我认为?)的文章现在大多数Linux。他们都谈论他们如何优先排序和排队进程,他们都没有详细说明调度程序如何以及何时实际运行以完成其所有任务。
调度程序是否共享CPU时间?以某种方式改变本身进出CPU的状态?如果是这样,CPU如何知道什么时候停止进程并让调度程序运行来做它的事情?
部分,我的问题是关于不是简单的情况 - 在多核心处理器或多个处理器的情况。你是否说过CPU总是花费在特定任务上的时间总是有硬编码的限制,并且中断发生在最大值并且CPU加载调度器?哪个CPU在12核心的情况下加载调度器?什么决定了? – Locane
调度程序必须在每个内核上运行,一个内核不能更改另一个内核的寄存器。而硬编码限制取决于调度算法。其中一些给予每个进程最大时间片,并且如果进程不会自动“放弃”CPU,则该中断会使上下文切换发生 –