Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net Windows每秒切换线程的频率是多少?_.net_Windows_Multithreading - Fatal编程技术网

.net Windows每秒切换线程的频率是多少?

.net Windows每秒切换线程的频率是多少?,.net,windows,multithreading,.net,Windows,Multithreading,Windows(通常)每秒执行线程切换的频率是多少?这与.NET线程不同吗?或者反过来问:一个线程(比如说,正常线程优先级)允许运行多长时间?每个处理器每秒300次的上下文切换速率是中等的 Windows2000必须对此进行测量。Windows上下文切换的频率取决于系统“量程”。根据操作系统是客户机还是服务器,此量程范围为10-15毫秒(每秒66-100次)。要了解更多细节,我建议阅读Joe Duffy的书《Windows上的并发编程》;它非常详细地介绍了这类事情——例如,“客户端操作系统……是

Windows(通常)每秒执行线程切换的频率是多少?这与.NET线程不同吗?或者反过来问:一个线程(比如说,正常线程优先级)允许运行多长时间?

每个处理器每秒300次的上下文切换速率是中等的


Windows2000必须对此进行测量。

Windows上下文切换的频率取决于系统“量程”。根据操作系统是客户机还是服务器,此量程范围为10-15毫秒(每秒66-100次)。要了解更多细节,我建议阅读Joe Duffy的书《Windows上的并发编程》;它非常详细地介绍了这类事情——例如,“客户端操作系统……是2个时钟间隔……在服务器操作系统上……是12个时钟间隔”。此外,他的文章[CLR Inside-Out:Using concurrency for scalability][1]也是必读的

你可以“编辑”量子长度。如果将performance Options/Advanced in System Properties中的“Adjust for best performance of:”设置为“Programs”,您将获得更短的量程。如果您将其设置为“后台服务”,您将获得更长的量程

如果没有理由切换上下文,线程将获得所需的时间


[1]

在典型系统上,这在很大程度上取决于I/O负载。当线程调用I/O时,大量的磁盘和网络活动将生成大量的上下文切换,这些线程将被阻塞,并在稍后再次准备就绪。正在运行的应用程序的复杂性和设计也会影响上下文切换率-具有大量线程、大量锁、锁内工作过多、与通信数据大小相比线程间通信过多、愚蠢的轮询等的应用程序将推高上下文更改率

在大多数系统上,大多数时候,关于“量子”、“时间片”等的内容都是无关紧要的——只是I/O驱动的抢占式多任务中的一个脚注,它只会定期出现在具有比内核更为就绪、CPU密集的线程的机器上,即那些严重过载或运行CPU密集型应用程序的机器上


正常优先级的线程被允许运行,直到它被预先指定,通常是通过它选择等待I/O或来自另一个线程的信号。即使它没有I/O或信令,也就是说完全受CPU限制,但如果盒子从未过载,它仍可能永远运行(即准备好的线程永远不会比内核多)

你能描述一下你试图解决的实际编程问题吗?您正在尝试加快上下文切换的速度吗?减少它们?@HansPassant-没有被你的参考文献所认可-阅读前几行,却发现它在提到I/O之前提到了“一个数量,或者CPU分配的时间片数”。没有进一步阅读。然而另一个令人绝望的误导和组织不良的线程介绍。@MartinJames我在汉斯提到的任何地方都看不到这句话。但是,量子的定义与I/O有什么关系呢?一般来说,你应该就你的具体问题提出问题,而不是就比你的问题更复杂的问题提出模糊的问题。计时分辨率基于时钟滴答声,Windows通常以10到15毫秒的速度运行时钟。更详细地说,Windows并不是以恒定速率运行时钟的。它是根据当前负载自适应的。上下文切换非常昂贵,因此过多的上下文切换会影响性能。是的,即使cpu本身以动态方式改变频率,我们也无法预测它是什么。“Windows上下文切换的频率取决于系统的“量程”-不!99%的Windows设备(那些没有过载且没有运行CPU密集型应用程序的设备)上都没有。只有当某个线程需要从一个线程切换到另一个线程时,才会有上下文切换,只有当系统超额订阅CPU时才会发生这种情况。如果系统不需要给线程时间来执行(例如,系统负载不重,也没有超额订阅),则无需进行上下文切换。i、 你说的是两件不同的事情。系统是否需要切换上下文与id的频率不同does@MartinJames当然,您可以使用
Thread.Sleep(timeout>=1)
来“强制”上下文切换,但这是另一种情况:)有人说“上下文切换是“从硬件保存或恢复此状态的过程”“”每次在I/O上被阻塞的线程被驱动程序信号准备就绪时都会发生这种情况。上下文已从“IO等待”更改为“准备就绪”(希望是“正在运行”)。它的状态是从硬件恢复的-根据您的定义是上下文切换:)同样,是的,当IO上阻塞的线程由于IO已完成而变为未阻塞时,可能会发生上下文切换。但是,发生上下文切换也有其他原因,其中一个原因是由于处理器过度订阅,操作系统会安排CPU绑定的线程。是的,这可能很少见,您可以设计代码来避免它;但是,这种情况仍然存在。上下文切换是“从硬件保存或恢复此状态的过程”。虽然IO会引起上下文切换,但上下文切换并不依赖于IO。当一个线程是CPU时间的候选线程且当前没有可用的CPU(由另一个线程使用)时,必须发生上下文切换。当您在超时大于0的情况下调用
Thread.Sleep
时,也会发生上下文切换。当系统将CPU分配给线程时,会以量子定义的速率发生。没有人说切换是突然发生的,它的发生是有原因的。当它发生时,它发生的频率是有粒度的。看,上下文切换只能在进入操作系统时发生。它只能通过一个中断输入,或者是一个“真正的”驱动程序中断(目前为止最重要的),或者是一个可以改变运行线程集的操作系统调用。听起来好像你在说操作系统不能在没有som的情况下安排线程运行