< 返回我的博客

Joeyscat 发表于 2021-12-28 21:27

Tags:test1,test2

2.1 asio 网络 IO 库实现原理 Asio是一个优秀网络库,依赖于 boost 库的部分实现,支持 linux、windos、unix 等多平台,mongodb 基于 asio 库来实现网络 IO 及定时器处理。asio 库由于为了支持多平台,在代码实现中用了很多 C++的模板,同时用了很多 C++的新语法特性,因此整体代码可读性相比 mongodb 服务层代码差很多。

服务端网络 IO 异步处理流程大体如下:

  1.调用 socket()创建一个套接字,获取一个 socket 描述符。

  2.调用 bind()绑定套接字,同时通过 listen()来监听客户端链接,注册该 socket 描述符到 epoll 事件集列表,等待 accept 对应的新连接读事件到来。

  3. 通过 epoll_wait 获取到 accept 对应的读事件信息,然后调用 accept()来接受客户的连接,并获取一个新的链接描述符 new_fd。

  4. 注册新的 new_fd 到 epoll 事件集列表,当该 new_fd 描述符上有读事件到来,于是通过 epoll_wait 获取该事件,开始该 fd 上的数据读取。

  5. 读取数据完毕后,开始内部处理,处理完后发送对应数据到客户端。如果一次 write 数据到内核协议栈写太多,造成协议栈写满,则添加写事件到 epoll 事件列表。

服务端网络 IO 同步方式处理流程和异步流程大同小异,少了 epoll 注册和 epoll 事件通知过程,直接同步调用 accept()、recv()、send()进行 IO 处理。

  同步 IO 处理方式相对比较简单,下面仅分析和 mongodb 服务层 transport 模块结合比较紧密的 asio 异步 IO 实现原理。

  Mongodb 服务层用到的 Asio 库功能中最重要的几个结构有 io_context、scheduler、epoll_reactor。Asio 把网络 IO 处理任务、状态机调度任务做为 2 种不同操作,分别由两个继承自 operation 的类结构管理,每种类型的操作也就是一个任务 task。io_context、scheduler、epoll_reactor 最重要的功能就是管理和调度这些 task 有序并且高效的运行。
#[derive(Template)]
#[template(source = "{{strvar}}")]
struct TestTemplate {
    strvar: String,
}

fn main() {
    let s = TestTemplate {
        strvar: "// my <html> is \"unsafe\" & should be 'escaped'".to_string(),
    };
    assert_eq!(
        s.render().unwrap(),
        "&#x2f;&#x2f; my &lt;html&gt; is &quot;unsafe&quot; &amp; \
         should be &#x27;escaped&#x27;"
    );
}
  • 已选中
  • 未选中

评论区

写评论

还没有评论

1 共 0 条评论, 1 页