我尝试在Linux上使用write()
系统调用将数据缓冲区写入文件,这是我编写的用户空间代码。
memset (dataBuffer, 'F', FILESIZE);
fp = open(fileName, O_WRONLY | O_CREAT, 0644);
write (fp, dataBuffer, FILESIZE);
我尝试了两种类型的数据缓冲器,一种来自malloc()
,另一种来自mmap()
。
我使用strace
来观察内核在这两种类型的缓冲区上会做什么。它们中的大多数是相同的,但我看到在做write()
时,它们看起来不同。
from malloc()
[pid 258] open("/mnt/mtd/mmc/block/DATA10", O_WRONLY|O_CREAT, 0644) = 3
[pid 258] write(3, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"..., 691200) = 691200
from 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()
的快。
为什么它们不同?是谁让它与众不同的?
谢谢。
Update:我如何测量malloc()
更快?
我在内核中深入跟踪write()
,发现write()
的最后一步是iov_iter_copy_from_user_atomic()
,我认为这是实际的内存复制操作。
然后我使用gettimeofday()
来测量iov_iter_copy_from_user_atomic()
在malloc/mmap缓冲区中花费的时间。
我认为它正在检查缓冲区末尾是否有一个尾随的0
字节。如果有,则假定数据是字符串,并以引号显示。如果不是,它只显示地址。
我想不出为什么malloc()
的缓冲区会比mmap()
快。调用memset()
应该将两者的内存都放入RAM中,因此write()
不应该等待任何内容加载到内存中。