C#当托管线程结束其时间片时,是否会导致上下文切换?

时间:2010-06-20 02:09:42

标签: windows multithreading .net-4.0

在Russinovich的书中,它表示该线程(注意:这是关于OS线程)如果a)准备就绪需要调度(调度)b)结束其时间片,产量或块。

我的C#实时应用程序中有一个托管线程,对于实现尽可能少的上下文切换非常重要。

此线程具有最高优先级,并且该进程具有实时优先级,这使得我的线程OS优先级为21。

当我的帖子结束其时间片时会发生什么,没有等待线程优先级> = 26?

是否会有一个上下文切换来重新安排我的线程再次运行或者将避免上下文切换并且线程将不间断地运行?

如果有上下文切换 - 任何人都可以告诉平均需要多少CPU周期

我很欣赏简单和明确的答案!

谢谢!

1 个答案:

答案 0 :(得分:4)

你怎么能在非实时操作系统上进行实时应用? Here's有关实时操作系统的信息

如果您的主题具有最高优先级,则最终可能会出现无响应的系统(http://blogs.msdn.com/b/oldnewthing/archive/2010/06/10/10022675.aspx)

  

我的帖子会发生什么   当它结束它的时间片和那里   是没有等待优先级> = 26的线程?

如果没有其他线程具有相同或更高的优先级并且您的线程没有阻塞(睡眠,等待等) - 那么系统将使用新的时间片重新安排它。

来自MSDN article:“系统将所有线程视为具有相同的优先级。系统将循环方式的时间片分配给具有最高优先级的所有线程。如果这些线程都没有准备就绪为了运行,系统以循环方式为具有次高优先级的所有线程分配时间片。如果有更高优先级的线程可用于运行,系统将停止执行优先级较低的线程(不允许它完成使用其时间片),并将全时片分配给优先级较高的线程“

  

将有一个上下文切换到   重新安排我的线程再次运行或   上下文切换将被避免和   线程将不间断地运行?

当线程转换到内核模式(块,休眠)时,将发生上下文切换 您可以使用Thread.SpinWait阻止线程进行上下文切换。

  

如果有上下文切换 - 可以   任何人都知道它有多少CPU周期   平均需要?

假设上下文切换是由中断启动的,在(2.8 GHz)P4上从用户级切换到内核级的开销是1348个周期,在(200 MHz)P2 227周期内。为什么大循环差异?似乎P4将其微操作高速缓存刷新为处理中断的一部分(有关微操作高速缓存的一些详细信息,请访问arstechnica.com)。计算实际时间,P4需要481 ns,P2需要1335 ns。

从内核级到用户级的返回将在P4上花费923个周期(330 ns),在P2上花费180个周期(900 ns)。

存储/恢复寄存器(不计算任何TLB开销/不包括FPU寄存器存储/恢复成本)的开销是P4上的188个周期(67 ns),P2上的79个周期(395 ns)。 (取自here