缓冲区
缓冲策略和缓冲区
用户级缓冲区
对于每一个进程而言,都会有自己的缓冲区。
在使用print(“….”)之后,如果没有
\n
并不会立刻刷新缓冲区,而是程序退出才刷新并显示到显示器上。
对于C
语言来说,它会自己提供一个缓冲区
,而不是直接使用系统提供的缓冲区
。- 只有当碰到强制刷新(
fflush()
)或\n
等情况,才会再使用系统调用write()
将c语言缓冲区的内容写人到系统缓冲区内。如果在这之前就关闭了输入(出)流,那么这个过程可能会被中断从而导致结果异常。
- 只有当碰到强制刷新(
刷新的本质:将写入用户/系统缓冲区内的数据清空,但是只有系统缓冲区内的数据可以被硬件访问。
缓冲区的刷新策略
- 无缓冲 —— 直接刷新(例如”
fflush()
)。 - 行缓冲 —— 不刷新,直到碰到(例如:
\n
)。 - 全缓冲 —— 缓冲区满了才刷新。(例如:普通文件写入)
- 进程退出时,也会进行刷新。
- 以重定向之后刷新策略也可能会跟着改变。
缓冲区存在的意义
- 针对不同的应用场景,选用不同的刷新策略可以优化性能。
- 配合语言的格式化输入输出。
例如:printf("string = str,int = %d",num);
在打印之前,我们需要把整形的数组转化为一个一个的字符,然后再通过write()
,最后输出。因此,我们会不停的往缓冲区里输入输出数据,也就有了流的概念。
文件缓冲区
对于c语言来说,FILE*
对应的结构体内会有打开文件的缓冲区字段和维护信息。且每个文件都会有自己的缓冲区——用户级缓冲区。而且:语言都属于用户层。
缓冲区的写实拷贝
如果在fork()之后有发生刷新,而刷新会涉及到数据变更,于是会发生写实拷贝。
缓冲区
https://weihehe.top/2024/07/17/缓冲区/