我尝试在Linux上使用write()
系统调用将数据缓冲区写入文件,这是我写的用户空间代码。
memset (dataBuffer, 'F', FILESIZE);
fp = open(fileName, O_WRONLY | O_CREAT, 0644);
write (fp, dataBuffer, FILESIZE);
我尝试了两种类型的dataBuffer,一种来自malloc()
,另一种来自mmap()
。
我使用strace
来观察内核在这两种缓冲区上会做什么。其中大多数是相同的,但我在做write()
时看到,它们看起来不一样。
缓冲区
[pid 258] open("/mnt/mtd/mmc/block/DATA10", O_WRONLY|O_CREAT, 0644) = 3
[pid 258] write(3, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"..., 691200) = 691200
来自mmap()的缓冲区
[pid 262] open("/mnt/mtd/mmc/block/DATA10", O_WRONLY|O_CREAT, 0644) = 4
[pid 262] write(4, 0x76557000, 691200) = 691200
就像你上面看到的那样,write()
的参数是不同的,一个是“FFFFF ...”,就像我之前的memset,但是另一个就像一个内存地址。
第一个参数也不同,一个是3,另一个是4。
在我的系统上,来自malloc()
的缓冲区比mmap()
更快。
他们怎么会有所不同?谁让这与众不同?
感谢。
更新:如何衡量malloc()
的速度更快?
我在内核write()
深处追踪,找出write()
的最后一步是iov_iter_copy_from_user_atomic()
,我认为这是实际的内存复制操作。
然后我使用gettimeofday()
来衡量malloc / mmap缓冲区中iov_iter_copy_from_user_atomic()
成本的持续时间。