我知道在linux上,内核经常缓存对磁盘的读写访问,就像下面的代码,它在写调用和返回之后将msg
保存到一个缓冲区,然后在缓冲区满的时候进行实际的写操作。
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
int
main()
{
int fd = open("./test.txt", O_RDWR, 0766);
if (fd < 0) {
printf("open file failed %d\n", errno);
return -1;
}
char msg[100] = "write this msg to disk";
write(fd, msg, strlen(msg));
return 0;
}
我不知道write()的实现,我的问题是:如果缓冲区在内存中,内核会将msg
复制到类似memcpy
的缓冲区中,这样的复制会很耗时吗?
2条答案
按热度按时间x6492ojm1#
在内存中复制比IO到磁盘更快。磁盘IO非常慢,比在内存中复制慢得多。
(We在特殊情况下,可以绕过缓冲区直接发出磁盘IO。例如,有一个用户空间缓冲区,您希望避免复制它两次。)
使用内核缓冲区,内核可以对写入进行集群和调度,以发出更少的磁盘IO,发出大的顺序IO,甚至在文件被删除时取消一些IO。
如果你在libc中使用fwrite,还有一个用户空间缓冲区可以避免太频繁地陷入内核。
aydmsdu92#
write()的真正实现逻辑是什么?
write()
函数将调用其他函数,如sys_write()
。sys_write()
如下代码: