缓冲区

缓冲策略和缓冲区

用户级缓冲区

  • 对于每一个进程而言,都会有自己的缓冲区。

  • 在使用print(“….”)之后,如果没有\n并不会立刻刷新缓冲区,而是程序退出才刷新并显示到显示器上。
    对于C语言来说,它会自己提供一个缓冲区,而不是直接使用系统提供的缓冲区

    • 只有当碰到强制刷新(fflush())或\n等情况,才会再使用系统调用write()c语言缓冲区的内容写人到系统缓冲区内。如果在这之前就关闭了输入(出)流,那么这个过程可能会被中断从而导致结果异常。

刷新的本质:将写入用户/系统缓冲区内的数据清空,但是只有系统缓冲区内的数据可以被硬件访问。

缓冲区的刷新策略

  1. 无缓冲 —— 直接刷新(例如”fflush())。
  2. 行缓冲 —— 不刷新,直到碰到(例如:\n)。
  3. 全缓冲 —— 缓冲区满了才刷新。(例如:普通文件写入)
  4. 进程退出时,也会进行刷新。
  5. 以重定向之后刷新策略也可能会跟着改变。

缓冲区存在的意义

  1. 针对不同的应用场景,选用不同的刷新策略可以优化性能。
  2. 配合语言的格式化输入输出。
    • 例如:printf("string = str,int = %d",num);在打印之前,我们需要把整形的数组转化为一个一个的字符,然后再通过write(),最后输出。因此,我们会不停的往缓冲区里输入输出数据,也就有了的概念。

文件缓冲区

对于c语言来说,FILE*对应的结构体内会有打开文件的缓冲区字段和维护信息。且每个文件都会有自己的缓冲区——用户级缓冲区。而且:语言都属于用户层。

缓冲区的写实拷贝

如果在fork()之后有发生刷新而刷新会涉及到数据变更,于是会发生写实拷贝


缓冲区
https://weihehe.top/2024/07/17/缓冲区/
作者
weihehe
发布于
2024年7月17日
许可协议