ファイルで 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()が返した仮想メモリアドレスにアクセスするときのデータ転送パスは何ですか?ステージの後ろの真ん中に関連するカーネル空間にバッファがありますか?
マッピングがファイルバックアップされると、データがページキャッシュに読み込まれ、カーネルはmmap
pingプロセスが別のページマップを介してメモリ内の対応する物理ページに直接アクセスできるようにします。少なくともプロセスがページに書き込まない限り(そして動作はflagsによって異なりますmmap
)、背後にはバッファがありません。
mmap() はデータ転送パスに関して read()/write() よりも利点がありますか?
これについては で詳しく議論したことがある。あなたがリンクしたSOの質問。mmap
一部のコピーは避けますが、全体的にread
良いかどうかは、write
呼び出し側が実行する操作の詳細によって異なります。
場合によっては、Linuxの他のシステムコールがより良いパフォーマンスを提供します。sendfile
、copy_file_range
とsplice
。