关于行缓存,全缓存,无缓存的基本原理

下家山(csdn的富文本处理出问题,无法删除下面的空行)

 

 

 

 

 要把行缓存,全缓存,行缓存相关知识彻底的搞清楚,需要了解的知识比较多,本文只从应用出发,不罗嗦不累赘直击重点。

1:什么是行缓存

先看例子:

程序中的while(1);这条语句是为了挡住程序不让退出

运行结果不会输出任何东西

因为printf默认操作的是stdout(标准输出——显示器)

而stdout默认是行缓存,针对行缓存文件,有三种情况会输出缓存中的内容:

1:碰到\n

2:执行fflush(stdout)

3:  程序结束

4:行缓存满(行缓存多大,各系统不一,而且可以设置,这里面就比较复杂了,想深入了解的去找setvbuf函数的用法)

上面的程序都不在上述三种情况之中,所以不会输出hello,world

第一种情况:加换行

第二种情况:

第三种情况:程序结束

但是没有换行

再来简单说说什么是行缓存:

       行缓存是Linux系统(其他系统也有该技术)为了提高文件IO效率设计的一种技术,比如我们的标准输出设备stdout(屏幕),系统中要想操作设备的程序(准确的说叫进程)一大把,所以怎么高效的使用它成为一种高超技术,那么系统就用缓存的技术来实现,就是说:先把你想要输出的数据缓存起来(暂时保存意思),等到缓存满,或者碰到了换行,或者用户执行了fflush函数,或者程序结束,那么一次性输出。

黄色标注是重点。

2:什么是无缓存

无缓存就是没有缓存,不缓存,哪些设备是无缓存的呢?

Stderr——标注错误——也是屏幕

这个设备文件系统在默认情况下设置为无缓存。

因为,它是要表示出错信息,以示情况紧急,所以需要即时显示,不能缓存。缓存即表示缓慢的意思。

我们来看一个例子:

我要输出,谁也阻拦不了

3:什么是全缓存

我们打开的普通文件都是以全缓存的形式存在的,它的属性有点像行缓存,当碰到

1:fclose

2:  fflush

3:  程序结束

或者全缓存满,也会刷新到文件中

我们来看一个例子:

  

上面例子中,我们连续录入了两行数据,都没有成功写入文件

 

我们再看下面的文件,我们在数据录入后面加了一条语句fflush

我们在录入一行数据后,查看文件,数据已经刷新到文件中。

有兴趣的试试程序结束和文件关闭吧。

我们再来看一个例子:

Linux系统中,write函数是不带缓存操作的,也即是系统碰到write函数写入文件操作,不管该文件是什么类型的文件,不缓存,即时写入。

 

 

 

 

 

 

 

 

 

发布了38 篇原创文章 · 获赞 14 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_27320195/article/details/97437476