网络编程的模式

    在网络程序开发中有两种模式Reactor模式和Proactor模式。Reactor模式一般用于同步I/O(包括网络)中,Proactor模式一 般用于异步I/O(包括网络)中。其实它们都属于I/O多路复用模式。I/O多路复用机制都依赖于一个事件多路分离器(Event Demultiplexer),比如linux和windows下都有的select,windows下的IOCP,linux下的poll和 epoll,虽然都属于I/O多路复用,但是既然名字不同说明它们还是有区别的:Reactor用于同步I/O,Proactor用于异步I/O。其实在程序中没用绝对的异步,这里的同步异步是相对于I/O操作而言,同步表示具体的读写(收发)需要程序自己实现,而异步表示具体的读写(收发)操作系统完成。所以由此可以判别这两种模式下的事件多路分离器反馈给程序的信息是不一样的:

1.Reactor模式下说明你可以进行读写(收发)操作了。

2.Proactor模式下说明已经完成读写(收发)操作了,具体内容在给定缓冲区中,可以对这些内容进行其他操作了。

    总结一下就是Reactor关注的是I/O操作的就绪事件,而Proactor关注的是I/O操作的完成事件

    聪明的你一定会想到可以用Reactor实现Proactor。这是当然可以的,但是从严格意义上讲这是伪异步(感兴趣可以Google搜索 TProactor)。只有操作系统支持I/O异步(提供相应API例如windows下的IOCP)才能真正使用上异步I/O。据我了解windows 下的IOCP是异步的(我一般在windows下开发都首选IOCP)。而linux下的I/O异步接口有aio

(一种是glibc实现的 aio,是伪异步性能差比较烂。一种就是内核实现的aio,简称native aio)但是用的人很少好像Linux内核维护者不建议用。我至今看到的只有nginx在读文件时用到native aio。其实linux下的网络开发还是首选epoll(我在linux下开发一直使用epoll和libevent)。


    个人总结不喜吾喷,如有雷同他抄我的。


转载于:https://my.oschina.net/u/1248688/blog/202937

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值