【问题标题】:Process & thread scheduling overhead进程和线程调度开销
【发布时间】:2015-07-31 21:31:22
【问题描述】:

在调度方面有几件事我不太明白:

  1. 我假设每个进程/线程,只要它受 CPU 限制,都会给定一个时间窗口。一旦窗口结束,它就会被换出并运行另一个进程/线程。这个假设正确吗?是否有任何球场数字,该窗口在现代 PC 上有多长?我假设大约100毫秒?换出的开销是多少?几毫秒左右?
  2. 操作系统是按进程调度还是按单个内核线程调度?安排每个进程并在该时间窗口内运行该进程可用的任何线程会更有意义。这样,进程上下文切换被最小化。我的理解正确吗?
  3. 每个线程运行的时间与其他系统时间(例如 RAM 访问、网络访问、HD I/O 等)相比如何?
  4. 如果我正在读取套接字(阻塞),我的线程将被换出,直到数据可用,然后将触发硬件中断并将数据移动到 RAM(由 CPU 或由 NIC,如果它支持 DMA)。我是否正确地假设线程不一定会被换回以处理传入的数据?

我主要询问的是 Linux,但我想这些信息也适用于 Windows。

我意识到这是一堆不同的问题,我试图澄清我对这个主题的理解。

【问题讨论】:

  • 调度频率是在内核编译时设置的,因此它可能因系统而异。交换是通过swappiness 设置控制的,这也有所不同。不是一个完整的答案,但我希望它有所帮助:)
  • 确实有帮助。至少我知道用谷歌搜索什么:-)。谢谢。

标签: linux windows multithreading


【解决方案1】:

我假设每个进程/线程,只要它受 CPU 限制,都会给定一个时间窗口。一旦窗口结束,它就会被换出并运行另一个进程/线程。这个假设正确吗?是否有任何球场数字,该窗口在现代 PC 上有多长?我假设大约100毫秒?换出的开销是多少?几毫秒左右?

没有。几乎所有现代操作系统都使用抢占式,允许突然需要工作的交互式进程(因为用户按下键、从磁盘读取数据或接收到网络数据包)来中断 CPU 密集型任务。

操作系统是按进程调度还是按单个内核线程调度?安排每个进程并在该时间窗口内运行该进程可用的任何线程会更有意义。这样,进程上下文切换就被最小化了。我的理解正确吗?

这是一个复杂的优化决策。与更改地址空间的成本相比,炸毁指令和数据缓存的成本通常很大,因此这并不像您想象的那么重要。通常,首先选择要调度所有准备运行线程的线程,并且进程粘性可能是影响要在哪个内核上调度的优化。

每个线程运行的时间与其他系统时间(例如 RAM 访问、网络访问、HD I/O 等)相比如何?

显然,线程必须运行大量的 RAM 访问,因为切换线程需要大量的此类访问。硬盘驱动器和网络 I/O 通常足够慢,以至于等待此类事情的线程被取消调度。

快速 SSD 改变了一些东西。我最近经常看到的一件事是使用大量 CPU 来避免磁盘访问的长期珍藏优化可能比仅在某些现代机器上进行磁盘访问更糟糕!

【讨论】:

  • 我也想知道这一点 - 将一些线程设计为 CPU 密集型,而另一些线​​程则 IO 密集型与混合 CPU / IO 并让调度程序找出正确的组合。
猜你喜欢
  • 1970-01-01
  • 2015-09-24
  • 2012-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-16
相关资源
最近更新 更多