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 模型的划分主要是分成以下几类:
-
阻塞 IO (BIO) (这里不再讨论非阻塞 IO)
-
多路复用 IO (NIO)
-
异步 IO (AIO)
这些不同的 IO 模型和上述的 IO 机制之间又有什么样的联系呢?
个人目前理解:BIO 和 NIO 都是符合标准 IO 的工作机制。
欢迎大家讨论哈 ~~~
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于