Boost.Asio翻译

最近在写自己的小应用的时候,开始涉及到boost.asio,之前在项目中也没有系统性的学习过。于是,趁着这个时间好好学习一下。

最好的入门资料当然是boost的官方文档,将几篇翻译的文档放在下边。

声明,我当然不会投入巨大的精力翻译这样的文档,从某种严格意义上来讲,我是在必应或者谷歌提供的翻译基础上做了一些校对,使句子不那么显得机器。

Boost.asio

理由(Rationale)

大多数程序以某种方式与外部世界交互,无论是通过文件、网络、串行电缆还是控制台。有时,与网络一样,单个 I/O 操作可能需要很长时间才能完成。这给应用程序开发带来了特殊挑战。

Boost.Asio 提供了管理这些长时间运行操作的工具,无需程序使用基于线程和显式锁定的并发模型。

Boost.Asio 库专为使用C++进行系统编程的程序员而使用,通常需要访问操作系统功能(如网络)。特别是,Boost.Asio 解决了以下目标:

  • 可移植性。库应支持一系列常用的操作系统,并在整个操作系统中提供一致的行为。
  • 可伸缩性。库应促进扩展到数千个并发连接的网络应用程序的开发。为每个操作系统的库实现应使用最能启用此可伸缩性的机制。
  • 效率。库应支持分散收集 I/O 等技术,并允许程序将数据复制降至最低。
  • 从已建立的API(如BSD套接字)建模概念。BSD套接字API被广泛实施和理解,并包含在许多文献中。其他编程语言通常使用类似的接口构建网络API。就合理性而言,Boost.Asio利用了现有的实践。
  • 易用性。库应采用工具包(而不是框架)方法,为新用户提供较低的进入门槛。也就是说,它应该尽量减少前期投资的学习时间,只需要学习一些基本的规则和准则。之后,库用户只需了解正在使用的特定函数。
  • 进一步抽象的基础。库应允许开发提供更高抽象级别的其他库。例如,常见协议(如 HTTP)的实现。

尽管 Boost.Asio 开始主要关注网络,但其异步 I/O 概念已扩展至包括其他操作系统资源,如串行端口、文件描述符等。

note: 这是一篇介绍为什么写boost.asio以及boost.asio遵循的几个规则或者说信条。


核心概念和功能(Core Concepts and Functionality)

Boost.Asio基本原理(Basic Boost.Asio Anatomy)

Boost.Asio可用于对I/O对象(如套接字)执行同步和异步操作。在使用Boost.Asio 之前,了解 Boost.Asio、您的程序以及它们如何协同工作的概念图片可能很有用。

作为介绍性示例,让我们考虑在套接字上执行连接操作时会发生什么情况。我们将首先检查同步操作。

图有点老,新版本的boost已经用io_context取代io_service

你的程序将至少有一个io_context对象。io_context代表你的程序指向操作系统的 I/O 服务的链接。io_service是老版本,io_context是新的。

boost::asio::io_context io_context;

要执行 I/O 操作,程序将需要 I/O 对象(如 TCP 套接字):

boost::asio::ip::tcp::socket socket(io_context);

执行同步连接操作时,将发生以下事件序列:

  1. 程序通过调用 I/O 对象启动连接操作:
socket.connect(server_endpoint);
  1. I/O 对象将请求转发到io_context。
  2. io_context调用操作系统以执行连接操作。
  3. 操作系统将操作结果返回给io_context。
  4. io_context将操作所产生的任何错误转换为boost::system::error_code类型的error_code对象。error_code可以与特定值进行比较,也可以测试为布尔(如果是false意味着没有发生错误)。然后,结果将转发回 I/O 对象。
  5. 如果操作失败,I/O 对象将引发boost::system::error_code的异常。如果启动操作的代码已编写为:
boost::system::error_code ec;
socket.connect(server_endpoint, ec);

然后,error_code变量 ec 将设置为操作的结果,并且不会引发异常。

使用异步操作时,将发生不同的事件序列。

在这里插入图片描述

  1. 程序通过调用 I/O 对象启动连接操作:
socket.async_connect(server_endpoint, your_completion_handler);

其中your_completion_handler是具有签名的函数或函数对象:

void your_completion_handler(const boost::system::error_code& ec);

所需的确切签名取决于正在执行的异步操作。参考文档指示每个操作的正确签名。

  1. I/O 对象将请求转发到io_context。

  2. io_context向操作系统发出信号,表明它应该启动异步连接。
    时间流逝。(在同步情况下,此等待将完全包含在连接操作的持续时间内。也就是阻塞
    在这里插入图片描述

  3. 操作系统通过将结果放在队列中来指示连接操作已完成,io_context即可接收结果。

  4. 程序必须调用 io_context::run()(或类似的io_context成员函数之一),才能检索结果。当有未完成的异步操作时,对 io_context::run() 的调用会阻塞。因此,通常会在第一个异步操作启动后立即调用它。

  5. 在调用 io_context::run()时,io_context从队列中取出操作结果,将其转换为error_code,然后将其传递给完成处理回调函数。

这是 Boost. Asio 操作的简化图片。如果需要更深入的了解,例如扩展 Boost.Asio 以执行其他类型的异步操作,则需要进一步深入了解文档。


Proactor设计模式:无线程并发(The Proactor Design Pattern: Concurrency Without Threads)

Boost.Asio 库提供对同步和异步操作的支持。异步支持基于 Proactor 设计模式 [POSA2]。与仅同步或Reactor方法相比,这种方法的优缺点如下所述。

Proactor和Boost.Asio

让我们来研究一下在不提及特定于平台详细信息情形下,Proactor 设计模式是如何在 Boost.Asio 中实现的。

Proactor design pattern (adapted from [POSA2])
— Asynchronous Operation

定义异步执行的操作,例如套接字上的异步读取或写入。

— Asynchronous Operation Processor

执行异步操作,并在完成后,向完成事件队列添加完成时间。从抽象的角度来看,内部服务如reactive_socket_service是asynchronous operation processors。

— Completion Event Queue

缓冲完成事件,直到它们被异步事件多路复用器从队列中取出。

— Completion Handler

处理异步操作的结果。这些是函数对象,通常使用boost :: bind创建

— Asynchronous Event Demultiplexer

Blocks waiting for events to occur on the completion event queue, and returns a completed event to its caller.

阻塞等待事件在完成事件队列上发生,并将完成的事件返回给其调用方。

— Proactor

Calls the asynchronous event demultiplexer to dequeue events, and dispatches the completion handler (i.e. invokes the function object) associated with the event. This abstraction is represented by the io_context class.

— Initiator

Application-specific code that starts asynchronous operations. The initiator interacts with an asynchronous operation processor via a high-level interface such as basic_stream_socket, which in turn delegates to a service like reactive_socket_service.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值