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