免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: chenrvmldd
打印 上一主题 下一主题

来个猛的问题-大家共同思考 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2011-03-22 13:04 |只看该作者
pthread_create error: Resource temporarily unavailable这个是怎么出来的,能否strace一下看看是否是系统调用的问题, 怎么没看到你的进程呢
ulimit 只是改了栈大小,都是虚地址空间,pthread_create建立了多少线程? 新旧版本个数肯定一样多吗?

可以肯定的是,现今的pthread_create失败和物理内存剩余多少基本上没有任何关系
但是你的版本太老了,又是嵌入式,不了解

这里有一段话,可以参考一下


问题: 为什么只能建300来个线程
因为线程栈默认8M 3G用户空间刚好够300多个

线程栈的大小 __default_stacksize在初始化时被设置为rlimit的大小
ulimit -s
8192

如果没有限制,__default_stacksize = #define ARCH_STACK_DEFAULT_SIZE    (2 * 1024 * 1024)

所以最简单减小线程栈的方式就是ulimit 更改父shell的值(如果程序无法修改,否则attr可用)
在程序中 setrlimit是不行的,因为在很早的时候(当然肯定是main之前)__default_stacksize就会被设置

论坛徽章:
0
22 [报告]
发表于 2011-03-22 13:28 |只看该作者
回复 21# flw2


    flw2兄弟,你的问题兄弟在此前也思考过,下面是我做的实验,你帮兄弟分析分析:

在老版本中:  #ulimit -a会显示如下内容:
stack(kbytes) 8192
process 384

然后运行我的程序,可以创建159个线程


在新版本中:#ulimit -a会显示如下内容:

stack(kbytes) 8192
process 128

然后运行我的程序,发现不能创建线程,下面我通过ulimit -s 1024修改线程默认栈的大小,运行我的程序发现可以创建382个线程
进一步实验通过ulimit -s 2048运行我的程序可以创建189个线程,
再进一步实验通过ulimit -s 4096运行我的程序,发现不能创建线程


所以我认为应该是stack的大小和process的大小之间有着某种联系

论坛徽章:
0
23 [报告]
发表于 2011-03-22 20:51 |只看该作者
本帖最后由 陈灌溪 于 2011-03-22 22:41 编辑

应该先说说是哪2个内核版本
如此神奇 难道是UClinux
猜测你3M栈同样创建不了

论坛徽章:
0
24 [报告]
发表于 2011-03-23 15:32 |只看该作者
回复  flw2


    flw2兄弟,你的问题兄弟在此前也思考过,下面是我做的实验,你帮兄弟分析分析:

在 ...
chenrvmldd 发表于 2011-03-22 13:28




然后运行我的程序,发现不能创建线程,下面我通过ulimit -s 1024修改线程默认栈的大小,运行我的程序发现可以创建382个线程
进一步实验通过ulimit -s 2048运行我的程序可以创建189个线程,
再进一步实验通过ulimit -s 4096运行我的程序,发现不能创建线程

你的栈改成4M大小就不能建新线程,确认是一个都不能?还是程序没打印出来,有点不正常
根据你的说法, 加上你的系统,以及线程库版本太老,猜不出来是什么问题

论坛徽章:
0
25 [报告]
发表于 2011-03-23 15:40 |只看该作者
回复 24# flw2


    兄弟看看我的这个问题:该怎么解决了?

前段时间通过ulimit -a
发现我的系统的stack的大小默认是8M

但是我想修改这个stack的大小,后来在网上查了很久发现最常用的办法是:ulimit -s 1024把stack的值改成1M,或者其他都可以
但是上面的办法不能永久生效,后来查资料发现:可以通过修改/etc/security/limits.conf这个文件可以达到永久生效,可是我的linux是嵌入式的,里面根本就没有上面这个文件,
所以我想stack的大小肯定是和内核某个参数有关,我可以修改这个参数,然后重新编译内核,这样可以最终达到修改stack size的大小,后来我在源代码中找到了一个有可能和stack大小相关的一个参数:
#define RLIMIT_STACK        3                /* max stack size */

这个是在resouce.h文件中找到的,但是这个3和stack的8M有什么关系了?或者是其他参数影响着stack的大小?请各位温拿指点啊!

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
26 [报告]
发表于 2011-03-23 16:31 |只看该作者
1 << 3 = 8   可能是这个关系吧?
你可以在源码下grep下,看看rlimit_stack在哪被用了不就知道了吗

论坛徽章:
0
27 [报告]
发表于 2011-03-23 16:41 |只看该作者
栈大小是在内核中有定义的
但是不要动不动就想改内核吧,修改栈大小比较好的方式是

把你的app改名为app.bin
!#/bin/sh
ulimit -s 1024
exec /path/to/app.bin
把该脚本命名为app

论坛徽章:
0
28 [报告]
发表于 2011-03-23 17:22 |只看该作者
你改3M试验下也好验证我一想法
2。8M估计能2。9就不行了
如果确信是UCLINUX  首先它是没有MMU这个关系可大了

论坛徽章:
0
29 [报告]
发表于 2011-03-23 20:16 |只看该作者
回复 28# 陈灌溪


    好的,我试试看

论坛徽章:
0
30 [报告]
发表于 2011-03-23 20:18 |只看该作者
回复 26# amarant


    哈哈,终于被哥们找到了关于这个默认参数的定义了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP