Linux最大线程数的问题.

古月书斋 2007-02-13 10:23:44
线程数跟系统资源也有关系,在kernel中有这样的代码:
max_threads = mempages / (8 * THREAD_SIZE / PAGE_SIZE);
/*
* we need to allow at least 20 threads to boot a system
*/
if(max_threads < 20)
max_threads = 20;
init_task.signal->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?
小弟是初学者,请各位大虾指点一下.
...全文
1970 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
mahongming 2011-03-24
  • 打赏
  • 举报
回复
8是一般系统默认的线程栈大小 8m
dai_weitao 2007-04-27
  • 打赏
  • 举报
回复
为了不影响前台工作, 这个数越大越好.
但为了系统的并行多处理能力, 这个数越小越好.
8可能是一个最佳数吧
x86 2007-04-26
  • 打赏
  • 举报
回复
最初的设计这里是除以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 < PAGE_SIZE的时候。将8移到前面来也有这个原因。对于有些arch,PAGE_SIZE会足够的大,以至于THREAD_SIZE必须要乘以8才可使结果不至于为0。

实际上,很多系统特别是嵌入式系统这个数字会更大,比如16。
lirun 2007-04-20
  • 打赏
  • 举报
回复
可以调置的,就用setlim函数族
koolfool 2007-04-12
  • 打赏
  • 举报
回复
莫非这就是传说中的魔数?呵呵
我同意楼上的,是一个经验值,不然就给它起个名字就像THREAD_SIZE和PAGE_SIZE那样
正因为它没有确切的意义所以才干脆写成了8吧
乱猜的 ^_^
大大的树 2007-04-10
  • 打赏
  • 举报
回复
每个内核线程至少占用THREAD_SIZE大小的空间来存放内核堆栈,进程描述符等核心信息。在深入理解Linux内核中指出,所有进程描述符和内核堆栈所占的空间不能超过物理空间的1/8。
所以有max_threads=mempages / (THREAD_SIZE/PAGE_SIZE) / 8;
。这更多的是一个经验值吧,系统管理员可以通过/proc/sys/kernel/thread-max 来修改这个值。
古月书斋 2007-04-06
  • 打赏
  • 举报
回复
max_threads = mempages / (8 * THREAD_SIZE / PAGE_SIZE);
和max_threads = mempages / (THREAD_SIZE/PAGE_SIZE) / 8;
有多大差别吗?
楼上说:
THREAD_SIZE是8k。PAGE_SIZE是4k。(THREAD_SIZE/PAGE_SIZE) = 2。所以需要再除以8
小弟笨,不知你的"所以"是怎么来的.
我想总线程max_threads=总的page数(mempages)/一个线程所占的page数(THREAD_SIZE / PAGE_SIZE).
应该这样才对.为什么他要除个8呢?
如果不除8的话,也最多只有1/2的内存都让thread_info给占了.
因为下面还有:
init_task.rlim[RLIMIT_NPROC].rlim_cur = max_threads/2;
init_task.rlim[RLIMIT_NPROC].rlim_max = max_threads/2;
这也与代码中注释相符合呀!
*
* The default maximum number of threads is set to a safe
* value: the thread structures can take up at most half
* of memory.
*/


scmsir 2007-04-05
  • 打赏
  • 举报
回复

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
我觉得是这样子的,请高人评定。
playmud 2007-03-12
  • 打赏
  • 举报
回复
没细看,难道是bit和byte的关系
johndiyang 2007-03-09
  • 打赏
  • 举报
回复
mark
imho888 2007-03-08
  • 打赏
  • 举报
回复
线程和CPU有关系吧和内存有关系吗? 不清楚。
lurenfu 2007-03-07
  • 打赏
  • 举报
回复
如果不除8的话,所有的内存都让thread_info给占了
至于要为什么要除8,也就是1/8的页面可用于线程的结构,不清楚啊
blueoceanli 2007-03-06
  • 打赏
  • 举报
回复
牛人来....
mark
bobya2003 2007-03-05
  • 打赏
  • 举报
回复
mark
awjx 2007-02-13
  • 打赏
  • 举报
回复
关注一下
希望这种问题能够在CSDN解决
...
yjf7888 2007-02-13
  • 打赏
  • 举报
回复
关注,帮顶

4,438

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