Linux下write()函数的真实实现逻辑及内存拷贝耗时疑问
关于Linux write()内核缓冲区拷贝的耗时问题
明确回答:内核将用户空间数据拷贝到页缓存的操作确实会消耗时间,但耗时通常远低于磁盘IO,大部分场景下可以忽略,但并非不存在。
具体细节:
- 调用
write()时,内核必须把用户空间的msg数据复制到内核管理的页缓存中——这是因为用户空间和内核空间是地址隔离的,无法直接访问彼此的内存区域,所以必须通过内存拷贝完成数据传递,这个操作的本质和memcpy类似,都是CPU主导的内存块复制。 - 拷贝的耗时和数据量直接相关:像你示例里的几十字节数据,拷贝耗时微乎其微,几乎无法被观测到;但如果是大尺寸的连续数据(比如几十MB以上),拷贝会占用CPU周期,此时的耗时就会变得明显。
- 为什么平时感知不到?因为内存拷贝的速度(通常能达到数GB/s)远快于磁盘IO速度(机械盘几十MB/s,SSD几百MB/s),所以在整个
write()调用的总耗时里,内存拷贝的占比极低,很容易被忽略。
补充:避免拷贝的特殊场景
如果确实需要消除这部分拷贝开销,可以在打开文件时指定O_DIRECT标志启用直接IO,此时数据会直接从用户空间写入磁盘,绕过内核页缓存。但直接IO有严格的要求(比如用户缓冲区必须按磁盘块大小对齐),而且会失去内核缓存带来的读写性能优化,只适合特定的高性能IO场景(比如数据库、大文件存储系统)。
附你的示例代码:
#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; }
内容的提问来源于stack exchange,提问作者Yongqi Z
相关产品推荐
相关产品推荐

