过程&线程调度开销

时间:2015-07-31 21:31:22

标签: linux windows multithreading

在安排时,有一些我不太了解的事情:

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

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

1 个答案:

答案 0 :(得分:3)

  

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

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

  

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

这是一个复杂的优化决策。与更改地址空间的成本相比,吹出指令和数据缓存的成本通常很高,因此这并不像您想象的那么重要。通常,首先选择要调度所有可立即运行的线程的线程,并且处理粘性可能是影响要调度的核心的优化。

  

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

显然,线程必须经过大量的RAM访问,因为切换线程需要大量此类访问。硬盘驱动器和网络I / O通常都很慢,以至于等待这样的事情的线程被取消了。

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