为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

牧羊人nacy 2019-05-20 18:29:52
好像都是数据复制中去掉了内核缓存?
查看完整描述

2 回答

?
慕哥9229398

TA贡献1877条经验 获得超6个赞

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

TA贡献1777条经验 获得超3个赞

两个不是一个概念。DirectIO和BufferIO相对应。DirectIO就是直接把IO请求提交给底层IO设备,不经过缓存处理。
BufferIO就是IO请求经过缓存子系统处理,例如Linux上的VFSCache层;写数据会先写入内存,写入内存后就会返回,不等数据刷到磁盘上。读数据会从先尝试从内存中读取,如果内存中命中,就不需要从磁盘上读取了。BufferIO会带来读写性能的大幅度提升,这和在数据库前面加一个Memcached是一样的概念。大多数场景下,BufferIO都是最优选择。
以下情况下我们可能需要考虑DirectIO:
对数据写的可靠性要求很高,必须确保数据落到磁盘上,业务逻辑才可以继续执行。
特定场景下,系统自带缓存算法效率不高,应用层自己实现出更高的算法。
而内存映射是另外一个很大的概念,展开会有很多内容;仅看文件IO这部分,像通过Linuxmmap这样的方式访问文件,实际上就是由应用分配了一段内存,这段内存直接充当了文件读写过程中的缓存,用户态可以直接访问,而不是像普通的read/write方式需要把用户态的buffer拷贝到内核分配的缓存上,其本质还是bufferIO,只是省去了用户态到内核态的拷贝开销。
                            
查看完整回答
反对 回复 2019-05-20
  • 2 回答
  • 1 关注
  • 1202 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信