文件一个字节实际会发生多大的磁盘IO?
图中的代码仅仅只是对某个文件读取了一个字节,基于这个代码片段我们来思考: 1、读取文件 1 个字节是否会导致磁盘 IO ? 2、如果发生了磁盘 IO,那发生的是多大的 IO 呢? 大家平时用的各种语言 C++、PHP、Java、Go 啥的封装层次都比较高,把很多细节都给屏蔽的比较彻底。如果想把上面的问题搞清楚,需要剖开 Linux 的内部来看 Linux 的 IO 栈。 一、大话 Linux IO 栈 废话不多说,我画了一个 Linux IO 栈的简化版本。过 IO 栈可以看到,我们在应用层简单的一次 read 而已,内核就需要 IO 引擎、VFS、PageCache、通用块管理层、IO 调度层等许多个组件来进行复杂配合才能完成。 那这些组件都是干啥的呢?我们挨个简单过一遍。不想看这个的同学可以直接跳到第二节的读文件读过程。 1.1 IO 引擎 开发同学想要读写文件的话,在 lib 库层有很多套函数可以选择,比如 read & write,pread & pwrite。这事实上就是在选择 Linux 提供的 IO 引擎。 常见的 IO 引擎种类如下:们开篇中代码片用的 read 函数就属于 sync 引擎。IO 引擎仍然处于上层,它需要内核层的提供的系统调用、VFS、通用块层等更底层组件的支持才能实现。 接着让我们继续深入到内核,来介绍各个内核组件。 1.2 系统调用 当进入到系统调用以后,也就进入到了内核层。 系统调用将内核中其它组件的功能进行封装,然后通过接口的形式暴露给用户进程来我们的读取文件的需求,系统调用需要依赖 VFS 内核组件。 1.3 VFS 虚拟文件系统 VFS 的思想就是在 Linux 上抽象一个通用的文件系统模型,对我们开发人员或者是用户提供一组通用的接口,让我们不用 care 具体文件系统的实现。VFS 提供的核心数据结构有四个,它们定义在内核源代码的 include/linux/fs.h 和 include/linux/dcachuperblock:Linux 用来标注具体已安装的文件系统的有关信息。 inode:Linux 中的每一个文件/目录都有一个 inode,记录其权限、修改时间等信息。 desty:目录项,是路径中的一部分,所有的目录项对象串起来就是一棵 Linux 下的目录树。 file:文件对象,用来和打开它的进程进行交互。
围绕这这四个核心数据结构,VFS 也都定义了一系列的操作方法。比如,inode 的操作方法定义 inode_operations,在它的里面定义了我们非常熟悉的 m (编辑:葫芦岛站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |