linux文件IO:mmap 、read/write、fread/fwrite

#include <unistd.h> —— write( )
无流缓存IO操作数据流向路径:数据—read/write—内核缓存区—fsync—磁盘

#include <stdio.h> —— fwrite( )
标准IO操作数据流向路径:数据—fread/fwrite—流缓存区—read/write—内核缓存区—fsync—磁盘

  1. 当数据通过fwrite写入流缓存区后,需要直到流缓冲区达到一定大小后,stdio库底层才会调用write,将数据写入内核缓冲区;
  2. 当数据通过fread读入数据时,stdio底层会通过read从内核缓冲区读取一大块数据到流缓冲区,通常是4K,即使fread只读取一小块数据。

频繁多次read/write操作,会增加CPU对磁盘读写的次数,增加了CPU的使用率,还增加了读写的耗时,一次磁盘IO操作大致10ms。通过增加缓冲区,可以使用内存的空间减少CPU的使用率和IO的延时。

mmap与read/write两条路线对文件的访问比较

我们知道无论是通过mmap或read/write访问文件在内核中都必须经过缓存, 当需要从文件读写内容时,都经过内存拷贝的方式与内核中的缓存进行通讯。

  1. 用read/write方式,用户须向内核指定要读多少,内核再把得到的内容从内核缓存拷向用户空间;写也须要有一个大致如此的过程。

  2. mmap的作用是通过把文件的某一块内容映射到用户空间上,即将之前所述的内核缓存映射到用户空间,这样就可以直接通过内核缓冲池读写这一块内容,这样一来就少了内核与用户空间的来回拷贝,所以通常更快。

所以mmap的优势就是相对于read/write就是减少了一次内核缓存到用户空间内存的拷贝开销,但是 mmap在建立映射时必须制定映射区域,所以这种方式只适用于更新、读写一块固定大小的文件区域,而不能不断的以增长方式向文件写内容。

标准访问文件的方式:以标准的方式stdio对文件进行读写
在这里插入图片描述

同步访问文件的方式:数据同步write+sync写回磁盘
在这里插入图片描述

内存映射方式:利用 mmap 代替 read
在这里插入图片描述

直接 I/O 方式:数据传输不经过操作系统内核缓冲区DAX
在这里插入图片描述

异步访问文件的方式:CPU 处理其他任务和 I/O 操作可以重叠执行
在这里插入图片描述

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值