メモリマッピングファイルを使用するときのデータ転送パスは何ですか?

メモリマッピングファイルを使用するときのデータ転送パスは何ですか?

ファイルで read()/write() を使用することと mmap() を使用することの間にデータ転送パスに違いはありますか?

「カーネル」は「カーネル」を意味するhttps://stackoverflow.com/a/41419353

mmapには、次のファイルデータのコピーは必要ありません。コアユーザースペースとして。

read()がファイルからカーネル空間のバッファにデータをコピーし、カーネルバッファからユーザ空間のバッファにデータをコピーするのは正しいですか?

ファイルで mmap() が呼び出されると、途中で何もせずに仮想メモリアドレスをファイルに直接マップします (カーネル空間のバッファなど)。

mmap()が返した仮想メモリアドレスにアクセスするときのデータ転送パスは何ですか?ステージの後ろの真ん中に関連するカーネル空間にバッファがありますか?

mmap() はデータ転送パスに関して read()/write() よりも利点がありますか?

ベストアンサー1

ファイルで read()/write() を使用することと mmap() を使用することの間にデータ転送パスに違いはありますか?

はい、詳しくは下記をご覧ください。

「カーネル」は「カーネル」を意味するhttps://stackoverflow.com/a/41419353

mmapには、次のファイルデータのコピーは必要ありません。コアユーザースペースとして。

これは、カーネルアドレス空間にマップされたメモリを表します。

read()がファイルからカーネル空間のバッファにデータをコピーし、カーネルバッファからユーザ空間のバッファにデータをコピーするのは正しいですか?

readはい、ソートの制約なしにユーザースペースによって提供されるバッファーに読み取る必要があります。読み取った後は、データをファイル記述子から完全に分離する必要があります。したがって、カーネルはそれを満たすために必要なすべてのデータを読み取り、read(存在する場合はデータがすでにページキャッシュまたはパイプバッファにあるか...)、要求されたデータを提供されたスペースのユーザースペースにコピーします。バッファー。

mmap()が返した仮想メモリアドレスにアクセスするときのデータ転送パスは何ですか?ステージの後ろの真ん中に関連するカーネル空間にバッファがありますか?

マッピングがファイルバックアップされると、データがページキャッシュに読み込まれ、カーネルはmmappingプロセスが別のページマップを介してメモリ内の対応する物理ページに直接アクセスできるようにします。少なくともプロセスがページに書き込まない限り(そして動作はflagsによって異なりますmmap)、背後にはバッファがありません。

mmap() はデータ転送パスに関して read()/write() よりも利点がありますか?

これについては で詳しく議論したことがある。あなたがリンクしたSOの質問mmap一部のコピーは避けますが、全体的にread良いかどうかは、write呼び出し側が実行する操作の詳細によって異なります。

場合によっては、Linuxの他のシステムコールがより良いパフォーマンスを提供します。sendfilecopy_file_rangesplice

おすすめ記事