【发布时间】:2016-08-16 02:39:27
【问题描述】:
我尝试在 Linux 上使用write() 系统调用将数据缓冲区写入文件,这是我编写的用户空间代码。
memset (dataBuffer, 'F', FILESIZE);
fp = open(fileName, O_WRONLY | O_CREAT, 0644);
write (fp, dataBuffer, FILESIZE);
我尝试了两种dataBuffer,一种来自malloc(),另一种来自mmap()。
我使用strace 来观察内核将在这两种缓冲区上做什么。大部分都是一样的,但是我在做write()的时候看到,它们看起来不一样。
来自 malloc() 的缓冲区
[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() 来测量 iov_iter_copy_from_user_atomic() 在 malloc/mmap 缓冲区中的开销。
【问题讨论】:
-
你是如何衡量 malloc() 更快的?
-
@FrankMeerkötter 我更新了我测量时间的方式
-
难道没有
strace选项可以显示时间戳,以便您查看系统调用所用的时间吗? -
@Barmar 是的,有,但是一开始我不打算用 strace 看时间成本,我已经发现 mmap() 比较慢,然后我尝试使用 strace找出它变慢的原因。
-
使用 strace 输出检查 malloc 实际使用哪个系统调用来进行分配。
标签: c linux linux-kernel operating-system embedded-linux