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