Bob*_*der 7 .net c# multithreading
我一直在玩线程,试图将极限推到极致 - 为了我自己的娱乐.我知道线程池默认为25个线程,可以推送到1000(根据MSDN).但是,每个CPU核心的线程的实际限制是什么?在某些时候,上下文切换将导致比线程保存更多的瓶颈.有没有人有这方面的最佳做法?我们在说100,200,500吗?它取决于线程在做什么?除了框架规定的架构之外,什么决定每个CPU核心有多少线程以最佳方式运行?
当然,这完全取决于线程正在做什么.如果它们受CPU限制(比如坐在无限循环中),那么每个核心一个线程就足以使CPU饱和; 除此之外(你已经有更多,来自后台进程等),你将开始争用.
另一方面,如果线程不符合运行条件(例如在一些同步对象上被阻塞),那么你可以拥有的数量的限制将由CPU以外的因素决定(堆栈的内存,OS内部限制,等等).
如果您的应用程序不受CPU限制(如大多数),那么上下文切换并不是什么大问题,因为每次您的应用程序必须等待时,都需要进行上下文切换.线程太多的问题是关于操作系统数据结构和一些同步异常,比如饥饿,由于同步算法的随机性,线程永远(或很少)有机会执行.
如果你的应用程序是CPU绑定的(保留99%的时间在内存上,很少I/O或等待其他东西,如用户输入或其他线程),那么最佳的是每个逻辑核心1个线程,因为在此情况下不会有上下文切换.
请注意操作系统每次都会中断线程,即使只有一个线程用于多个CPU.操作系统中断线程不仅可以进行任务切换,还可以用于线程管理(例如更新计数器以显示在任务管理器上,或允许超级用户杀死它).
| 归档时间: |
|
| 查看次数: |
7740 次 |
| 最近记录: |