文件系统direct io 和buffer io

来源:互联网 发布:家具图纸设计软件 编辑:程序博客网 时间:2024/05/29 18:45

        文件系统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 的初衷。

    




原创粉丝点击