
标准文件访问方式
在 Linux 中,这种访问文件的方式是通过两个系统调用实现的:read() 和 write()。
-
当应用程序调用 read() 系统调用读取一块数据的时候,如果该块数据已经在内存中了,那么就直接从内存中读出该数据并返回给应用程序;
-
如果该块数据不在内存中,那么数据会被从磁盘上读到页高缓存中去,然后再从页缓存中拷贝到用户地址空间中去。
对于写数据操作来说,当一个进程调用了 write() 系统调用往某个文件中写数据的时候,数据会先从用户地址空间拷贝到操作系统内核地址空间的页缓存中去,然后才被写到磁盘上。
但是对于这种标准的访问文件的方式来说,在数据被写到页缓存中的时候,write() 系统调用就算执行完成,并不会等数据完全写入到磁盘上。
特点:准确性一般,但是快。
直接I/O访问方式
所谓的直接I/O的方式就是应用程序直接访问磁盘数据,而不经过操作系统内核数据缓存区,这样做的目的就是减少一次从内核缓冲区到用户程序缓存的数据复制。
这种访问方式在一些特别的mq中间件中会有使用到。
特点:准确性高,但是慢。
同步文件访问方式
同步访问文件的方式比较容易理解,就是数据的读取和写入都是同步操作的,他与标准访问文件的方式不同的是,只有当数据被成功写到磁盘时才返回给应用程序成功的标志。
这种访问文件的方式性能比较差,只有在一些对数据安全性要求比较高的场景中才会使用,而且通常这种操作方式的硬件都是定制的。
特点:准确性高,但是慢。
异步访问文件方式
异步访问文件的方式就是当访问数据的线程发出请求之后,线程会接着去处理其他事情,而不是阻塞等待,当请求的数据返回后继续处理下面的操作。这种访问文件的方式可以明显的提高应用程序的效率,但是不会改变访问文件的效率。
特点:持久化依靠操作系统页缓存刷盘机制,但是可以解放调用方线程的等待过程。
异步访问文件的方式如下图所示:
内存映射文件方式
内存映射的方式是指操作系统将内存中的某一块区域与磁盘中的文件关联起来,当要求访问内存中的一段数据时,转换为访问文件的某一段数据。
这种方式的目的同样是减少数据从内核空间缓存到用户空间缓存的数据复制操作,因为这两个空间的数据是共享的。
特点:持久化依靠操作系统页缓存刷盘机制,但是性能高。
原文始发于微信公众号(Idea的技术分享):操作系统的几种文件IO方式
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/261325.html