2012-01-15 99 views
1

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

+0

我不会说上下文切换是没有用的。实施任何一种“多任务”系统都是至关重要的。说上下文切换花费的时间是纯粹的开销,恕我直言,过度简化;这就像是说增加时间是开销。物理机器内部的任何处理都需要时间......而且可用寄存器的数量由指令集和ABI公约定义 – 2012-01-15 07:17:24

+0

有效点@BasileStarynkevitch,我应该更仔细地问这个问题。 – 2012-01-15 07:20:44

+0

我正在投票结束,因为我不知道“是否使用更多注册帮助我们这样做?”的意思。 – Mikhail 2016-05-13 05:58:51

回答

1

你是请问是什么操作系统?上下文切换时间取决于您必须保存/恢复的寄存器。您可以节省时间的一种方法是通过新处理器上的AVX扩展,使您可以将所有寄存器保存/恢复到一块内存。

+0

不,我不写操作系统。这个,我在采访中被问过 – 2012-01-15 07:18:36

+0

你不能直接改变上下文切换时间。避免在上下文切换中花费时间的唯一方法是避免分配比CPU更多的活动线程,并且不要阻塞线程(即通过休眠或关键部分) – 2012-01-15 07:20:39

1

最小化上下文大小和/或避免上下文切换。如何做到这一点取决于上下文(而不是你正在切换的上下文,而是问题的上下文,CPU,操作系统等)。

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

+0

确实如此,但在现代处理器上[它们不打扰TS标志](http://stackoverflow.com/questions/2711044/why-doesnt-linux-use-the-hardware-context-switch-via-the-tss)了。 – doug65536 2016-05-13 09:23:17

0

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

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

+0

我回答了[this](http://stackoverflow.com/questions/8868135/how-do-we-reduce-context-switch-time#comment11081651_8868147) – doug65536 2016-05-13 09:26:39