2016-08-16 1 views
0

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バッファに費やす時間を測定しました。

+0

どのようにしてmalloc()が高速に測定されましたか? –

+0

@FrankMeerkötter時間を測定する方法を更新します – Eason

+0

システムコールの所要時間を表示できるようにタイムスタンプを表示する 'strace'オプションはありませんか? – Barmar

答えて

-1

バッファの末尾に末尾の0バイトがあるかどうかを確認していると思います。存在する場合、データは文字列であるとみなし、引用符で表示します。そうでない場合は、アドレスを表示するだけです。

malloc()のバッファがmmap()より速い理由が考えられません。 memset()を呼び出すと、両方のメモリがRAMに格納されるため、write()はメモリに何かがロードされるのを待つ必要はありません。

関連する問題