我一直在研究unix / linux系统的基础知识,特别是如何在现代计算机系统中处理任务或进程列表。
我发现了很多资源,它们提供了内核所做的context switching的标准解释以及如何处理信号(SIGXXX):
(如果这种理解不正确,请告诉我)
我一直在努力的事情是,如果这一切都发生在单核,单线程CPU上, 物理运行调度程序的是什么? 我错过了一些非常简单的事情,但我仍然坚持这种鸡蛋或鸡蛋的想法。
此外,在具有多个内核,线程和大量可用CPU资源的现代系统中,调度程序是否会单独使用内核来运行?
我已经阅读了很多关于不同进程调度程序的文章,原始的O(n),2.6及更高版本中引入的新O(1),以及(我认为?)使用的CFS调度程序现在在大多数Linux中。他们都讨论了如何确定优先级和排队进程,并且没有人详细介绍调度程序实际运行的方式和时间,以完成所有任务。
调度程序是否共享CPU时间?以某种方式将本身进出CPU?如果是这样,CPU如何知道何时停止进程并让调度程序运行它?
答案 0 :(得分:2)
如果这一切都发生在单核,单线程CPU上,那么物理上运行调度程序的是什么?
你的想法是正确的,它需要是内核以外的东西,因为当前的线程忙着做东西并发出系统调用。关键的想法是内核在CPU内核中注册了一个时钟中断,确切的实现因设备不同而不同,但每次定时器间隔结束或内核信号有内核时,CPU内核本身都会调用注册的interrupt handler (aka ISR)。发生了。 ISR实际上是指向内核提供的中断函数的内存指针。在中断函数返回用户空间(即当前工作的线程)之前调用调度程序(更多details here)
调度的频率取决于clock speed of the cpu。
调度程序是否单独使用核心来运行?
不,调度程序可以自行运行每个核心,也可以在另一个核心上安排线程。
进一步阅读:
答案 1 :(得分:1)
调度程序是内核的一部分,当然是消耗CPU。在最简单的情况下,您可以考虑将计时器连接到CPU,例如每隔10ms进行一次计时。在每个滴答声中,CPU都会被“中断”,也就是说,它会跳转到调度程序所在的某个预定义地址。然后,调度程序将一些与进程相关的数据保存到某个内部结构中,选择另一个进程,加载其数据并跳转到该进程正在执行的地址。
那些O(n)和O(1)恰好是调度程序的时间复杂性,这意味着调度程序需要多长时间来决定下一个要调度的任务。