网络编程实战
盛延敏
前大众点评云平台首席架构师
44207 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 40 讲
网络编程实战
15
15
1.0x
00:00/00:00
登录|注册

30 | 真正的大杀器:异步I/O探索

改进aio_error的方法
Linux内核层面支持异步I/O的发展
Windows下的选择
Linux下的选择
异步I/O的优势
Proactor模式
IOCompletetionPort(IOCP)
使用epoll等多路分发技术
有限支持
aio_read
aio_write
异步I/O
I/O多路复用技术
非阻塞I/O
阻塞I/O
思考题
总结
Windows下的IOCP和Proactor模式
Linux下socket套接字的异步支持
aio_read和aio_write的用法
阻塞/非阻塞 VS 同步/异步
异步I/O探索

该思维导图由 AI 生成,仅供参考

你好,我是盛延敏,这里是网络编程实战的第 30 讲,欢迎回来。
在性能篇的前几讲中,我们谈到了阻塞 I/O、非阻塞 I/O 以及像 select、poll、epoll 等 I/O 多路复用技术,并在此基础上结合线程技术,实现了以事件分发为核心的 reactor 反应堆模式。你或许还听说过一个叫做 Proactor 的网络事件驱动模式,这个 Proactor 模式和 reactor 模式到底有什么区别和联系呢?在今天的内容中,我们先讲述异步 I/O,再一起揭开以异步 I/O 为基础的 proactor 模式的面纱。

阻塞 / 非阻塞 VS 同步 / 异步

尽管在前面的课程中,多少都涉及到了阻塞、非阻塞、同步、异步的概念,但为了避免看见这些概念一头雾水,今天,我们就先来梳理一下这几个概念。
第一种是阻塞 I/O。阻塞 I/O 发起的 read 请求,线程会被挂起,一直等到内核数据准备好,并把数据从内核区域拷贝到应用程序的缓冲区中,当拷贝过程完成,read 请求调用才返回。接下来,应用程序就可以对缓冲区的数据进行数据解析。
第二种是非阻塞 I/O。非阻塞的 read 请求在数据未准备好的情况下立即返回,应用程序可以不断轮询内核,直到数据准备好,内核将数据拷贝到应用程序缓冲,并完成这次 read 调用。注意,这里最后一次 read 调用,获取数据的过程,是一个同步的过程。这里的同步指的是内核区域的数据拷贝到缓冲区的这个过程。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

