我们都知道上下文切换时间是纯粹的开销并且没有用。但我想知道如何减少上下文切换时间。使用更多寄存器是否有助于我们这样做?
3 回答
最小化上下文大小和/或避免上下文切换。究竟如何做到这一点取决于上下文(不是您要切换的上下文,而是问题的上下文、CPU、操作系统等)。
在 x86 CPU 上,如果浮点单元没有改变,您可以避免不必要的保存和恢复状态。这是通过在上下文切换期间将该task switched
位设置CR0
为 1 来完成的,然后等待源自新线程的第一条 FPU 指令的特殊 CPU 异常。当它发生时,您保存旧线程的 FPU 状态,加载当前线程的 FPU 状态,重置CR0.TS
并在该 FPU 指令处恢复执行。如果线程来来去去,但没有发生异常,这意味着线程没有进行 FPU 工作,并且您没有进行完整的上下文切换。
你在写操作系统吗?上下文切换时间取决于您必须保存/恢复的寄存器。您可以节省时间的一种方法是通过新处理器上的 AVX 扩展,它允许您将所有寄存器保存/恢复到一个内存块。
实现线程策略、同步机制和数据结构以最小化锁争用将取决于程序员。当一个线程试图获取一个已经被另一个线程获取的锁时,它别无选择,只能轮询几次,希望它们能在很短的时间内释放它,然后放弃并进行上下文切换。
如果这个问题是从 linux 管理员的角度出发的,您可以通过增加最小时间片(参见 sched_latency_ns 和 sched_min_granularity_ns)或确保对处理器的需求小于或等于可用的数量来减少上下文切换所花费的时间处理器。当您有备用处理器时,上下文切换率会显着降低 - 它不需要“切换”任何现有的处理器,它可以使用空闲的处理器。