You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 01:35:14