异步I/O技术在网络编程中扮演着重要角色。本文深入探讨了阻塞/非阻塞I/O和同步/异步的概念,以及异步I/O的实际应用。通过对阻塞I/O、非阻塞I/O和基于非阻塞I/O的多路复用技术的比较,阐述了异步I/O的优势和应用场景。文章还介绍了aio_read和aio_write的用法,并给出了一个具体的例子,展示了如何使用aio系列函数来完成异步读写操作。通过这些实例,读者可以清晰地了解异步I/O的工作原理和使用方法。 在Linux下,异步操作的支持相对有限,因此在高性能网络程序设计时,首选Reactor模式,借助epoll这样的I/O分发技术完成开发。而在Windows下,IOCP则是一种异步I/O的技术,并由此产生了和Reactor齐名的Proactor模式,借助这种模式,可以完成Windows下高性能网络程序设计。 总的来说,异步I/O的读写动作由内核自动完成,在Linux下目前仅仅支持简单的基于本地文件的aio异步操作。而Windows下的IOCP则是一种异步I/O的技术,并由此产生了和Reactor齐名的Proactor模式,借助这种模式,可以完成Windows下高性能网络程序设计。 综上所述,本文通过深入探讨异步I/O技术及其在Linux和Windows下的应用,为读者提供了全面的了解和实际应用指导。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《网络编程实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(32)

  • 最新
  • 精选
  • fackgc17
    Linux 的 AIO 机制可能后面逐渐不用了,可以关注 5.1 的 io_uring 机制,大杀器

    作者回复: 赞,学习了。

    2019-10-16
    32
  • 进击的巨人
    非常好的总结:Reactor 模式是基于待完成的 I/O 事件,而 Proactor 模式则是基于已完成的 I/O 事件。

    作者回复: 都是前人栽树,后人乘凉 )

    2020-11-15
    9
  • 马不停蹄
    异步I/O就相当于当数据真正到达或者说应用程序读取完数据了通过注册的回调函数通知你去处理,用 netty 是这样的,但是老师有个问题一直不明白:netty 并没有用异步I/O,而是基于(多路复用+非阻塞I/O)+ Future 实现了异步非阻塞吗?

    作者回复: Netty用的就是epoll,基于多路复用+非阻塞I/O,至于Future,只是Java里包装异步调用的一种方式,并不是真正的异步 I/O。

    2019-11-13
    7
  • TinyCalf
    老师我有些想法不知道正不正确: 其实我用非阻塞IO,自己写代码把数据拷贝过程和业务处理过程分离到多个线程,也能实现代码层面的异步,而操作系统提供的异步IO只不过是把这个过程转到内核态去完成;可能内核处理这些逻辑比我们自己写的代码效率要高些,但是绝对不会像多路复用接口一样带来巨大的效率提升;nodejs好像就是这样,用非阻塞IO+libuv实现的eventloop来实现代码层面的异步,但并没有使用异步IO接口

    作者回复: Linux系统提供的异步I/O还停留在很浅的阶段,所以,现实的做法都是多路复用+非阻塞I/O来完成你说的"代码层面的异步",这已经足够高效和有用了。

    2020-11-10
    6
  • null
    还是没太理解阻塞和同步之间的区别 1. 阻塞:只是针对线程挂起这一场景,线程无法获取 cpu 时间片,无法处理其他逻辑。 2. 非阻塞:线程正常获取 cpu 时间片,正常运行,可以不断轮询 read 函数,快速返回,同时也可以处理其他逻辑。 结论:阻塞和非阻塞的区别,只是针对线程是否挂起(即能否获取 cpu 时间片)。 同步:线程自己读取数据,不断地从内核缓冲区读取到应用程序缓冲区,直到读取所有数据。读数据期间线程忙个不停,疲于奔命。(读数据这期间线程脱身去无法处理其他逻辑) 异步:内核把所有数据写到应用程序缓冲区,再通知应用程序处理。在通知之前,应用程序都可以去处理其他逻辑。 结论:同步和异步的区别,只是针对谁将数据读到应用程序缓冲区。 自己一直混淆阻塞和同步的概念,应该都是被“线程无法处理其他逻辑”所迷惑,感觉两者的表现都是一样的,都是无法处理其他逻辑,因此将这两个概念混为一谈。 老师,请问一下,我对阻塞/非阻塞和同步/异步的理解,并且相关的结论,是否正确?谢谢老师!!

    作者回复: 我觉得你get到了。

    2021-04-14
    3
    5
  • 传说中的成大大
    看第二遍理解了reactor和proactor的区别前者是同步 有消息到达时调用应用程序的回调,应用程序自己调用read 同步取得数据,而后者是内核异步数据读取完成之后才调用应用程序的回调

    作者回复: 我理解Linux下标榜的proactor其实都是伪的。

    2019-10-16
    4
  • 传说中的成大大
    而突然又理解到了同步i/o和异步i/o的问题 比如我调用read函数 在read函数返回之前数据被拷贝到缓冲区这个过程就是同步i/o的操作 像后面的aio系列函数 是在函数调用后 内核把数据拷贝到应用层缓冲区 这个就叫异步

    作者回复: 你真的悟道了,哈哈:)

    2019-10-16
    4
  • 土豆牛肉
    既然Windows有iocp,是不是可以说Windows更适合运行网络服务器呢

    作者回复: 不是哦,只是设计上各有千秋,现在互联网上跑的最多的还是Linux,就连微软,也在积极拥抱Linux。

    2019-11-20
    3
  • 传说中的成大大
    issue和mr是啥意思啊,没接触到过呢!

    作者回复: issue是提一个问题到github上,mr是看哪里有问题直接改代码,提一个merge request过来,我直接merge到master把问题解决了

    2019-10-19
    2
  • 程序水果宝
    看了最近几篇文章以后个人感觉应该把反应堆、epoll、异步和同步的函数列出来配合着它们的功能讲,很有可能不懂的地方都在那些封装的函数里面,像main函数里面的内容反而给出链接加注释就可以了,这样可能会让人的理解更加深刻一些。还有实验结果也不用列这么多,这些完全可以由自己去实验。

    作者回复: 感谢你的建议。时间有限,做出来的内容可能没有办法满足所有人的需求。在第四篇里可能会解答你的大部分疑惑,如果有进一步的问题,我可以在答疑中统一回复,解答大家的疑惑。

    2019-10-16
    2
    2
收起评论
显示
设置
留言
32
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部