【发布时间】:2020-08-24 12:06:47
【问题描述】:
假设我们有一个单核 CPU 正在运行
int filedesc = open("foo.txt", O_RDONLY);
filedesc是用户进程中的一个变量,当open开始执行时cpu获取上下文切换并运行内核进程,open的返回值如何传递给filedesc?
另外,相比
FILE *file = fopen("foo.txt", "r");
使用fopen 读取/文件由于缓冲而快得多,但在它调用open 的引擎盖下,我想知道在这种情况下open 是否仍然会一个接一个地检索一个字节?如果是这样,每个字节都会有上下文切换开销,因为fopen 缓冲区在用户进程中,系统调用返回值在我的第一个问题中来回传递场景,它为什么运行得更快?提前致谢!
【问题讨论】:
-
我建议你看看你正在使用的 c-library 的来源。似乎 glibc 的源代码可以在以下地址找到:sourceware.org/git/?p=glibc.git;a=blob;f=libio/…
-
“它怎么跑得更快”——你是如何测量这个的?
-
嗨 @th33lf 我看了 Sorber 教授的关于 open/fopen 的教程 youtube.com/…
-
@mzoz 在那个例子中,他并没有自己计时
open。他调用open、read和write,其中open可能构成开销的一小部分。它只被调用一次,而其他调用是在循环中进行的!大部分时间都花在了读写上。 -
"系统调用返回值如何传回用户进程?"在内核和用户空间之间有一个应用程序二进制接口 (ABI) 规范,它定义了(除其他外)参数如何传递给系统调用并返回值。
标签: c process io operating-system systems-programming