使用 stdio 库时,它是否有 3 级缓冲或 2 级缓冲?

使用 stdio 库时,它是否有 3 级缓冲或 2 级缓冲?

Linux 编程接口:(
我已经阅读了相关部分。我粘贴这个总结图只是为了说明。) 在此输入图像描述

我知道对于直接IO它使用readwrite系统调用。有 2 级缓冲。read/write buffer+ kernel buffer.

当使用stdio构建在直接系统 IO 调用之上的库调用时,

  1. stdio buffer+ read/write buffer+ kernel buffer, 3 级缓冲,

或者

  1. stdiowrite/read共享相同的缓冲区,2级缓冲

stdio calls <---> user buffer<-----> read/write+kernel buffer

(我认为这是 2 级缓冲,但我想确定一下。)

答案1

在常见情况下,有两个级别。用户空间中的缓冲区由 stdio 库分配,调用 put/printf/fprintf 等会将字符放入该缓冲区中。在某个阶段(例如缓冲区已满或写入换行符并且流处于行缓冲模式),stdio 库调用要求write内核写入缓冲区。内核通常会将缓冲区复制到内核缓冲区中,启动将数据获取到目的地所需的任何操作并返回。然后,用户空间可以随意使用用户空间缓冲区。

可能(但不常见)有不同的 stdio 实现,其执行方式不同。sfio有一个 stdio 兼容层。已经提出了各种方案zero copy等等。重点是stdio告诉你效果是什么,而不是如何完成。

相关内容