Linux C标准I / O - 为什么要双重复制

时间:2014-05-24 17:26:13

标签: c linux glibc system-calls

假设我正确理解了流量,我们希望在打开的FILE流中阅读一些摘要,让我们说,使用fread

  1. read系统调用会将数据从内核复制到用户空间缓冲区
  2. 用户空间缓冲区(由 glibc 分配或由setvbuf提供...)将被复制到提供给fread的缓冲区
  3. 为什么需要第二步?为什么我可以得到一个指向用户空间缓冲区的指针,我将决定是否要存储(复制)?

    谢谢,

2 个答案:

答案 0 :(得分:4)

第二个缓冲区的目的是分摊系统调用开销。如果一次只读取/写入几个字节,则第二个用户空间缓冲区将极大地提高性能。 OTOH,如果您读/写大块,可以绕过第二个缓冲区,因此您不需要为双重复制付出代价。

答案 1 :(得分:0)

第二步就是它的全部内容。内核必须处理此类操作。之后将使用您使用的api结果。这是通常的内核空间/用户空间行为。阅读它。您可能现在可能不知道它,但内核空间/用户空间差异是os基础结构的基础。