标准I/O缓冲区

首先应懂得流的概念,类似于队列,我在键盘上打字,摁下一个wasd,屏幕上就会出现一个wasd,或者这个wasd会被缓冲区按顺序存起来存起来。我在csdn上写wasd,wasd作为输入&输出就被定向到网页这个进程的某个打开文件

 

I/O进行缓冲的目的:减少read,write系统调用的次数。系统调用涉及用户态与内核态的转换,在大量I/O操作中是无法忽略的性能损耗;可参考https://blog.csdn.net/HeXiQuan123/article/details/95055586了解为何系统调用具有损耗。

如:cout<内核态->用户态,b时又调用write,用户态>内核态->用户态,耗时耗力。

标准I/O缓冲分为三个级别:

1、全缓冲:即缓冲区没写满之前,都把输入/输出数据暂存起来,待到时机成熟(缓冲区满或显式调用flush)进行I/O;

2、行缓冲:以行为单位,一旦换行,立马I/O;

      此外,行缓冲区大小有限,写满也会直接进行I/O

      标准输出缓冲区中有数据的时候,标准输入也会对标准输出进行刷新,即将标准输出缓冲写到标准输出。

3、不带缓冲:一般stderr不带缓冲,因为我们希望错误立即显示出来。

通俗来说:

全缓冲就是:我一直打字,但是屏幕不显示,直到我调用flush或者写满了,一次性全部显示出来;

行缓冲就是:我打字,但是屏幕不显示,知道我回车,或者写满行了,就显示这一行;

不缓冲就是:我打一个字,屏幕显示一个字。

 

一般流的缓冲级别如下,可用setvbuf,setbuf等系统调用来设置

你可能感兴趣的:(对内存的理解,LinuxUnix系统编程)