【问题标题】:strace has different result of Linux write system call on different bufferstrace 在不同的缓冲区上有不同的 Linux 写系统调用结果
【发布时间】: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


【解决方案1】:

我认为它正在检查缓冲区末尾是否有尾随 0 字节。如果有,它假定数据是一个字符串并用引号显示它。如果没有,它只显示地址。

我想不出malloc() 的缓冲区比mmap() 快的原因。调用 memset() 应该将两者的内存都放入 RAM,因此 write() 不必等待任何内容加载到内存中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-17
    • 1970-01-01
    • 2021-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多