一个进程(Process)最多可以生成多少个线程(Thread)
#define MAX_THREADS 50000 #includeWindows.h#includestdio.h DWORD WINAPI ThreadProc(LPVOID lpParam){ while(1) { Sleep(100000); } return 0;}int main(){ DWORD dwThreadId[MAX_THREADS]; HANDLE hThread[MAX_THREADS]; void*stack[MAX_THREADS]; for(int i = 0; i MAX_THREADS;++i) { hThread[i]= CreateThread(0,0, ThreadProc, 0, CREATE_SUSPENDED,dwThreadId[i]); if(0 == hThread[i]) { DWORD e = GetLastError(); if(e == 8) { printf("Out of Memory!\n",e); } else { printf("%d\r\n",e); } break; } else { printf("%d:%d\r\n",i,hThread[i]); } } ThreadProc(0);}程序的运行结果是:2.如何突破2000个限制? 你也可以通过连接时修改默认栈大小,将其改的比较小,这样就可以多开一些线程。 如将默认栈的大小改成512K,这样理论上最多就可以开4096个线程。 即使物理内存再大,一个进程中可以起的线程总要受到2GB这个内存空间的限制。比方说你的机器装了64GB物理内存,但每个进程的内存空间还是4GB,其中用户态可用的还是2GB。 如果是同一台机器内的话,能起多少线程也是受内存限制的。每个线程对象都要站用非页面内存,而非页面内存也是有限的,当非页面内存被耗尽时,也就无法创建线程了。 如果物理内存非常大,同一台机器内可以跑的线程数目的限制值会越来越大。 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,048 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.”可以通过修改CreateThread参数来缩小线程栈StackSize,例如#define MAX_THREADS 50000 #includeWindows.h#includestdio.h DWORD WINAPI ThreadProc(LPVOID lpParam){ while(1) { Sleep(100000); } return 0;}int main(){ DWORD dwThreadId[MAX_THREADS]; HANDLE hThread[MAX_THREADS]; void*stack[MAX_THREADS]; for(int i = 0; i MAX_THREADS;++i) { hThread[i]= CreateThread(0,512 * 1024, ThreadProc, 0,STACK_SIZE_PARAM_IS_A_RESERVATION| CREATE_SUSPENDED,dwThreadId[i]); if(0 == hThread[i]) { DWORD e = GetLastError(); if(e == 8) { printf("Out of Memory!\n",e); } else { printf("%d\r\n",e); } break; } else { printf("%d:%d\r\n",i,hThread[i]); } } ThreadProc(0);} 注意上面红色带下划线变化的部分!(0==512 * 1024,加上了STACK_SIZE_PARAM_IS_A_RESERVATION字段) 程序的运行结果是: 可以开启的线程数增长了一倍!! 服务器端程序设计如果你的服务器端程序设计成:来一个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 notification2. Serve many clients with each thread, and use nonblocking I/O and readiness change notification3. Serve many clients with each server thread, and use asynchronous I/O上面几句哈的核心的思想是:使用异步I/O,和一个线程处理多个客户请求!!
网站建设哪家好,找成都创新互联!专注于网页设计、网站建设、微信开发、小程序开发、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了神木免费建站欢迎大家使用!
服务器cpu数、核数、线程数
根据李同学的介绍和网上各种资源介绍,我终于搞懂了服务器这几个数,哦耶
这个服务器共有2个物理cpu,8个核,8条线程
线程池七大核心参数
线程池七大核心参数如下所示:
一、corePoolSize 线程池核心线程大小
线程池中会维护一个最小的线程数量,即使这些线程处理空闲状态,他们也不会被销毁,除非设置了allowCoreThreadTimeOut。这里的最小线程数量即是corePoolSize。任务提交到线程池后,首先会检查当前线程数是否达到了corePoolSize,如果没有达到的话,则会创建一个新线程来处理这个任务。
二、maximumPoolSize 线程池最大线程数量
当前线程数达到corePoolSize后,如果继续有任务被提交到线程池,会将任务缓存到工作队列(后面会介绍)中。如果队列也已满,则会去创建一个新线程来出来这个处理。线程池不会无限制的去创建新线程,它会有一个最大线程数量的限制,这个数量即由maximunPoolSize指定。
三、keepAliveTime 空闲线程存活时间
一个线程如果处于空闲状态,并且当前的线程数量大于corePoolSize,那么在指定时间后,这个空闲线程会被销毁,这里的指定时间由keepAliveTime来设定。
四、unit 空闲线程存活时间单位
空闲线程存活时间单位是keepAliveTime的计量单位。
五、workQueue 工作队列
新任务被提交后,会先进入到此工作队列中,任务调度时再从队列中取出任务。
六、threadFactory 线程工厂
创建一个新线程时使用的工厂,可以用来设定线程名、是否为daemon线程等等。
七、handler 拒绝策略
当工作队列中的任务已到达最大限制,并且线程池中的线程数量也达到最大限制,这时如果有新任务提交进来,该如何处理呢。这里的拒绝策略,就是解决这个问题的。
线程池的优势
1、线程和任务分离,提升线程重用性;
2、控制线程并发数量,降低服务器压力,统一管理所有线程;
3、提升系统响应速度,假如创建线程用的时间为T1,执行任务用的时间为T2,销毁线程用的时间为T3,那么使用线程池就免去了T1和T3的时间。
怎么设置task的最大线程数
点虐 4.0,32位机器最大线程数,每核1023个
点虐 4.0,64位机器最大线程数,每核32768个
点虐 3.0,最大线程数,每核250个
点虐 2.0,最大线程数,每核25个
默认的最小线程数是每核1个。在服务器端环境,比如iis下的asp点虐 最小线程数会更大可能超过50
名称栏目:腾讯云服务器最大线程数 腾讯云服务器80端口
地址分享:http://scgulin.cn/article/ddsophi.html