Windows中 线程 进程 内存 杂谈

来源:互联网 发布:梁山传奇翅膀进阶数据 编辑:程序博客网 时间:2024/06/15 02:52
1、默认情况下,一个线程的栈要预留1M的内存空间,而一个进程中可用的内存空间只有2G,


   所以理论上一个进程中最多可以开2048个线程,但是内存当然不可能完全拿来作线程的栈,
   
   所以实际数目要比这个值要小,你也可以通过构造线程时修改默认堆栈大小,将其改的比较小,
   
   这样就可以多开一些线程,如将默认栈的大小改成512K,这样理论上最多就可以开4096个线程,


  即使物理内存再大,一个进程中可以起的线程总要受到2GB这个内存空间的限制,这是ms做的硬性条件,


仔细想想有这样的必要的,是么,比方说你的机器装了64GB物理内存,但每个进程的内存空间还是4GB,其中用户态可用的还是2GB,


  如果是同一台机器内的话,能起多少线程也是受内存限制的,每个线程对象都要占用非页面内存,而非页面内存也是有限的,当非页面内存被耗尽时,也就无法创建线程了,


  如果物理内存非常大,同一台机器内可以跑的线程数目的限制值会越来越大


2、在Windows下写个程序,一个进程构造出2000个左右线程就会异常退出了,为什么?


  这个问题的产生是因为windows32位系统,一个进程所能使用的最大虚拟内存为2G,而一个线程的默认线程栈StackSize为1024K(1M),
 这样当线程数量逼近2000时,2000*1024K=2G(大约),内存资源就相当于耗尽


3、C#修改线程默认的堆栈大小
 看看thread的构造函数先,Thread(ThreadStart, Int32),看到了么,int32,就是用来设置线程的最大堆栈大小的,只是我们平日里,都使用默认的罢了,具体的可以参考Thread 类的构造函数
4、windows中可以开启的进程数(估算)
最小进程数 = 物理内存量 / 2G   #当然了实际情况,不可能是这样的,看看耗内存的程序,oracle不过才800M,vs2012不过才500M,qq才30M,所以这个最小只能随时理论上的吧
最大进程数 = 物理内存量 / 1M   #拿2G的内存来说,也就是说最大进程数,理论应该是2048个,你见过那个机器跑这么多个进程吗,反正额是没有的啦,作为dev,也就100个左右吧,
                               看来理论和实际差距还是很大的啊
5、windows中可以开启的线程数(估算)
最小线程数 = 1                     #实际情况是不可能的了,你裸装系统,跑起来,估计都要几十个线程
最大线程数 = (物理内存量/2G)*2048  #理论应该是这个样子的
0 0