多处理器 CPU 可以避免上下文切换吗?
Can Multiprocessor CPUs avoid context-switching?
今天的计算机体系结构正在努力使寄存器的数量最大化。访问寄存器(是cpu附近的集成内存电路)比访问一级缓存更快。问题是,每个上下文切换都必须将所有寄存器保存到缓存中,因为下一个线程需要其他寄存器值。现代 CPU 正在做的是在一秒钟内循环执行 100 个任务,每次它保存寄存器,并获取旧的直到任务可以开始。
恕我直言,一个任务使用一个 CPU 会很好,并且不会发生上下文切换。这意味着我们得到 100 CPUs,每 1000 个寄存器必须永远不会被保存。这可能吗?还是我忽略了一个重要的细节?
完全避免上下文切换的唯一方法是至少拥有与任务一样多的内核。通常,无法保证可能 运行 的最大任务数。当前的 GPU 和众核处理器以及 co-processors 包含数百个小内核。如果将这些东西中的多个放在同一个系统或系统集群中,则可以拥有数千个或更多的核心。尽管如此,即使您可以通过这种设计避免上下文切换,这些内核也比传统的 high-end CPU 内核慢得多,因此净效果可能是负面的。
但让我们退后一步。上下文切换的数量主要不是由任务和内核的数量决定的。任务不只是执行计算,它们还需要与 I/O 设备交互并等待其他任务或用户输入的结果等事情发生。所以有些任务会处于等待状态。上下文切换的开销不仅取决于任务的数量,还取决于这些任务的行为。
处理器架构师和 OS 开发人员都知道上下文切换开销,并采用各种技术来减轻它。例如,x86 提供了许多指令,这些指令被调整为保存当前任务的上下文(部分)。 OS 线程调度程序使用优先级、抢占(服务器上可能有大量时间片)和优先级提升等技术。所有这些都有助于减少上下文切换的次数,从而减少它们的总体开销。此外,减少上下文切换的开销并不是唯一重要的事情。特别是,系统的响应能力也非常重要,这与开销不一致。
今天的计算机体系结构正在努力使寄存器的数量最大化。访问寄存器(是cpu附近的集成内存电路)比访问一级缓存更快。问题是,每个上下文切换都必须将所有寄存器保存到缓存中,因为下一个线程需要其他寄存器值。现代 CPU 正在做的是在一秒钟内循环执行 100 个任务,每次它保存寄存器,并获取旧的直到任务可以开始。
恕我直言,一个任务使用一个 CPU 会很好,并且不会发生上下文切换。这意味着我们得到 100 CPUs,每 1000 个寄存器必须永远不会被保存。这可能吗?还是我忽略了一个重要的细节?
完全避免上下文切换的唯一方法是至少拥有与任务一样多的内核。通常,无法保证可能 运行 的最大任务数。当前的 GPU 和众核处理器以及 co-processors 包含数百个小内核。如果将这些东西中的多个放在同一个系统或系统集群中,则可以拥有数千个或更多的核心。尽管如此,即使您可以通过这种设计避免上下文切换,这些内核也比传统的 high-end CPU 内核慢得多,因此净效果可能是负面的。
但让我们退后一步。上下文切换的数量主要不是由任务和内核的数量决定的。任务不只是执行计算,它们还需要与 I/O 设备交互并等待其他任务或用户输入的结果等事情发生。所以有些任务会处于等待状态。上下文切换的开销不仅取决于任务的数量,还取决于这些任务的行为。
处理器架构师和 OS 开发人员都知道上下文切换开销,并采用各种技术来减轻它。例如,x86 提供了许多指令,这些指令被调整为保存当前任务的上下文(部分)。 OS 线程调度程序使用优先级、抢占(服务器上可能有大量时间片)和优先级提升等技术。所有这些都有助于减少上下文切换的次数,从而减少它们的总体开销。此外,减少上下文切换的开销并不是唯一重要的事情。特别是,系统的响应能力也非常重要,这与开销不一致。