Boost.Aiso概述 核心概念和功能1
前摄器设计模式︰ 并发线程没有
Boost.Asio 库肩并肩为提供支持同步和异步操作。异步的支持基于前摄器设计模式[POSA2]。这个办法时相比,同步只或反应器方法优缺点概述如下。
前摄器和 Boost.Asio
让我们看看如何前摄器设计模式在执行 Boost.Asio,没有提到特定于平台的详细信息。
前摄器设计模式 (改编自 [POSA2])
— — 异步操作
定义异步执行,如异步读取或写入在套接字上的操作。
— — 异步操作处理器
执行异步操作和队列上完成事件队列的事件,当操作完成。从高层次的角度来看,像stream_socket_service服务是异步操作处理器。
— — 完成事件队列
缓冲完成事件,直到他们都出列者异步事件解复用器。
— — 完成处理程序
处理异步操作的结果。这些都是经常使用boost::bind创建的函数对象.
— — 异步事件解复用器
等待事件发生在完成事件队列中,并返回给其调用方的已完成的事件。
— — 前摄器
调用异步事件解复用器排队事件,并将调度完成处理程序 (即调用函数对象) 与该事件关联。这种抽象是由io_service类表示。
— — 启动器
启动异步操作的特定于应用程序代码。与异步操作处理器通过一个高级别的界面,例如basic_stream_socket,这将反过来委托给类似stream_socket_service的服务进行交互启动器.
实现了用电抗器
在许多平台上,Boost.Asio 实现反应器,如select、 epoll或kqueue的前摄器的设计的模式。此实现方法对应于前摄器的设计模式,如下所示︰
— — 异步操作处理器
使用select、 epoll或kqueue反应器实现。当反应堆表明资源是准备好要执行的操作时,处理器上完成事件队列执行的异步操作和排队关联的完成处理程序。
— — 完成事件队列
完成处理程序 (即函数对象) 链接的列表。
— — 异步事件解复用器
这一点被通过对一个事件或条件变量等待,直到完成处理程序是完成事件队列中可用。
使用 Windows 实现重叠 I/O
在 Windows NT、 2000年和 XP,Boost.Asio 利用重叠 I/O 提供前摄器设计模式的有效实施。此实现方法对应于前摄器的设计模式,如下所示︰
— — 异步操作处理器
这是由操作系统执行。通过调用AcceptEx重叠的功能启动了操作.
— — 完成事件队列
这由操作系统,并且是与 I/O 完成端口相关联。还有一个 I/O 完成端口io_service的每个实例。
— — 异步事件解复用器
由 Boost.Asio 排队事件和其相关联的完成处理程序调用。
优势
— — 可移植性。
许多操作系统提供本机异步 I/O API (如在Windows上的重叠 I/O) 作为开发高性能网络应用程序优先选项。图书馆可能执行的本机异步 I/O。然而,如果没有可用的本机支持,图书馆可能还使用实现同步事件 demultiplexors 是典型的反应器模式,例如POSIX select().
— — 解耦从并发线程。
通过为您的应用程序执行异步执行长时间操作。因此应用程序不需要为了增加并发多线程。
— — 性能和可扩展性。
执行战略,如线程每,连接到 (这只同步的方法将需要) 会降低系统性能,因为增加的上下文切换,Cpu 之间的同步和数据移动。它具有异步操作可以避免上下文切换,以期尽量减低的操作系统线程数的成本 — — 通常是有限的资源 — — 并只**事件处理逻辑线程的控制。
— — 简化应用程序同步。
可以编写异步操作完成处理程序,仿佛他们存在在单线程环境中,并使应用程序逻辑可以开发与很少或没有关注的同步问题。
— — 函数组成。
函数组合是指执行的功能,以提供一个更高层次的操作,比如在某一特定格式发送一条消息。每个函数被推行以较低级别的读或写操作的多个调用。
例如,考虑一项议定书,在那里每个消息包含固定长度标头后跟变量长度正文,正文的长度标头中的指定位置。假设 read_message 操作可以使用较低级别的两次读取实现的已知的第一个接收头和一次长度,第二个接收身体。
若要撰写的异步模型中的函数,异步操作可以链接在一起。那就是,一次操作完成处理程序可以启动下一步。开始第一次调用链中可以这样调用者不需要知道的更高级的操作作为异步操作链实现封装。
有能力写出新的行动,以这种方式简化了开发更高抽象级别的网络库,例如函数以支持某个特定的协议上面。
缺点
— — 程序的复杂度。
它是更难使用异步机制在时间和空间之间操作启动和完成分离开发应用程序。应用程序可能也难以调试由于倒立的控制流。
— — 内存使用情况。
缓冲区空间必须致力期间的读或写操作,可能会持续下去,和一个单独的缓冲是需要为每个并发操作。反应器模式,另一方面,不需要缓冲区空间直到套接字准备读或写。