加入收藏 | 设为首页 | 会员中心 | 我要投稿 葫芦岛站长网 (https://www.0429zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长资讯 > 外闻 > 正文

文件一个字节实际会发生多大的磁盘IO?

发布时间:2021-04-18 16:04:42 所属栏目:外闻 来源:互联网
导读:图中的代码仅仅只是对某个文件读取了一个字节,基于这个代码片段我们来思考: 1、读取文件 1 个字节是否会导致磁盘 IO ? 2、如果发生了磁盘 IO,那发生的是多大的 IO 呢? 大家平时用的各种语言 C++、PHP、Java、Go 啥的封装层次都比较高,把很多细节都给屏蔽

图中的代码仅仅只是对某个文件读取了一个字节,基于这个代码片段我们来思考:

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

(编辑:葫芦岛站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读