Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux进程调度器-它们自己是否消耗CPU?_Linux_Process_Multiprocessing_Context Switch - Fatal编程技术网

Linux进程调度器-它们自己是否消耗CPU?

Linux进程调度器-它们自己是否消耗CPU?,linux,process,multiprocessing,context-switch,Linux,Process,Multiprocessing,Context Switch,我一直在学习unix/linux系统基础知识,特别是在现代计算机系统中如何处理一系列任务或进程 我找到了很多资料,这些资料对内核的功能以及信号(SIGXXX)的处理方式给出了标准的解释: 一个进程运行一段时间或直到中断被终止 收到 内核从运行的内存中卸载进程 (缓存),将有关其上下文的数据存放在其他内存中以加载 下一个需要CPU时间的进程 如果信号(SIGXXX)正在等待 在这个过程中,内核尝试调用 这个过程。如果不存在,则不会再次加载该进程 (被杀) 新进程加载到内存并运行;循环 继续 (

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

我找到了很多资料,这些资料对内核的功能以及信号(SIGXXX)的处理方式给出了标准的解释:

  • 一个进程运行一段时间或直到中断被终止 收到
  • 内核从运行的内存中卸载进程 (缓存),将有关其上下文的数据存放在其他内存中以加载 下一个需要CPU时间的进程
  • 如果信号(SIGXXX)正在等待 在这个过程中,内核尝试调用 这个过程。如果不存在,则不会再次加载该进程 (被杀)
  • 新进程加载到内存并运行;循环 继续
(如果这种理解不正确,请告诉我)

我一直在努力解决的问题是,如果这一切都发生在单核、单线程CPU上,调度程序的物理运行是什么?我错过了一些非常简单的东西,但我陷入了这种鸡或蛋的思维

此外,在具有多个内核、线程和大量可用CPU资源的现代系统中,调度器是否会自行消耗一个内核来运行

我读过很多关于不同进程调度器的文章,最初的O(n),2.6及以后版本中引入的较新的O(1),以及现在大多数Linux中使用的CFS调度器(我想?)。他们都在谈论如何对流程进行优先级排序和查询,但没有人详细介绍调度器如何以及何时实际运行以完成其所有任务


调度程序是否共享CPU时间?以某种方式在CPU中来回移动?如果是这样,CPU如何知道何时停止进程并让调度程序运行以完成任务?

调度程序是内核的一部分,当然,它会消耗CPU。在最简单的情况下,您可以将计时器连接到CPU,例如每10毫秒一次。在每一次滴答声中,CPU都会被“中断”,也就是说,它会跳转到某个预定义的地址,即调度程序所在的位置。然后,调度器将一些与进程相关的数据保存到某个内部结构中,选择另一个进程,加载其数据并跳转到该进程正在执行的地址


这些O(n)和O(1)正是调度器的时间复杂性,也就是说,调度器需要多少时间来决定下一步调度哪个任务。

调度器是内核的一部分,当然,它会消耗CPU。在最简单的情况下,您可以将计时器连接到CPU,例如每10毫秒一次。在每一次滴答声中,CPU都会被“中断”,也就是说,它会跳转到某个预定义的地址,即调度程序所在的位置。然后,调度器将一些与进程相关的数据保存到某个内部结构中,选择另一个进程,加载其数据并跳转到该进程正在执行的地址

这些O(n)和O(1)正是调度器的时间复杂性,这意味着调度器需要多少时间来决定下一个要调度的任务

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

您的想法是正确的,它需要是内核之外的东西,因为当前线程正忙于做事情和发出系统调用。关键思想是,内核在CPU内核中注册了一个时钟中断,具体实现因设备而异,但每次定时器间隔结束或出现内核信号时,CPU内核本身都会调用注册的时钟中断。ISR实际上是一个内存指针,指向您提供给内核的中断函数。在中断函数返回用户空间(即当前工作线程)之前,调用调度程序(更多)

调度的频率取决于时间

调度程序是否自行使用一个内核来运行

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

进一步阅读:

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

您的想法是正确的,它需要是内核之外的东西,因为当前线程正忙于做事情和发出系统调用。关键思想是,内核在CPU内核中注册了一个时钟中断,具体实现因设备而异,但每次定时器间隔结束或出现内核信号时,CPU内核本身都会调用注册的时钟中断。ISR实际上是一个内存指针,指向您提供给内核的中断函数。在中断函数返回用户空间(即当前工作线程)之前,调用调度程序(更多)

调度的频率取决于时间

调度程序是否自行使用一个内核来运行

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

进一步阅读:


我的问题的一部分并不是关于最简单的情况——在多核处理器或多处理器的情况下。你是说CPU在一个特定任务上花费的时间总是有一个硬编码的限制,一个中断发生在一个最大值,CPU加载调度程序?在12核的情况下,哪个CPU加载调度程序?什么决定了这一点?调度程序必须在每个内核上运行,一个内核不能更改另一个内核的寄存器。硬编码限制取决于调度算法。它们中的一些为每个进程提供了最大的时间片,若进程并没有自愿地在CPU上“放弃”,那个么中断会导致上下文切换发生。我的问题的一部分并不是关于最简单的情况