2011-08-31 52 views
1

从我的另一问题,关于SO我发现了其可能的是下面的简单方法上下文开关和线程执行在不同的CPU内核

void B() 
    { 
    if (_complete) 
    { 
     Console.WriteLine (_answer); 
    } 
    } 

可以在不同的CPU,如果上下文切换,如果与控制台之间发生执行writeline call ..这是我的新闻,所以我现在想知道什么时候可以单线程代码切换到另一个CPU,以及为什么它可能在上述这样简单的情况下有意义?

回答

4

基本上,上下文切换是操作系统“冻结”一个线程的位置,以便另一个线程可以获得一些CPU时间。当第一个线程“解冻”时,不需要它继续在之前运行的CPU上运行。这个细节取决于操作系统的决定。

例如,如果解冻线程时有一个未使用的完整内核,这与正在运行的前一个内核不同,那么不使用空闲内核会是浪费。

+2

+1 - 只需添加,您可以为线程设置Affinity以确保它返回到同一个处理器/内核 - 尽管通常不需要。 –

+0

@Andras好的一点,你*可以*设置处理器的亲和力。我的意思是,这不是默认情况下。 – dlev

+0

您可以通过API调用或通过任务管理器来设置处理器关联。 http://msdn.microsoft.com/en-us/library/system.diagnostics.processthread.processoraffinity。aspx然而,正如其他人所说,这通常不应该。我在执行CPU密集型渲染时通过任务管理器完成了此操作,以确保渲染软件不能使用其中一个(12个)内核,以便Windows UI保持响应。 –

6

时可以单个线程的代码转换成为另一个CPU

这可以发生在任何时间。这就是说,你应该真的,为实际目的,从不关心。这是任何多任务操作系统的功能。

为什么它在上述这样简单的情况下有意义?

它不会帮助代码可言。它确实允许操作系统更好地平衡和处理在系统上运行的其他进程。

+0

两个答案都很好,你认为我的速度快了5秒,但我认为病态标记dlev作为答案,因为它得到了亲和力的讨论这是有趣的 –

0

时可以单个线程代码成为切换为另一个CPU

任何时间。

请记住,CPU/OS没有看到您的代码。它看到机器指令,这与您编写的代码非常不同 - 机器指令通常(始终)以原子方式执行,但是您的程序可以在任何指令之间被抢占/重新编译。

以及为什么它在上述这样简单的情况下有意义?

在商品操作系统上有preemtive调度,您的程序不是唯一运行的代码。操作系统可能需要停止你的代码,让其他进程/线程/服务/中断处理程序运行。

当你的进程再次运行时,可能它先前运行的CPU被占用,而另一个CPU可用 - 所以OS会在该CPU上安排你的进程。

相关问题