文件系统io分为direct io和buffer io,其中buffer io也叫normal io.
buffer io 对写IO而言有write back和write through,write back先写入到内存中,一段时间后,由内核线程写入到磁盘。由于内存比磁盘快很多,所以write back的速度很快。write back有一个缺点,就是当你掉电时,可能会丢失数据。这时候write through 就粉墨登场了, write through和write back相比,在写入内存的同时也写入到磁盘中,那为什么要写入到内存中呢,不是多此一举吗,这可能为了以后读的更快。不过我没有看到有文件系统实现 write through的,对文件系统来说,buffer io的写就是write back模式。
buffer io 对读io而言,首先查找file对于的 page cache,如果不存在,则从磁盘读入,然后再写入page cache。
direct io 不会和内存打交道,而是直接写入到存储设备中,由于存储设备的管理单元是块,所以direct io 的offset 和length必须和块大小对齐,一般物理设备的块大小是512,所以offset和length必须能被512整除。
我刚开始接触direct io时,对内存的buffer地址也要块或512对齐很难理解,后来经过看代码后,理解了为什么要这么做了,我们知道linux内核的内存是以页为单位的。direct io在内核里直接获取用户进程的虚拟地址对应的物理地址。然后我们知道存储设备都是以块为单位读取的。假如说内存的块大小和512不对齐,而是以4096-512-4 这样的内存地址给内核,那内核怎么办呢,读取512一个字节后,在这个页里已经放不下了,得再申请内存了,这有悖于
direct io 的初衷。
本文介绍了文件系统的两种IO操作:bufferio(包括writeback和writethrough)与directio的区别及应用场景。bufferio通过缓存提高读写效率,而directio则直接与存储设备交互,适用于对性能要求极高的场景。
329

被折叠的 条评论
为什么被折叠?



