2017-02-10 50 views
0

我一直在研究unix/linux系统的基础知识,特别是如何在现代计算机系统中处理任务或进程列表。Linux进程调度程序 - 它们自己是否使用CPU?

我发现了大量的资源,让这似乎是内核不和如何信号(SIGXXX)被处理的context switching的标准解释:

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

(请让我知道,如果这种认识是不正确的)

我一直在挣扎是的事情,如果这一切发生在一个单核单线程CPU ,物理上运行调度程序的是什么?我错过了一件非常简单的事情,但我陷入了这种鸡肉或鸡蛋的思维。

此外,在具有多个内核,线程和大量可用CPU资源的现代系统中,调度程序是否自己消耗一个内核来运行?我已经阅读了很多关于不同进程调度器,原始O(n),在2.6及更高版本中引入的较新O(1)以及CFS调度器(我认为?)的文章现在大多数Linux。他们都谈论他们如何优先排序和排队进程,他们都没有详细说明调度程序如何以及何时实际运行以完成其所有任务。

调度程序是否共享CPU时间?以某种方式改变本身进出CPU的状态?如果是这样,CPU如何知道什么时候停止进程并让调度程序运行来做它的事情?

回答

2

如果这一切都发生在单核,单线程CPU上,物理上运行调度器的是什么?

你认为它需要是内核以外的东西,因为当前线程忙于做东西并发出系统调用。关键的想法是内核在CPU内核中注册了一个时钟中断,每个设备的确切实现方式各不相同,但是每当定时器间隔结束或发生内核信号时,CPU内核本身就会调用已注册的interrupt handler (aka ISR)。 ISR实际上是一个指向你给内核的中断函数的内存指针。在中断函数返回到用户空间(即当前工作线程)之前调度程序被调用(更多details here

调度的频率取决于clock speed of the cpu

调度程序是否自己消耗一个内核来运行?

不,调度程序自己运行在每个内核上,也可以在另一个内核上调度线程。

一些进一步阅读:

1

调度程序是内核的一部分,当然,它会消耗CPU。在最简单的情况下,您可以将计时器连接到CPU,例如每10ms计数一次。在每个时钟周期中,CPU都会'中断',也就是说,它会跳转到调度程序所在的某个预定义地址。然后调度程序将一些与进程相关的数据保存到某个内部结构中,选择另一个进程,加载其数据并跳转到进程正在执行的地址。这些O(n)和O(1)确实是调度程序的时间复杂性,这意味着调度程序需要多少时间来决定下一个要调度的任务。

+0

部分,我的问题是关于不是简单的情况 - 在多核心处理器或多个处理器的情况。你是否说过CPU总是花费在特定任务上的时间总是有硬编码的限制,并且中断发生在最大值并且CPU加载调度器?哪个CPU在12核心的情况下加载调度器?什么决定了? – Locane

+0

调度程序必须在每个内核上运行,一个内核不能更改另一个内核的寄存器。而硬编码限制取决于调度算法。其中一些给予每个进程最大时间片,并且如果进程不会自动“放弃”CPU,则该中断会使上下文切换发生 –

相关问题