操作系统Buffer I/O和Direct I/O

前言

Buffer I/O和Direct I/O是操作系统中文件I/O的两种方式
在这里插入图片描述
看这张图,不难看出Buffer IO和磁盘之间读取操作多了一层Page Cache和File System,这两个是干嘛的,以及mmap是干嘛的,后面会明白。

Buffer I/O

  • Buffer I/O基于read和write两个系统调用实现,在内核地址空间存在Page Cache(页缓存)
  • read时,先去读页缓存,如果存在,则直接返回数据给应用程序。否则,去磁盘中查询
  • write时,先从应用程序地址空间把数据拷贝到Page Cache所在的地址空间,之后再写入磁盘。
  • 需要额外注意的是,页缓存是存在于内核空间的,故用户没办法一次搞定,而是需要两次数据拷贝才能完成用户进程对数据的读取操作。写操作也是一样,将页缓存的数据写入磁盘的时候,必须先拷贝到内核空间对应的主存,然后在写入磁盘中。

多copy一次,效率会低,怎么办呢?

Buffer I/O 中引入一类特别的操作叫做内存映射文件(mmap),它会减少一层数据从用户地址空间到操作系统地址空间的复制开销 。

原理是,使用mmap函数的时候,会在当前进程的用户地址空间中开辟一块内存这块内存与系统的文件进行映射。

对这块内存的读取和写入,会转化为对相应文件的操作。 并且,在进程退出的时候,会将变化的内容(脏页)自动回写到对应的文件里面。

Direct I/O

Direct I/O通过直接 I/O 方式进行数据传输,数据均直接在用户地址空间的缓冲区和磁盘之间直接进行传输,中间少了页缓存的支持。

什么时候会使用Direct I/O呢?

对于某些特殊的应用程序,比如说数据库管理系统这类应用,他们更倾向于选择他们自己的缓存机制,因为数据库管理系统往往比操作系统更了解数据库中存放的数据,数据库管理系统可以提供一种更加有效的缓存机制来提高数据库中数据的存取性能。

总结

  • buffer I/O需要由系统在用户进程与驱动之间传递数据,所以每次read/write都要多一次在内核中数据的复制,相当于函数参数的传值方式,效率不高,但是“保护”了磁盘,减少了读盘次数。
  • direct I/O直接在用户和驱动之间传递地址,每次read/write都是在用户和驱动之间直接传数据,效率高
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值