1.Linux能同时启动多少个线程?
对于32-bit Linux,一个进程的地址空间是4G,基于用户态能访问3G左右,而一个线程的默认栈(stack)大小是10M,心算可知,一个进程最多能同时启动300个线程左右。
查看linux是多少bit的操作系统?1.uname -a 2.getconf LONG_BIT
查看线程默认栈大小? ulimit -s
2.多线程能提高并发度么?
(1)如果指的是“并发连接数”,不能
(2)假如单纯采用thread perconnection的模型,那么并发连接数大约300,这远远低于基于事件的单线程程序所能轻松达到的并发连接数(几千上万,甚至几万)。所谓”基于事件“,指的使用IO multiplexing event loop的编程模型,又称Reactor模式。
3.多线程能提高吞吐量么?
(1)对于计算密集型服务,不能。
(2)如果要在一个8核机器上压缩100个1G的文本文件,每个core的处理能力为200MB/s,那么”每次起8个进程,一个进程压缩一个文件“与只启动一个进程(8个线程并发压缩一个文件)”,这两种方式总耗时相当,但是第二种方式能较快的拿到第一个压缩完的文件
4.多线程能提高响应时间么?
可以
5.线程池大小的选择?
如果池中执行任务时,密集计算所占时间比重为P(0<P<=1),而系统一共有C个CPU,为了让C个CPU跑满而不过载,线程大小的经验公式T=C/P,即T*P=C(让CPU刚好跑满)
(1)假设C=8,P=1.0,线程池的任务完全密集计算,只要8个活动线程线程技能让CPU饱和
(2)假设C=8,P=0.5,线程池的任务有一半是计算,一半是IO,那么T=16,也就是16个“50%繁忙的线程”能让8个CPU忙个不停
6.fork()失败的可能性
(1)系统中进程太多
缺省情况,最大的pid:32767。进程号0-299保留给daemon进程。现在的内核好像没有这个限制了,《linux内核设计与实现》上说为了与老版本的unix和linux兼容,pid的最大值默认是32767(short int的最大值),如果你需要的话还可以不考虑和老版本兼容,修改/proc/sys/kernel/pid_max来提高上限用echo重新写入一个数值到这个文件即可。
echo "131072" > /proc/sys/kernel/pid_max
(2)每个用户有个允许开启的进程总数
ulimit -u;查看用户最大的进程数