Linux 文件系统 I/O 详解

I/O 指的是相对内存而言的 input 和 output。从文件、数据库、网络向内存中写入数据叫做 input;从内存向文件、数据库、网络中输出数据叫做 output。Linux 系统 I/O 分为内核准备数据和将数据从内核拷贝到用户空间两个阶段。

I/O 的两种方式(缓存 I/O & 直接 I/O)

缓存 I/O

缓存 I/O 又被称作标准 I/O,大多数文件系统的默认 I/O 操作都是缓存 I/O。在 Linux 的缓存 I/O 机制中,数据先从磁盘复制到内核空间的缓冲区,然后从内核空间缓冲区复制到应用程序的地址空间(用户空间)。

读操作:操作系统检查内核空间的缓冲区有没有需要的数据,如果已经缓存了,那么就直接从缓存中返回,也就是将数据复制到应用程序的用户空间;否则从磁盘中读取数据至内核空间的缓冲区,再将内核空间缓冲区的数据返回。

写操作:将数据从用户空间复制到内核空间的缓冲区,这时对用户程序来说写操作就已经完成。至于什么时候将数据从内核空间写到磁盘中,这步由操作系统决定,除非显示地调用了 sync 同步命令。

缓存 I/O 的优点:

  • 在一定程度上分离了内核空间和用户空间,保护系统本身的运行安全;
  • 可以减少读盘的次数,从而提高性能。

缓存 I/O 的缺点:

在缓存 I/O 机制中,DMA 方式可以将数据直接从磁盘读到内核空间的页缓存中,或者将数据从内核空间的页缓存中直接写回到磁盘上,而不能直接在应用程序地址空间(用户空间)和磁盘之间进行数据传输。这样,数据在传输过程中需要在应用程序地址空间(用户空间)和页缓存(内核空间)之间进行多次数据拷贝操作,这些数据拷贝操作所带来的 CPU 以及内存开销是比较大的。

直接 I/O

直接 IO 就是应用程序直接访问磁盘,而不经过内核缓冲区,这样做的目的是减少一次从内核缓冲区到用户程序地址空间的数据复制操作。

例如数据库管理系统这类应用,它们更倾向于选择自己的缓存机制,因为数据库管理系统往往比操作系统更了解数据库中存放的数据。数据库管理系统可以提供一种更加高效的缓存机制来提高数据库中存取数据的性能。

内存映射 memory mapped

应用程序如何跳过内核直接访问磁盘呢?这需要用到 “内存映射” 技术。

内存映射又被称为内存映射文件、文件映射,是一段用户空间地址逐字节地映射到磁盘文件地址中的技术,它使得应用程序处理映射部分的数据如同访问主内存(也就是内核空间)。为什么叫内存映射或文件映射呢?这里的内存和文件指的就是磁盘的一部分空间,这部分空间显然与普通的磁盘是不一样的,它被称作 “虚拟内存” 。虚拟内存在功能上如同主内存(内核空间),但是在读写速度上差距是不小的。

虚拟内存

内存映射技术依赖于虚拟内存。虚拟内存是计算机系统内存管理的一种技术,它把内存扩展到磁盘,也就是把磁盘的一部分空间当作内存来用,这部分空间在级别上等同于系统内核空间。虚拟内存技术有效地扩展了内存空间,适用于大文件的存储操作。

比方说一个电脑内存就 4G,用户空间被分配 3G,内核空间被分配 1G。一个大文件体积是 2G,这么大的东西要通过系统内核空间存储到磁盘就比较费劲了。电脑磁盘是 256G,如果使用虚拟内存技术把磁盘的一部分 2G 空间映射到用户空间的文件处理进程的地址上,内存管理程序只需要把大文件复制从用户空间复制到对应的虚拟内存中即可。这就是虚拟内存的一个使用场景,它避免通过内核空间的二次复制即可将大文件存储至磁盘。

内存映射流程

用户空间首先调用 mmap 函数将一段空闲且连续的磁盘地址初始化为虚拟内存空间并将虚拟内存空间与用户空间形成映射关系。形成映射关系的用户空间实际指的是某一进程占用的用户空间,内存映射发生在进程中。多个进程可以同时映射到同一块虚拟内存空间,虚拟内存空间又被称作共享对象。

详细步骤如下:
1、在磁盘上寻找一段空闲且连续的空间
2、初始化该空间为内存区域
3、将该内存区域插入到进程的地址区域链表中
4、通过待映射的文件指针、文件描述符调用内核空间的 mmap 函数
5、此 mmap 函数通过虚拟文件系统的 innode 模块定位虚拟内存区域的磁盘地址
6、通过 remap_pfn_range 建立页表,实现用户空间与虚拟内存的映射关系
7、进程读写操作访问虚拟内存空间
8、如果进程写操作修改了虚拟内存空间的数据形成脏页
9、一定时间后,系统会自动将脏页写入磁盘

直接 IO 的缺点:

如果访问的数据不在应用程序(用户空间)缓存中,那么每次数据都会直接从磁盘加载,这种直接加载比较缓慢。从磁盘加载与从内存加载相比,肯定是慢很多。通常直接 IO 与异步 IO 结合使用,会得到比较好的性能。(异步 IO:当访问数据的线程发出请求之后,线程会接着去处理其它事,而不是阻塞等待。)

常规文件读写,缓存 I/O
内存映射文件读写,直接 I/O

PIO 与 DMA

有必要简单地说说慢速 I/O 设备和内存之间的数据传输方式。

PIO
很早以前,磁盘和内存之间的数据传输是需要 CPU 控制的,也就是说如果我们读取磁盘文件到内存中,数据要经过 CPU 存储转发,这种方式称为 PIO。显然这种方式非常不合理,需要占用大量的 CPU 时间来读取文件,造成文件访问时系统几乎停止响应。

DMA
后来,DMA(直接内存访问,Direct Memory Access)取代了 PIO,它可以不经过 CPU 而直接进行磁盘和内存的数据交换。在 DMA 模式下,CPU 只需要向 DMA 控制器下达指令,让 DMA 控制器来处理数据的传送即可。DMA 控制器通过系统总线来传输数据,传送完毕再通知 CPU,这样就在很大程度上降低了 CPU 占有率,显著提升了系统性能。DMA 的传输速度与 PIO 的差异其实并不十分明显,因为这主要取决于慢速设备的速度,前者的关键优势是释放了 CPU 的占用。

可以肯定的是,PIO 模式的计算机我们现在已经很少见到了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342