免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
11 [报告]
发表于 2014-12-18 11:46 |显示全部楼层
回复 27# windoze

4001已经分配给其他fiber使用了,肯定会崩溃的。
   

论坛徽章:
0
12 [报告]
发表于 2014-12-18 12:05 |显示全部楼层
所以,我认为,在原生语言及直接能操作内存的语言(而对内存没有额外的锁定机制的(C#就有锁定机制,锁定内存后,可以屏蔽GC的效果)),其栈都不可能在yield时被回收,其上数据不能拷贝,因为拷贝后就让指针向它的指针失去意义了。(原生语言没有类型反射机制,也不可能知道谁指向这个栈了。) 除非你再次分配的地址跟原来是一样的。当然这也是一种选择,windows支持预留地址,linux我不知道。

论坛徽章:
0
13 [报告]
发表于 2014-12-18 15:01 |显示全部楼层
回复 31# windoze


在那位(id太复杂)的设计里,session没有完成,栈也会销毁。

如:session在等待socket send完成,在socket send之后,将此session的栈回收,当send完成后,再恢复执行。

   

论坛徽章:
0
14 [报告]
发表于 2014-12-30 11:53 |显示全部楼层
回复 40# yulihua49

栈用于保存状态,一个业务没有完成,栈如何回收?

线程数量有限,业务数量远超线程数量,所以,当fiber(承载一个业务)得到I/O事件后,fiber获取一个线程开始执行。


比如, aio_send(  callback );  (伪码)发起异步I/O,I/O由系统完成,调用callback回调函数,在这个callback函数里,继续fiber的工作。


在fiber未完成业务之前,栈无法回收。

比如,一个业务函数:

   
void  biz(...)
{
      aiop   op;
      char buff[100];
      int len;

     
      op = a_recv(buff, 100);

      async_wait(op);  /// *

      op = a_send("ok", 2);
   
      async_wait(op); /// **
}


在*和**处,fiber放弃线程,进入“等待I/O完成”的状态,此时,执行线程(可能是在回调,也可能是在线程池)的函数返回。
此时,fiber栈必须保留,因为异步I/O要用到那些内存,比如buff[100]这块内存,被异步a_recv函数填充。

     
我认为,异步过程(如这个biz函数)编程时注意一下,不要使用过多栈,如果要用,就用malloc分配。就是使用上注意一下就可以了。

我现在只用 4K~16K之间。



   

论坛徽章:
0
15 [报告]
发表于 2014-12-30 16:07 |显示全部楼层
回复 55# yulihua49

如果不保存状态,用协程有什么好处?

我用协程的唯一动机是,我可以将一个多次交互I/O的过程,从自动机写法转换为流程式写法。

   

论坛徽章:
0
16 [报告]
发表于 2014-12-30 16:08 |显示全部楼层
回复 55# yulihua49


你不给一个业务流程分配栈,那么你的业务就不能写在一个函数里。

那么,协程的好处体现在什么地方?


   

论坛徽章:
0
17 [报告]
发表于 2014-12-30 16:15 |显示全部楼层
回复 58# yulihua49

问题是,栈不能这样回收啊,前面已经讨论过了。

你回收正在使用的栈,指向此栈上内存的指针就无效了,原生语言无法解决这个问题。


   

论坛徽章:
0
18 [报告]
发表于 2014-12-30 16:34 |显示全部楼层
回复 60# yulihua49

其实,一个业务流程,除了在线程里执行,就是等待io完成,没有其他状态。

如果你想把一个业务流程写在一个函数里,就必须自始至终保留这个栈。




   

论坛徽章:
0
19 [报告]
发表于 2014-12-30 17:20 |显示全部楼层
回复 62# yulihua49


那么,你跟我的设计本质上没有差别。

论坛徽章:
0
20 [报告]
发表于 2014-12-31 09:22 |显示全部楼层
回复 64# yulihua49

任务存在,但任务没有状态,这也不需要分配栈。

只有需要进行业务操作了,就需要有业务状态,这才有栈。

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP