关于 IO 的几种模式的讨论(9.26 号更新)

本贴最后更新于 2689 天前,其中的信息可能已经天翻地覆

IO 的技术讨论

9.26 号的更新补充(增加新的看法)

  带着这个问题自己去看了早期 linux 内核的相关代码(因为设计的一个概念是一切皆文件,所以从文件系统相关内容开始浏览),但是发现会从 虚拟文件系统 —— 文件系统 —— 缓冲模块 —— 相应的底层读写 这样的流程走下来,越来越偏向底层。 从而产生了新的问题:

最新问题: 所以作为目前的大三学生来说(之前精力较多以 Web 开发为主),是否有必要花较多的精力来去学习 linux 相关内核 并去造一个小型的 OS 轮子呢?


> PS:该问题已同时在知乎上提问,大家倘若有兴趣,可以在知乎上看一下其他人的观点: [[作为一名学生,是否应该去花较多的精力看linux内核的源码呢?然后再重新造一个小型的轮子。](https://www.zhihu.com/question/51003849)](https://www.zhihu.com/question/51003849/answer/123680388?group_id=763728785135652864#comment-169676764)





如果根据用户空间与磁盘之间的访问方式的差异来划分 IO,我想应该可以划分为三大类

标准 IO

标准 IO 的过程: 用户地址空间 —— 内核地址空间 —— 磁盘空间

直接 IO

直接 IO 的过程: 用户地址空间 —— 磁盘空间

内存映射

内存映射的过程 : 内核地址空间 —— 磁盘空间 (并将用户空间的一段内存区域映射到内核空间)

PS : 倘若不清楚用户地址空间内核地址空间 二者的区别,可以查看操作系统相关原理:用户态与内核态的区别。

讨论问题 1: 这几种工作模式的使用场景是什么呢?

  自己目前只是做过一些 以 Servlet 为核心的 Java Web 开发项目,这其中负责和前端传输数据的角色一般是:Tomcat 或者是 Jetty。之前有读过部分 Tomcat 源码,不论是 NIO 还是 BIO (暂未看过 Apr 模块)都是符合 标准 IO 的工作方式: 用户地址空间 —— 内核地址空间 —— 磁盘空间,(只不过 NIO 的设计是采用了多路复用的思想)。所以由于自身眼界有限,并未接触过 直接 IO 和 内存映射这两种开发使用场景,请大家多多指教和讨论哈。

讨论问题 2 : 不同的 IO 模型与上述 IO 工作机制的联系是什么呢?

IO 模型的划分主要是分成以下几类:

  1. 阻塞 IO (BIO) (这里不再讨论非阻塞 IO)

  2. 多路复用 IO (NIO)

  3. 异步 IO (AIO)

这些不同的 IO 模型和上述的 IO 机制之间又有什么样的联系呢?

个人目前理解:BIO 和 NIO 都是符合标准 IO 的工作机制。

欢迎大家讨论哈 ~~~

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • 88250

    没研究过,欢迎分享心得。。

  • zonghua

    Java 的话,写 NIO 感觉很复杂,需要调用很多类和方法才能完成