Linuxでwrite()
システムコールを使用してデータバッファをファイルに書き込もうとしましたが、ここに私が書いたユーザスペースコードがあります。straceは別のバッファ上でLinux write system callの結果が異なります
memset (dataBuffer, 'F', FILESIZE);
fp = open(fileName, O_WRONLY | O_CREAT, 0644);
write (fp, dataBuffer, FILESIZE);
私は別の一つはmmap()
からであり、一方がmalloc()
からのものである、のDataBufferの二つのタイプを試してみました。
そして私はstrace
を使って、カーネルがこれらの2種類のバッファで何をするのかを見ます。それらの大部分は同じですが、write()
を実行すると、見た目が違って見えます。あなたがwrite()
のパラメータが異なっている、上記参照することができます同様のmmapからの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
から
バッファは、1は次のように "... FFFFF" であります私は前にmemset、別のものはメモリアドレスのようなものです。
また、最初のパラメータが異なっている、一つは他の4
されており、私のシステムで、malloc()
からバッファがmmap()
よりも高速で、3です。
どのように違うのですか?誰がこれを違えたのですか?
ありがとうございました。
更新:どのように測定するのですか?malloc()
は高速ですか?
カーネルのwrite()
の深いところをトレースすると、write()
の最後のステップがiov_iter_copy_from_user_atomic()
であることがわかります。これは実際のメモリコピー操作だと思います。
次に、私はgettimeofday()
を使用して、iov_iter_copy_from_user_atomic()
の長さをmalloc/mmapバッファに費やす時間を測定しました。
どのようにしてmalloc()が高速に測定されましたか? –
@FrankMeerkötter時間を測定する方法を更新します – Eason
システムコールの所要時間を表示できるようにタイムスタンプを表示する 'strace'オプションはありませんか? – Barmar