- 论坛徽章:
- 15
|
本帖最后由 yulihua49 于 2015-01-21 10:47 编辑
windoze 发表于 2014-12-26 10:50 ![]()
回复 45# yulihua49
打开split stack之后一个fiber才用4K内存,你真觉得这是个大问题?10~20G?几百万 ...
foreign thread通信机制在38页11-18行。
几百万的fiber是楼主的应用,它既然开了这么多fiber,总会用到的,或者接近用到。
我的场景通常是1W左右,肯定是都会用到的(我的调度策略是轮流使用TCB)。
所以说,用到,不是分配栈的依据,被线程抓住了才分配栈,一个请求完成就回收栈。线程数是有限的,每个线程为抓住的TCB分配栈,它每次只能抓住一个TCB,所以每个线程只有一个栈供分配,这样栈数=线程数,加上线程自己的栈,所以总的栈数=线程数*2。
系统PTHREAD_STACK_MIN是16K,不包括应用需求,线程栈的设置不得小于此值。- //设置用户栈空间
- p=getenv("USERSTACKSZ");
- if(p && isdigit(*p)) {
- size_t sz;
- char c;
- ret=sscanf(p,"%ld%c",&sz,&c);
- if(ret>1) {
- switch(toupper(c)) {
- case 'K':
- sz *= 1024;
- break;
- case 'M':
- sz*=1024*1024;
- break;
- default:break;
- }
- }
- if(sz>0) {
- sz+=PTHREAD_STACK_MIN;
- ret = pthread_attr_setstacksize(&tpool.attr, sz);
- if(!ret) use_stack_size=sz;
- }
- }
- }
复制代码 我的应用栈可以由配置文件设置,建议你也如此。 |
|