直接IO和内存映射究竟有何区别?

好像都是数据复制中去掉了内核缓存?

阅读 7.1k
2 个回答
  1. 一般的read要经过 磁盘-》内核缓冲区-》用户区的两次拷贝;
  2. 内存映射是虚拟内存技术,把一段文件直接映射到虚拟内存,这样就像访问内存一样访问文件(含缺页中断)而不需要read的两次拷贝,虚拟内存与物理内存的映射操作系统帮你解决,此外内存映射还可以用于IPC;
  3. 直接IO就是把1里面的内核缓冲区省略了(因为内核缓冲啥时候刷盘是由内核决定的具有不确定性,当然用户可以显示sync),用户可以自己来做缓冲;

两个不是一个概念。
Direct IO和Buffer IO相对应。
Direct IO就是直接把IO请求提交给底层IO设备,不经过缓存处理。

Buffer IO就是IO请求经过缓存子系统处理,例如Linux 上的VFS Cache层;
写数据会先写入内存,写入内存后就会返回,不等数据刷到磁盘上。
读数据会从先尝试从内存中读取,如果内存中命中,就不需要从磁盘上读取了。
Buffer IO会带来读写性能的大幅度提升,这和在数据库前面加一个Memcached是一样的概念。
大多数场景下,Buffer IO都是最优选择。

以下情况下我们可能需要考虑Direct IO:

  1. 对数据写的可靠性要求很高,必须确保数据落到磁盘上,业务逻辑才可以继续执行。
  2. 特定场景下,系统自带缓存算法效率不高,应用层自己实现出更高的算法。

而内存映射是另外一个很大的概念,展开会有很多内容;仅看文件IO这部分,像通过Linux mmap这样的方式访问文件,实际上就是由应用分配了一段内存,这段内存直接充当了文件读写过程中的缓存,用户态可以直接访问,而不是像普通的read/write方式需要把用户态的buffer拷贝到内核分配的缓存上,其本质还是buffer IO,只是省去了用户态到内核态的拷贝开销。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题