【问题标题】:How do we reduce Context Switch time我们如何减少上下文切换时间
【发布时间】:2012-01-15 07:12:05
【问题描述】:

我们都知道上下文切换时间是纯粹的开销并且没有用。但我想知道如何减少上下文切换时间。使用更多寄存器是否有助于我们这样做?

【问题讨论】:

  • 我不会说上下文切换没有用。实现任何类型的“多任务”系统都是至关重要的。说上下文切换所花费的时间是纯粹的开销,恕我直言,过于简化了;这就像说做加法的时间是开销。物理机内部的任何处理都需要时间......并且可用寄存器的数量由指令集和 ABI 约定定义
  • 有效点@BasileStarynkevitch,我应该更小心地被问到这个问题。
  • 我投票结束,因为我不知道“使用更多的寄存器帮助我们这样做吗?”是什么意思。
  • 很好XY question。我的回答是 Y。

标签: operating-system context-switch


【解决方案1】:

您在编写操作系统吗?上下文切换时间取决于您必须保存/恢复的寄存器。您可以节省时间的一种方法是通过新处理器上的 AVX 扩展,它允许您将所有寄存器保存/恢复到一个内存块。

【讨论】:

  • 不,我不是在写操作系统。这个,我在采访中被问到过
  • 不能直接更改上下文切换时间。避免在上下文切换中花费时间的唯一方法是避免分配比 CPU 更多的活动线程,并且不阻塞线程(即通过睡眠或临界区)
【解决方案2】:

最小化上下文大小和/或避免上下文切换。具体怎么做取决于上下文(不是您要切换的上下文,而是问题的上下文、CPU、操作系统等)。

在 x86 CPU 上,如果浮点单元没有改变,您可以避免不必要的保存和恢复状态。这是通过在上下文切换期间将CR0 中的task switched 位设置为1,然后等待源自新线程的第一条FPU 指令的特殊CPU 异常来完成的。当它发生时,您保存旧线程的 FPU 状态,加载当前线程的 FPU 状态,重置 CR0.TS 并在该 FPU 指令处恢复执行。如果线程来来去去但没有发生异常,这意味着线程没有进行 FPU 工作,并且您没有进行完整的上下文切换。

【讨论】:

【解决方案3】:

实现线程策略、同步机制和数据结构以最大限度地减少锁争用取决于程序员。当一个线程试图获取一个已经被另一个线程获取的锁时,它别无选择,只能轮询几次,希望它们能在很短的时间内释放它,然后放弃并进行上下文切换。

如果这个问题是从 linux 管理员的角度出发的,您可以通过增加最小时间片(参见 sched_latency_ns 和 sched_min_granularity_ns)或确保对处理器的需求小于或等于可用处理器的数量。当您有空闲处理器时,上下文切换率会显着降低 - 它不需要“切换”任何现有处理器,它可以使用空闲处理器。

【讨论】: