30 | 真正的大杀器:异步I/O探索
该思维导图由 AI 生成,仅供参考
阻塞 / 非阻塞 VS 同步 / 异步
- 深入了解
- 翻译
- 解释
- 总结
异步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)
- 最新
- 精选
- fackgc17Linux 的 AIO 机制可能后面逐渐不用了,可以关注 5.1 的 io_uring 机制,大杀器
作者回复: 赞,学习了。
2019-10-1632 - 进击的巨人非常好的总结:Reactor 模式是基于待完成的 I/O 事件,而 Proactor 模式则是基于已完成的 I/O 事件。
作者回复: 都是前人栽树,后人乘凉 )
2020-11-159 - 马不停蹄异步I/O就相当于当数据真正到达或者说应用程序读取完数据了通过注册的回调函数通知你去处理,用 netty 是这样的,但是老师有个问题一直不明白:netty 并没有用异步I/O,而是基于(多路复用+非阻塞I/O)+ Future 实现了异步非阻塞吗?
作者回复: Netty用的就是epoll,基于多路复用+非阻塞I/O,至于Future,只是Java里包装异步调用的一种方式,并不是真正的异步 I/O。
2019-11-137 - TinyCalf老师我有些想法不知道正不正确: 其实我用非阻塞IO,自己写代码把数据拷贝过程和业务处理过程分离到多个线程,也能实现代码层面的异步,而操作系统提供的异步IO只不过是把这个过程转到内核态去完成;可能内核处理这些逻辑比我们自己写的代码效率要高些,但是绝对不会像多路复用接口一样带来巨大的效率提升;nodejs好像就是这样,用非阻塞IO+libuv实现的eventloop来实现代码层面的异步,但并没有使用异步IO接口
作者回复: Linux系统提供的异步I/O还停留在很浅的阶段,所以,现实的做法都是多路复用+非阻塞I/O来完成你说的"代码层面的异步",这已经足够高效和有用了。
2020-11-106 - null还是没太理解阻塞和同步之间的区别 1. 阻塞:只是针对线程挂起这一场景,线程无法获取 cpu 时间片,无法处理其他逻辑。 2. 非阻塞:线程正常获取 cpu 时间片,正常运行,可以不断轮询 read 函数,快速返回,同时也可以处理其他逻辑。 结论:阻塞和非阻塞的区别,只是针对线程是否挂起(即能否获取 cpu 时间片)。 同步:线程自己读取数据,不断地从内核缓冲区读取到应用程序缓冲区,直到读取所有数据。读数据期间线程忙个不停,疲于奔命。(读数据这期间线程脱身去无法处理其他逻辑) 异步:内核把所有数据写到应用程序缓冲区,再通知应用程序处理。在通知之前,应用程序都可以去处理其他逻辑。 结论:同步和异步的区别,只是针对谁将数据读到应用程序缓冲区。 自己一直混淆阻塞和同步的概念,应该都是被“线程无法处理其他逻辑”所迷惑,感觉两者的表现都是一样的,都是无法处理其他逻辑,因此将这两个概念混为一谈。 老师,请问一下,我对阻塞/非阻塞和同步/异步的理解,并且相关的结论,是否正确?谢谢老师!!
作者回复: 我觉得你get到了。
2021-04-1435 - 传说中的成大大看第二遍理解了reactor和proactor的区别前者是同步 有消息到达时调用应用程序的回调,应用程序自己调用read 同步取得数据,而后者是内核异步数据读取完成之后才调用应用程序的回调
作者回复: 我理解Linux下标榜的proactor其实都是伪的。
2019-10-164 - 传说中的成大大而突然又理解到了同步i/o和异步i/o的问题 比如我调用read函数 在read函数返回之前数据被拷贝到缓冲区这个过程就是同步i/o的操作 像后面的aio系列函数 是在函数调用后 内核把数据拷贝到应用层缓冲区 这个就叫异步
作者回复: 你真的悟道了,哈哈:)
2019-10-164 - 土豆牛肉既然Windows有iocp,是不是可以说Windows更适合运行网络服务器呢
作者回复: 不是哦,只是设计上各有千秋,现在互联网上跑的最多的还是Linux,就连微软,也在积极拥抱Linux。
2019-11-203 - 传说中的成大大issue和mr是啥意思啊,没接触到过呢!
作者回复: issue是提一个问题到github上,mr是看哪里有问题直接改代码,提一个merge request过来,我直接merge到master把问题解决了
2019-10-192 - 程序水果宝看了最近几篇文章以后个人感觉应该把反应堆、epoll、异步和同步的函数列出来配合着它们的功能讲,很有可能不懂的地方都在那些封装的函数里面,像main函数里面的内容反而给出链接加注释就可以了,这样可能会让人的理解更加深刻一些。还有实验结果也不用列这么多,这些完全可以由自己去实验。
作者回复: 感谢你的建议。时间有限,做出来的内容可能没有办法满足所有人的需求。在第四篇里可能会解答你的大部分疑惑,如果有进一步的问题,我可以在答疑中统一回复,解答大家的疑惑。
2019-10-1622