最近复习IO,突然就搜到了几篇比较好的文章,相见恨晚。直接把链接放在下面:
聊聊BIO,NIO和AIO (1):https://www.jianshu.com/p/ef418ccf2f7d
聊聊BIO,NIO和AIO (2):https://www.jianshu.com/p/444646e02ef7
文章来自简书“大宽宽”作者的一个 IO 系列,可惜第三篇“难产”了。
想分享这篇文章是因为作者写得真是太有意思了,挺多概念被作者一阐述就感觉很清晰、很“新颖”(解谜永远是一件新颖的事情~~~)。同时我也觉得,里面的内容对于讲述IO来说“足够全面”,让你从方方面面对 IO 有一个认知,是不可多得的学习 IO 的好文~~~
比如第(1)篇中提到的:
操作系统中对于可预见的block才会主动 block。。。
因此对 linux 来说,磁盘IO永远不会主动 BLOCK,那么read函数读不到数据时怎么办?我的猜测是while循环查询直到“硬盘读到数据并copy到内核缓冲区”。
PS:硬盘抖动一说我没有验证,不过在这里可以辩证去看,有或无对网络IO block 影响不大。
网络IO block 是 BIO 讨论的范围,linux 只对网络IO 进行必要的主动 block,称之为 BIO 模型......在经历了 BIO 多线程模型的摧残后(大量context switch 浪费CPU),linux 提供了NIO(non-blocking IO),即将 IO 设为 non-blocking 模式......
脱坑小心得:
之前还看到某些文章指出 NIO 在 java 里称为“new IO”,这也是历史问题,NIO 从引进(1.4)到第二代 NIO(1.7)跨越了好几代,很多资料连这几个字都没有描述出来,让一些新手觉得费解。
刚好也在前几天翻了李林峰的《netty权威指南》,确实能学到点东西。里面指出,“在java 1. 4 之前的版本,对IO支持不完善,甚至没有 非阻塞IO”,书中跨了一个小章节后也提到,java 1.7 更新了 NIO 2.0,声称“提供了 AIO功能,支持基于文件的异步IO 和 针对网络套接字的异步IO”,基于文件的异步IO可能是通过DMA支持,但针对网络的异步IO是如何做到的呢?
本文开头分享的链接中的第(2)篇中也讲解了一些 AIO,但都是针对磁盘(文件)的AIO,没有介绍到linux对网络AIO的支持,这个点上,李林峰老师确实给我们又挖了一个“坑”~~~
综上,如果你是久经历练的编程老兵,在阅读任何技术资料的时候都应该保持一颗中立的心去看待去学习,时刻保持清醒,不要认为人家出了书或者有了一定名气里面讲的东西就全是对的,要以批判的眼光去看。同时要做笔记,记录下疑惑的地方,以任何你将来能够迅速搜索的方式(我的方式是:做成本地文档+云文档+本地化搜索工具 listary,秒查笔记),将来碰到同一个问题能够快速对比、检验,并留存新的知识点和证据,经过不断论证的过程,提升自己的知识水平和认知能力。
本文分享就到此结束了,下一篇分享暂定会分享 “linux 零拷贝的几种实现”,也是最近刚搜到的不可多得的好文。咱们下一篇见~~~
(已更新:https://www.cnblogs.com/christmad/p/13289283.html)