好像都是数据复制中去掉了内核缓存?
2 回答
慕哥9229398
TA贡献1877条经验 获得超6个赞
一般的read要经过磁盘-》内核缓冲区-》用户区的两次拷贝;内存映射是虚拟内存技术,把一段文件直接映射到虚拟内存,这样就像访问内存一样访问文件(含缺页中断)而不需要read的两次拷贝,虚拟内存与物理内存的映射操作系统帮你解决,此外内存映射还可以用于IPC;直接IO就是把1里面的内核缓冲区省略了(因为内核缓冲啥时候刷盘是由内核决定的具有不确定性,当然用户可以显示sync),用户可以自己来做缓冲;
慕森王
TA贡献1777条经验 获得超3个赞
两个不是一个概念。DirectIO和BufferIO相对应。DirectIO就是直接把IO请求提交给底层IO设备,不经过缓存处理。BufferIO就是IO请求经过缓存子系统处理,例如Linux上的VFSCache层;写数据会先写入内存,写入内存后就会返回,不等数据刷到磁盘上。读数据会从先尝试从内存中读取,如果内存中命中,就不需要从磁盘上读取了。BufferIO会带来读写性能的大幅度提升,这和在数据库前面加一个Memcached是一样的概念。大多数场景下,BufferIO都是最优选择。以下情况下我们可能需要考虑DirectIO:对数据写的可靠性要求很高,必须确保数据落到磁盘上,业务逻辑才可以继续执行。特定场景下,系统自带缓存算法效率不高,应用层自己实现出更高的算法。而内存映射是另外一个很大的概念,展开会有很多内容;仅看文件IO这部分,像通过Linuxmmap这样的方式访问文件,实际上就是由应用分配了一段内存,这段内存直接充当了文件读写过程中的缓存,用户态可以直接访问,而不是像普通的read/write方式需要把用户态的buffer拷贝到内核分配的缓存上,其本质还是bufferIO,只是省去了用户态到内核态的拷贝开销。
添加回答
举报
0/150
提交
取消