精华内容
下载资源
问答
  • WINDOWS操作系统中可以允许最大线程数

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

    也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

                   
    默认情况下,一个线程的栈要预留1M的内存空间  而一个进程中可用的内存空间只有2G,所以理论上一个进程中最多可以开2048个线程  但是内存当然不可能完全拿来作线程的栈,所以实际数目要比这个值要小。  你也可以通过连接时修改默认栈大小,将其改的比较小,这样就可以多开一些线程。  如将默认栈的大小改成512K,这样理论上最多就可以开4096个线程。  即使物理内存再大,一个进程中可以起的线程总要受到2GB这个内存空间的限制。  比方说你的机器装了64GB物理内存,但每个进程的内存空间还是4GB,其中用户态可用的还是2GB。  如果是同一台机器内的话,能起多少线程也是受内存限制的。每个线程对象都要站用非页面内存,而非页面内存也是有限的,当非页面内存被耗尽时,也就无法创建线程了。  如果物理内存非常大,同一台机器内可以跑的线程数目的限制值会越来越大。  在Windows下写个程序,一个进程Fork出2000个左右线程就会异常退出了,为什么?  这个问题的产生是因为windows32位系统,一个进程所能使用的最大虚拟内存为2G,而一个线程的默认线程栈StackSize为1024K(1M),这样当线程数量逼近2000时,2000*1024K=2G(大约),内存资源就相当于耗尽。  MSDN原文:  “The number of threads a process can create is limited by the available virtual memory. By default, every thread has one megabyte of stack space. Therefore, you can create at most 2,028 threads. If you reduce the default stack size, you can create more threads. However, your application will have better performance if you create one thread per processor and build queues of requests for which the application maintains the context information. A thread would process all requests in a queue before processing requests in the next queue.”  如何突破2000个限制?  可以通过修改CreateThread参数来缩小线程栈StackSize,例如  #define   MAX_THREADS   50000  DWORD   WINAPI   ThreadProc(   LPVOID   lpParam   ){  while(1){  Sleep(100000);  }  return   0;  }  int   main()   {  DWORD   dwThreadId[MAX_THREADS];  HANDLE   hThread[MAX_THREADS];  for(int   i   =   0;   i   <   MAX_THREADS;   ++i)  {  hThread[i]  = CreateThread(064, ThreadProc, 0, STACK_SIZE_PARAM_IS_A_RESERVATION,   &dwThreadId[i]);  if(0   ==   hThread[i])  {  DWORD   e   =   GetLastError();  printf("%d\r\n",e);  break;  }  }  ThreadProc(0);  }  服务器端程序设计  如果你的服务器端程序设计成:来一个client连接请求则创建一个线程,那么就会存在2000个限制(在硬件内存和CPU个数一定的情况下)。建议如下:  The "one thread per client" model is well-known not to scale beyond a dozen clients or so. If you're going to be handling more than that many clients simultaneously, you should move to a model where instead of dedicating a thread to a client, you instead allocate an object. (Someday I'll muse on the duality between threads and objects.) Windows provides I/O completion ports and a thread pool to help you convert from a thread-based model to a work-item-based model.  1. Serve many clients with each thread, and use nonblocking I/O and level-triggered readiness notification  2. Serve many clients with each thread, and use nonblocking I/O and readiness change notification  3. Serve many clients with each server thread, and use asynchronous I/O  --------------------  附:Win32将低区的2GB留给进程使用, 高区的2GB则留给系统使用。  Linux将高位1GB留给内核,低位3GB留给进程。

               

    给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow

    这里写图片描述
    展开全文
  • 单个进程中最大允许线程数

    千次阅读 2018-07-13 09:46:52
    1. 与系统资源相关,即线程栈的大小 a) 线程栈默认大小可以通过‘ulimit -s’查看,通常这个值是8M。如果用户修改了该值,则可以查看’/proc/self/limits’获取该进程相应的值 (其实是需要考虑线程栈和guard page...

    1.      与系统资源相关,即线程栈的大小

     

    a)        线程栈默认大小可以通过‘ulimit -s’查看,通常这个值是8M。如果用户修改了该值,则可以查看’/proc/self/limits’获取该进程相应的值 (其实是需要考虑线程栈和guard page的size)

    b)       在32系统上用户空间大小为3G,3 * 1024 / 8 ~= 384

    c)        程序其他数据需要占用一部分内存空间,则384 – 1 = 383; 进程中还包含一个主线程,则 383 – 1 = 382; linuxthreads 还需要一个管理线程, 则382 – 1 = 381

    d)       可以通过缩减栈的大小来上调单个进程的最大的线程数。

                            i.             Ulimit –s 设置系统默认的栈大小

                          ii.             调用 pthread_create 的时候用 pthread_attr_getstacksize 设置一个较小的栈大小

    2.      Glibc设置相关

    a)        老版本的glibc中会通过“/usr/include/bits/local_lim.h ”中的”PTHREAD_THREADS_MAX”控制单个进程中最大的线程数,即使栈再小,线程的个数也不能超过这个限制的值;除非重新编译glibc;

    b)       新版本的glibc, 这个限制作了调整(待研究)

     


    展开全文
  • 默认情况下,一个线程的栈要预留1M的内存空间 而一个进程中可用的内存空间只有2G,所以理论上一个进程中最多可以开2048个线程 但是内存当然不可能完全拿来作线程的栈,所以实际数目要比这个值要小。 你也可以通过...

    默认情况下,一个线程的栈要预留1M的内存空间 
    而一个进程中可用的内存空间只有2G,所以理论上一个进程中最多可以开2048个线程 
    但是内存当然不可能完全拿来作线程的栈,所以实际数目要比这个值要小。 
    你也可以通过连接时修改默认栈大小,将其改的比较小,这样就可以多开一些线程。 
    如将默认栈的大小改成512K,这样理论上最多就可以开4096个线程。 

    即使物理内存再大,一个进程中可以起的线程总要受到2GB这个内存空间的限制。 
    比方说你的机器装了64GB物理内存,但每个进程的内存空间还是4GB,其中用户态可用的还是2GB。


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

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

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

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

    如果你的服务器端程序设计成:来一个client连接请求则创建一个线程,那么就会存在2000个限制(在硬件内存和CPU个数一定的情况下)。

    展开全文
  • WINDOWS操作系统中可以允许最大线程数 来源:考试大 【考试大:你最佳的考试选择】 2010年10月21日  默认情况下,一个线程的栈要预留1M的内存空间  而一个进程中可用的内存空间只有2G,所以...

    WINDOWS操作系统中可以允许最大的线程数

    来源:考试大   【考试大:你最佳的考试选择】   2010年10月21日

      默认情况下,一个线程的栈要预留1M的内存空间

      而一个进程中可用的内存空间只有2G,所以理论上一个进程中最多可以开2048个线程

      但是内存当然不可能完全拿来作线程的栈,所以实际数目要比这个值要小。

      你也可以通过连接时修改默认栈大小,将其改的比较小,这样就可以多开一些线程。

      如将默认栈的大小改成512K,这样理论上最多就可以开4096个线程。

      即使物理内存再大,一个进程中可以起的线程总要受到2GB这个内存空间的限制。

      比方说你的机器装了64GB物理内存,但每个进程的内存空间还是4GB,其中用户态可用的还是2GB。

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

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

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

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

      MSDN原文:

      “The number of threads a process can create is limited by the available virtual memory. By default, every thread has one megabyte of stack space. Therefore, you can create at most 2,028 threads. If you reduce the default stack size, you can create more threads. However, your application will have better performance if you create one thread per processor and build queues of requests for which the application maintains the context information. A thread would process all requests in a queue before processing requests in the next queue.”

      如何突破2000个限制?

      可以通过修改CreateThread参数来缩小线程栈StackSize,例如

      #define   MAX_THREADS   50000

      DWORD   WINAPI   ThreadProc(   LPVOID   lpParam   ){

      while(1){

      Sleep(100000);

      }

      return   0;

      }

      int   main()   {

      DWORD   dwThreadId[MAX_THREADS];

      HANDLE   hThread[MAX_THREADS];

      for(int   i   =   0;   i   <   MAX_THREADS;   ++i)

      {

      hThread[i]  = CreateThread(0,  64, ThreadProc, 0, STACK_SIZE_PARAM_IS_A_RESERVATION,   &dwThreadId[i]);

      if(0   ==   hThread[i])

      {

      DWORD   e   =   GetLastError();

      printf("%d\r\n",e);

      break;

      }

      }

      ThreadProc(0);

      }

      服务器端程序设计

      如果你的服务器端程序设计成:来一个client连接请求则创建一个线程,那么就会存在2000个限制(在硬件内存和CPU个数一定的情况下)。建议如下:

      The "one thread per client" model is well-known not to scale beyond a dozen clients or so. If you're going to be handling more than that many clients simultaneously, you should move to a model where instead of dedicating a thread to a client, you instead allocate an object. (Someday I'll muse on the duality between threads and objects.) Windows provides I/O completion ports and a thread pool to help you convert from a thread-based model to a work-item-based model.

      1. Serve many clients with each thread, and use nonblocking I/O and level-triggered readiness notification

      2. Serve many clients with each thread, and use nonblocking I/O and readiness change notification

      3. Serve many clients with each server thread, and use asynchronous I/O

      --------------------

      附:Win32将低区的2GB留给进程使用, 高区的2GB则留给系统使用。

      Linux将高位1GB留给内核,低位3GB留给进程。

     

    展开全文
  • WINDOWS操作系统中可以允许最大线程数 默认情况下,一个线程的栈要预留1M的内存空间  而一个进程中可用的内存空间只有2G,所以理论上一个进程中最多可以开2048个线程  但是内存当然不可能完全拿来作线程的...
  • 连接达到最大时,允许排队的最大连接(Maximum queue length for incoming connection requests when all possible request processing threads are in use.),默认为100; 2. server.tomcat.max-connections...
  • 默认情况下,一个线程的栈要预留1M的内存空间 而一个进程中可用的内存空间只有2G,所以理论上一个进程中最多可以开2048个线程 但是内存当然不可能完全拿来作线程的栈,所以实际数目要比这个值要小。 你也可以通过...
  • 单个进程最大线程数

    千次阅读 2016-09-22 00:12:37
    windows 操作系统中允许最大线程数。   =========================================================================== 默认情况下,一个线程的栈要预留1M的内存空间 而一个进程中可用的内存空间...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 623
精华内容 249
关键字:

允许最大线程数