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

来源:互联网 发布:淘宝网实名认证 编辑:程序博客网 时间:2024/05/10 19:42

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”等流函数来说明的,因为后者的会先将数据在流缓存中进行操作,前者则无此步骤而直接和内核提供的块缓存进行交互,所以称前者是“不带缓存”的,其实对于内核来说,它还是进行了缓存的。