免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: codechurch

[C] 寻求建议,关于异步编程 [复制链接]

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
发表于 2015-01-08 14:59 |显示全部楼层
回复 68# yulihua49

表这样子说,每个fiber的stack都是用mmap的,绝大多数情况下使用的“物理内存”只有4~8K一两个page,即便有C100K也不过是100K*4~8K=400~800M,现在哪个机器缺这点内存?十万人同服的游戏还不够钱让你多买点机器?

绝大部分的大内存分配都是在Heap上,这个又没有限制,需要多少用多少好了,无论你用什么并发模型总归是一样的,干嘛非得在stack上放一大堆东西?

几十K stack还不够用的场景,要么就是你的问题太特殊,要么就是程序写得有问题。

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
发表于 2015-01-08 16:20 |显示全部楼层
yulihua49 发表于 2015-01-08 12:34
遇到难题了,求教大侠:

在coroutine中:

问题解决了,用自己写的乐观锁解决。

fiber池基本试验成功,程序比38楼改了不少。适用于半双工的服务器。
证明基本设想是可行的。

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
发表于 2015-01-19 10:55 |显示全部楼层
windoze 发表于 2015-01-08 14:59
回复 68# yulihua49

表这样子说,每个fiber的stack都是用mmap的,绝大多数情况下使用的“物理内存”只有 ...

为线程分配栈空间
一般情况下,不需要为线程分配栈空间。系统会为每个线程的栈分配1MB(对于32 位
系统)或2MB(对于64 位系统)的虚拟内存,而不保留任何交换空间。系统将使用
mmap() 的MAP_NORESERVE 选项来进行分配。
属性对象
第3 章• 线程属性69
系统创建的每个线程栈都具有红色区域。系统通过将页附加到栈的溢出端来创建红色
区域,从而捕获栈溢出。此类页无效,而且会导致内存(访问时)故障。红色区域将
被附加到所有自动分配的栈,无论大小是由应用程序指定,还是使用缺省大小。

极少数情况下需要指定栈和/或栈大小。甚至专家也很难了解是否指定了正确的大小。
甚至符合ABI 标准的程序也不能静态确定其栈大小。栈大小取决于执行中特定运行时
环境的需要。

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
发表于 2015-01-21 10:32 |显示全部楼层
本帖最后由 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,不包括应用需求,线程栈的设置不得小于此值。
  1. //设置用户栈空间
  2.                 p=getenv("USERSTACKSZ");
  3.                 if(p && isdigit(*p)) {
  4. size_t sz;
  5. char c;
  6.                         ret=sscanf(p,"%ld%c",&sz,&c);
  7.                         if(ret>1) {
  8.                                 switch(toupper(c)) {
  9.                                 case 'K':
  10.                                         sz *= 1024;
  11.                                         break;
  12.                                 case 'M':
  13.                                         sz*=1024*1024;
  14.                                         break;
  15.                                 default:break;
  16.                                 }
  17.                         }
  18.                         if(sz>0) {
  19.                                 sz+=PTHREAD_STACK_MIN;
  20.                                 ret = pthread_attr_setstacksize(&tpool.attr, sz);
  21.                                 if(!ret) use_stack_size=sz;
  22.                         }
  23.                 }

  24.         }
复制代码
我的应用栈可以由配置文件设置,建议你也如此。

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
发表于 2015-01-21 11:01 |显示全部楼层
回复 74# yulihua49

PTHREAD_STACK_MIN和fiber有个毛线关系,fiber stack是你自己分配的,你就算只给它几个字节又有谁能说个不字,自己够用就好了。

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
发表于 2015-01-21 14:59 |显示全部楼层
windoze 发表于 2015-01-21 11:01
回复 74# yulihua49

PTHREAD_STACK_MIN和fiber有个毛线关系,fiber stack是你自己分配的,你就算只给它 ...

之所以讲了这么多线程栈的问题,是因为fiber栈与线程栈完全是一个性质,fiber栈应该按照线程栈一样的设置。
不信你可以试试,小于这个值,你的系统能工作?

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
发表于 2015-01-21 15:07 |显示全部楼层
回复 76# yulihua49

一个典型的HTTP server只用4K stack一样活得好好的,不信你自己测一下,看看到底有多少实际的程序真的用到了超过4K的stack。
话说回来,如果你用mmap分配stack,就算你分配1G也只是个“地址空间”,依然是用到多少才实际分配多少物理内存,话说10000*4K的物理内存你真的负担不起?
你最好回去把你那些中间件什么的都测一下,看看它们到底需要多大的stack,记得别把heap什么的都算进去。

如果你不去实测光闭着眼睛在这儿拍脑袋,这个话题也没有继续争论的必要了,你自己愿意用malloc分配1M stack给fiber和我有什么关系。

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
发表于 2015-01-21 15:19 |显示全部楼层
本帖最后由 yulihua49 于 2015-01-21 15:51 编辑
windoze 发表于 2015-01-21 15:07
回复 76# yulihua49

一个典型的HTTP server只用4K stack一样活得好好的,不信你自己测一下,看看到底有 ...

HTTP,没有什么应用插件。我是交易中间件,要有应用插件的,应用逻辑怎么用,不可预知。多数的数据库应用,局部变量都很大、很多。
你搜一下:quicklz -- 一个快速压缩器,我用来压缩通信数据包,它用了530K的栈,我反复说好几遍了。少了这个数,肯定崩栈。已经是证实了的。
每个TCB迟早会用到这个数,就算是虚存,到时候就等着换页吧。所以,你那个框架只能用于http服务器(哎,http服务器满大街都是,何必自己造轮子),不能用于交易服务器。
不争这个了,你按你的办,我按我的办。反正我是忠告,信不信由你。

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
发表于 2015-05-25 10:53 |显示全部楼层
本帖最后由 yulihua49 于 2015-05-25 11:28 编辑
windoze 发表于 2015-01-21 15:07
回复 76# yulihua49

一个典型的HTTP server只用4K stack一样活得好好的,不信你自己测一下,看看到底有 ...

我的交易中间件,最近进入了应用系统。这个系统,最大包尺寸,5.8M,压缩后400K。
不记得哪个环节的栈尺寸与包尺寸有关。反正,缺省栈尺寸,经常崩栈。找不到原因。
协程崩栈,不是崩栈时core dumpped。而是不一定跑到哪,出现些奇奇怪怪的问题。
#设置用户栈尺寸
USERSTACKSZ=6M
好了。

我的意思是,应用逻辑,它要用多少栈,无法控制。你要去查找它的不合理用栈,也是非常困难。如果可能,就多给它一些。
当然,我也承认,用户发送更大的数据怎么办?问题还是要查找的。这里能够定位故障,下一步查找就有了根据。

因此,楼主,你的框架如果想通用,这个问题得考虑。



论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
发表于 2015-05-25 15:01 |显示全部楼层
回复 79# yulihua49

我晕,4个月过去了你又想起这出……

不是说了么,真遇到这种情况,有-fsplit-stack可以拿来救场。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP