linux内核最大线程数,Linux最大线程数的问题.__max_threads_THREAD_SIZE_除以_PAGE_SIZE_mempages__169IT.COM...

线程数跟系统资源也有关系,在kernel中有这样的代码:

max_threads = mempages / (8 * THREAD_SIZE / PAGE_SIZE);

/*

* we need to allow at least 20 threads to boot a system

*/

if(max_threads rlim[RLIMIT_NPROC].rlim_cur = max_threads/2;

init_task.signal->rlim[RLIMIT_NPROC].rlim_max = max_threads/2;

当内存总数不多时,线程数也会限制在一定数额。

请问 max_threads = mempages / (8 * THREAD_SIZE / PAGE_SIZE);

这里为什么要多除以一个8?

小弟是初学者,请各位大虾指点一下.

|

每个内核线程至少占用THREAD_SIZE大小的空间来存放内核堆栈,进程描述符等核心信息。在深入理解Linux内核中指出,所有进程描述符和内核堆栈所占的空间不能超过物理空间的1/8。

所以有max_threads=mempages / (THREAD_SIZE/PAGE_SIZE) / 8;

。这更多的是一个经验值吧,系统管理员可以通过/proc/sys/kernel/thread-max 来修改这个值。

|

void __init fork_init(unsigned long mempages)

{

/*

* The default maximum number of threads is set to a safe

* value: the thread structures can take up at most half

* of memory.

*/

max_threads = mempages / (THREAD_SIZE/PAGE_SIZE) / 8;

init_task.rlim[RLIMIT_NPROC].rlim_cur = max_threads/2;

init_task.rlim[RLIMIT_NPROC].rlim_max = max_threads/2;

}

我的内核里是这样的呀。

THREAD_SIZE是8k。PAGE_SIZE是4k。(THREAD_SIZE/PAGE_SIZE) = 2。所以需要再除以8

我觉得是这样子的,请高人评定。

|

最初的设计这里是除以2,在2.4.0官方版本可以看到:

max_threads = mempages / (THREAD_SIZE/PAGE_SIZE) / 2;

不过到了Redhat7.3的2.4.18-3,就变成了除以8了。显然这里是有讲究的。按照除以2的版本,对于i386来讲,max_threads = mempages / 4,对于i386,一个thread_info是两个PAGE,所以最后max_threads正好消耗内存的一半。

(最后这个除以2让人比较迷惑,是被分母除还是被整个结果除,所以后来把它移到前面,变成(8*THREAD_SIZE/PAGE_SIZE))

至于为何改成8,我没有查出来,但是至少有一个原因就是如果是2,会造成某些时候出现除0的错误,比如说THREAD_SIZE

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值