strace在不同的缓冲区上对Linux写系统调用有不同的结果
我尝试在Linux上使用strace在不同的缓冲区上对Linux写系统调用有不同的结果,c,linux,linux-kernel,operating-system,embedded-linux,C,Linux,Linux Kernel,Operating System,Embedded Linux,我尝试在Linux上使用write()system调用将数据缓冲区写入文件,下面是我编写的用户空间代码 memset (dataBuffer, 'F', FILESIZE); fp = open(fileName, O_WRONLY | O_CREAT, 0644); write (fp, dataBuffer, FILESIZE); 我尝试了两种类型的数据缓冲,一种来自malloc(),另一种来自mmap() 我使用strace来观察内核在这两种缓冲区上会做什么。它们大多数都是相
write()
system调用将数据缓冲区写入文件,下面是我编写的用户空间代码
memset (dataBuffer, 'F', FILESIZE);
fp = open(fileName, O_WRONLY | O_CREAT, 0644);
write (fp, dataBuffer, FILESIZE);
我尝试了两种类型的数据缓冲,一种来自malloc()
,另一种来自mmap()
我使用strace
来观察内核在这两种缓冲区上会做什么。它们大多数都是相同的,但我看到在执行write()
时,它们看起来不同
来自malloc()的缓冲区
来自mmap()的缓冲区
正如您在上面看到的,write()
的参数是不同的,一个是“FFFFF…”,就像我之前的memset一样,但另一个是内存地址
第一个参数也是不同的,一个是3,另一个是4
在我的系统上,来自malloc()
的缓冲比mmap()
快
他们怎么会不一样呢?谁让这不一样
谢谢
更新:如何衡量malloc()
更快
我深入内核中的write()
,发现write()
的最后一步是iov\u iter\u copy\u from\u user\u atomic()
,我认为这是实际的内存复制操作
然后我使用
gettimeofday()
来测量malloc/mmap缓冲区中iov\u iter\u copy\u from\u user\u atomic()
的开销。我想它是在检查缓冲区末尾是否有一个尾随的0
字节。如果有,则假定数据是字符串,并用引号显示。如果没有,它只显示地址
我想不出为什么来自
malloc()
的缓冲区会比mmap()
快。调用memset()更快?@FrankMeerkötter我更新了我测量时间的方式是否有一个strace
选项可以显示时间戳,以便您可以查看系统调用所花费的时间?@Barmar是的,有,但在一开始,我没有计划使用strace来查看时间成本,我已经发现mmap()比较慢,然后我尝试使用strace来找出它慢的原因。使用strace输出来检查malloc实际使用哪个系统调用来进行分配。
[pid 258] open("/mnt/mtd/mmc/block/DATA10", O_WRONLY|O_CREAT, 0644) = 3
[pid 258] write(3, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"..., 691200) = 691200
[pid 262] open("/mnt/mtd/mmc/block/DATA10", O_WRONLY|O_CREAT, 0644) = 4
[pid 262] write(4, 0x76557000, 691200) = 691200