从Linux 编程接口:(
我已经阅读了相关部分。我粘贴这个总结图只是为了说明。)
我知道对于直接IO它使用read
和write
系统调用。有 2 级缓冲。read/write buffer
+ kernel buffer
.
当使用stdio
构建在直接系统 IO 调用之上的库调用时,
stdio buffer
+read/write buffer
+kernel buffer
, 3 级缓冲,
或者
stdio
并write/read
共享相同的缓冲区,2级缓冲
stdio calls
<---> user buffer
<-----> read/write
+kernel buffer
?
(我认为这是 2 级缓冲,但我想确定一下。)
答案1
在常见情况下,有两个级别。用户空间中的缓冲区由 stdio 库分配,调用 put/printf/fprintf 等会将字符放入该缓冲区中。在某个阶段(例如缓冲区已满或写入换行符并且流处于行缓冲模式),stdio 库调用要求write
内核写入缓冲区。内核通常会将缓冲区复制到内核缓冲区中,启动将数据获取到目的地所需的任何操作并返回。然后,用户空间可以随意使用用户空间缓冲区。
可能(但不常见)有不同的 stdio 实现,其执行方式不同。sfio有一个 stdio 兼容层。已经提出了各种方案zero copy
等等。重点是stdio
告诉你效果是什么,而不是如何完成。