【问题标题】:why doesn't writing and reading from pipes take I/O time为什么从管道写入和读取不占用 I/O 时间
【发布时间】:2020-01-22 17:03:40
【问题描述】:

考虑一下 prog.c 的这段代码:

#include <sys/time.h>
#include <stdio.h>
#define SIZE 10000

int main(){
    char buffer[SIZE];
    int pipefd[2];
    pipe(pipefd);

    while (1){
        write(pipefd[1], buffer, SIZE);
        read(pipefd[0], buffer, SIZE);    
    }
    return 0;
}

当我使用以下命令在 bash 中运行它时:

time ./prog

输出将是:

real    0m2.672s
user    0m0.693s
sys     0m1.978s

如您所见,用户时间 + 系统时间 =(大约)实时。
在这里我想知道,为什么读取和写入管道不占用 I/O 时间,这会比用户和系统时间的总和大得多。

【问题讨论】:

  • pipe 创建的管道基本上是一个简单的内存缓冲区。当您在同一进程中写入和读取时,您所做的只是简单地复制到缓冲区和从缓冲区复制。更具体地说,由于这一切都在内存中完成,因此没有实际的 I/O 或设备访问。
  • 所以它只是 RAM 区域中的复制/过去,而不是实际写入/读取到 I/O 设备?所以花费的时间基本上是在内核端进行复制。
  • @OSEMATOUATI 是的,没错。
  • @Someprogrammerdude 是的,我错了。我不知道。感谢 Someprogrammerdude 的教导

标签: c linux pipe


【解决方案1】:

在注释部分的帮助下,似乎写入/读取是在与管道本身相对应的缓冲区中完成的,实际上并没有对 I/O 设备进行读取/写入。

这个缓冲区的复制/过去是通过系统调用写/读来完成的,内核花时间从变量的缓冲区到管道的缓冲区。

这就是为什么用户和系统时间的总和是实际的实时时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-05
    • 2015-03-16
    • 2010-11-01
    • 2016-01-30
    • 2015-09-17
    • 2013-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多