GNU/Linux >> Linux の 問題 >  >> Linux

mremap() よりもメモリ ページを移動する高速な方法は?

mremap と思う理由 単一の 4k ページを交換するのに効率的である可能性はありますか?少なくとも、単一の値 (pid など) を読み取ってそれを返すだけでも、カーネル空間へのラウンドトリップは、4k のデータを移動するよりもコストがかかります。そして、キャッシュの無効化/メモリの再マッピングの TLB コストに到達する前に、この回答で対処するのに十分なほどよく理解していませんが、深刻なコストがかかるはずです.

mremap realloc の実装:基本的に 1 つのことに役立ちます mmap によって提供された割り当て .概して、おそらく少なくとも 100,000 を意味します。


memcpy() よりも高速なメモリ ページの並べ替えを行うユーザーランド メカニズムはないようです。 mremap() ははるかに遅いため、以前に mmap() を使用して割り当てられたメモリ領域のサイズを変更する場合にのみ役立ちます。

しかし、ページテーブルは非常に高速でなければなりません。そして、ユーザーランドは毎秒何百万回もカーネル関数を呼び出すことができます!次のリファレンスは、mremap() が非常に遅い理由を説明するのに役立ちます:

「Intel メモリ管理の紹介」は、メモリ ページ マッピングの理論を紹介する優れた入門書です。

「Intel 仮想メモリの主要な概念」では、独自の OS を作成する予定がある場合に備えて、すべてがどのように機能するかをより詳細に示しています :-)

「Linux カーネルでのページ テーブルの共有」では、複雑な Linux メモリ ページ マッピングのアーキテクチャ上の決定と、それらがパフォーマンスに与える影響について説明します。

3 つの参考資料をまとめて見ると、これまでカーネル アーキテクトがメモリ ページ マッピングをユーザーランドに効率的に公開する努力がほとんど行われてこなかったことがわかります。カーネル内でも、ページ テーブルの操作は最大 3 つのロックを使用して行う必要があり、遅くなります。

今後は、ページ テーブル自体が 4k ページで構成されているため、カーネルを変更して、特定のページ テーブル ページが特定のスレッドに固有であり、その期間中はロックなしでアクセスできると想定できるようにすることが可能になる可能性があります。処理する。これにより、ユーザーランドを介した特定のページテーブルページの非常に効率的な操作が容易になります。しかし、これは元の質問の範囲外です。


Linux
  1. Linux メモリ管理 – スワッピング、キャッシュ、および共有 VM

  2. mmap() がシーケンシャル IO よりも速いのはなぜですか?

  3. メモリ マップド ページと匿名ページとは何ですか?

  1. Javaでメモリ不足の状態を処理する最良の方法は何ですか?

  2. Linuxで100万枚の画像をあるディレクトリから別のディレクトリに移動する最速の方法は何ですか?

  3. `find よりも速いものはありますか? | | wc -l`ディレクトリ内のファイルをカウントするには?

  1. Nバインドマウントよりも簡単にchrootする方法はありますか?

  2. Linux - ソフトウェアでメモリの速度を特定する方法はありますか?

  3. 大量のファイルをすばやく削除する方法