boost {asio reactor}
来源:互联网 发布:淘宝卖家怎么改店名 编辑:程序博客网 时间:2024/05/24 05:21
学习了boost库。幸亏自己做过一个IOCP的框架,理解asio的设计还容易一些,虽然自己以前不知道这个就是reactor,。ACE也是实现的reactor,当时只接触过proactor的程序,看了半天也没看懂,明天再回过头学习下ACE,应该会好一些了。reactor是真正的异步,和IOCP的思路差不多,只不过用epoll,poll实现reactor就要做一些基础的工作了。说到底还是异步,异步就涉及到类似closure的东西,boost就用了bind来担当闭包的作用.IOCP的一部很容易理解,它自身就提供了WSASend,WSARecieve,WSAConnect,这种API,工作线程是需要GetQueue来处理就行了,用epoll,poll,select这种模拟的话,本质上还是proactor,因为必须检查是否可读/写才能做实际的操作,用了一个队列来作为Post的操作的缓存,单独开一个线程来处理队列内容。
boost的实现我觉得通用性很好,它不只是用于IO,还有其他的timer,等等,我想就算做一个执行sql的reactor也是完全可行的,虽然这种东西用lua等脚本语言来实现会简单的多。在处理socket的io时,我认为提高效率的关键不是可以执行多次WSASend,而是每次的数据是否多,如果每次send的数据很少,代价是比较大的,而且在多个recieve时涉及到消息顺序和半包的问题。所以我的做法还是一个socket保证同一时刻最多有一个Recieve和send,在上一次send没有返回时如果有后续的send操作就把数据缓存起来,提高一次send操作的数据量,Recieve就很简单的每次recieve结束开始下一次recieve,包括资源的回收也是统一用一个异步操作完成。这么做简单,可靠,清晰,效率也足够高。关键就是把boost的实现不是简单的enqueue,而是要合并操作。
ioservice的作用,现在我的理解就是服务管理器,单子模式,还有工厂的作用。它本身提供了异步操作,是一个很通用的抽象,accepter,socket都是单独的。开始的时候由于我先入为主的把它的作用看成了service的base类,理解起来偏差很远了。这种设计很好吗?明明是工厂还不告诉你?asio的继承关系还是比较简单的,能用模板组合的就代替了继承,这点很欣赏,复杂的继承关系很要命。命名空间的使用我还是不擅长,基本没用过。内部模块的拆分名字空间也是很有用的,就像代码中的大括号一样。
我知道一个网络框架是很复杂的,根本不像读代码这么简单,IOCP的资源回收问题就搞了我一天,再有多线程在里面搅和,想写一个健壮的扩展性强的框架很难的。asio本身还是要受制于通用性的要求,细节上还有优化的空间。
- boost {asio reactor}
- Reactor模型库之boost::asio::io_service与ACE_Reactor
- boost asio学习笔记1--Reactor与Proactor模式
- Boost Asio
- boost asio
- Boost.asio
- boost asio
- boost asio
- boost.asio
- Boost.Asio
- boost.asio
- boost asio
- BOOST::ASIO
- boost asio
- boost asio
- boost asio
- Boost asio
- boost asio
- jffs2文件系统在nand flash上的移植(实验平台为MPC8315ERDB开发板)
- 解决openoffice复制网页中的图片为超级链接
- 我心目中的好的技术教程
- 虚拟机Linux与宿主机Windows XP文件互访
- 迷宫课设 绝对原创 C版
- boost {asio reactor}
- LoadRunner测试GWT
- windows xp组件中没有IIS选项的解决方案
- JUnit学习笔记11---用Cactus进行容器内测试
- J2EE下使用AJAX(五) jsonplugin -- struts2下的AJAX插件
- 用VB.Net读取Resources.resx文件
- 魔兽世界 MPQ(MoPaQ) 文件相关资料
- 一个还原备份文件的问题
- UI Automation-MultipleViewPattern