Linux写系统调用在不同的缓冲区上有不同的结果



我尝试在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()不应该等待任何内容加载到内存中。

最新更新