CRL线程池调度和配置的一些细节

首先声明的是,CRL线程池指的是 System.Threading.ThreadPool。
1,CLR中的一个线程池运行于一个进程,被进程中所有appdomain通用。
2,线程池中的线程在被用完回归到池中时,TLS槽的数据会被保留,其他数据如表示状态,身份模拟,优先级
等会被清除。
3,当工作项进入线程池时,新线程被创立,直到达到最优线程数。最优线程数等于CPU数量。达到这个数量后 ,

线程池采用启发式规则管理线程:

a,达到最优数量后,新线程创建速率被控制在500毫秒一个。
b,后台有一个守护进程管理线程池,观察是否存在线程饥饿或是空闲,按照复杂的算法决定是否创建或者移
除线程。其中考虑cpu的利用情况。在最大值和最小值范围内,若是利用率低,则创建线程,若是利用率高,
则考虑移除线程。
c,最大值和最小值可以做调整。最小值都默认为0,。 .net 2.0时,每个cpu默认最大值为25,2.0 sp1之后,
每个cpu扩展到250个。asp.net 的默认值被改了,最小值50,最大值100,可以通过配置 machine.config中
processModel节点属性值。通常asp.net 是不使用线程池中的线程来处理web请求的,但是一些组件,I/O操作
,异步操作可能会使用线程池,所以你自己的业务逻辑能使用多少线程是不可预知的,一个建议是不使用CRL
自带的线程池而去自己实现一个或者第三方的。还有一个好消息是你可以通过配置system.web>httpRuntime
节点的minFreeThreed属性,来保证线程池给予最小线程数不用于asp.net处理请求,而归你自己调用。

4,线程池尚未提供的功能:

a,线程没有优先级可言。
b,appdomain和组件间共享线程池,没有提供隔离。

原文地址:https://www.cnblogs.com/wusong/p/2607860.html