带缓存的I/O和不带缓存的I/O的区别

APUE》的第三章为“不带缓存的I/O”,第五章为“带缓存的I/O”。

        首先,我们需要明确一点,上面两个是“术语”,不是“述语”(描述性质的语言)。

         其实“不带缓存的I/O”实际上也是带缓存的,只不过此缓存非比缓存,这里的“不带缓存”指的是“不带流缓存”,而这也就是和“带缓存的I/O”的区别了。

         下面让我详细解释下:

         APUE》上对“不带缓存的I/O”的定义是:每个readwrite都调用内核中的一个系统调用。什么意思?

         是这样的:当我们调用write函数时,直接调用系统调用,将数据写入到块缓存进行排队,当块缓存达到一定量时,才会把数据写入磁盘。

         而带缓存的I/O对其进行了改进,它提供了一个流缓存,当用fwrite函数时,先把数据写入到流缓存中,当达到一定条件,如:流缓存区满了、刷新流缓存时,才会把数据一次性送往内核提供的块缓存中,再经块缓存写入磁盘。

         这样说如果还有些不清楚的话请看下面:

         不带缓存的I/O的操作(以写为例)

                   1将数据写入内核提供的块缓存

                   2经块缓存写入磁盘

         带缓存的I/O的操作(以写为例)

                   1将数据写入流缓存直至达到条件

                  2将数据一次性写入内核提供的块缓存

                   3经块缓存写入磁盘

         怎么样?这样就清楚些了吧。“带缓存的I/O”比“不带缓存的I/O”多了一步,而另外两步一样。

         其实,标准库中的“带缓存的I/O”就是调用系统提供的“不带缓存的I/O”实现的。

         最后,总结一下:“不带缓存的I/O”是相对于“带缓存的I/O”等流函数来说明的,因为后者的会先将数据在流缓存中进行操作,前者则无此步骤而直接和内核提供的块缓存进行交互,所以称前者是“不带缓存”的,其实对于内核来说,它还是进行了缓存的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值