Linux进程调度程序 - 他们自己使用CPU吗?

时间:2017-02-10 00:00:54

标签: linux process multiprocessing context-switch

我一直在研究unix / linux系统的基础知识,特别是如何在现代计算机系统中处理任务或进程列表。

我发现了很多资源,它们提供了内核所做的context switching的标准解释以及如何处理信号(SIGXXX):

  • 进程运行一段时间或直到中断为止 收到
  • 内核从运行内存中卸载进程 (缓存),在其他地方的内存中存储有关其上下文的数据以加载 下一个需要CPU时间的进程。
  • 如果信号(SIGXXX)正在等待 在该过程中,内核尝试调用适当的处理程序 这个过程。如果不存在,则不会再次加载该进程 (杀死)。
  • 新进程被加载到内存并运行;这个循环 继续

(如果这种理解不正确,请告诉我)

我一直在努力的事情是,如果这一切都发生在单核,单线程CPU上, 物理运行调度程序的是什么? 我错过了一些非常简单的事情,但我仍然坚持这种鸡蛋或鸡蛋的想法。

此外,在具有多个内核,线程和大量可用CPU资源的现代系统中,调度程序是否会单独使用内核来运行?

我已经阅读了很多关于不同进程调度程序的文章,原始的O(n),2.6及更高版本中引入的新O(1),以及(我认为?)使用的CFS调度程序现在在大多数Linux中。他们都讨论了如何确定优先级和排队进程,并且没有人详细介绍调度程序实际运行的方式和时间,以完成所有任务。

调度程序是否共享CPU时间?以某种方式将本身进出CPU?如果是这样,CPU如何知道何时停止进程并让调度程序运行它?

2 个答案:

答案 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)恰好是调度程序的时间复杂性,这意味着调度程序需要多长时间来决定下一个要调度的任务。