【发布时间】: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 的教导