网络编程的模式

    在网络程序开发中有两种模式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)。


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


你可能感兴趣的:(网络编程的模式)