2016-05-29 21 views
0

私はCMA(連続メモリアロケータ)ユーザサイドドライバを作成していますが、一部の領域にmmapedがあります。同じメモリ領域をmmapしたい第2のオブジェクトを作成した場合、すでにmmapedされていることを検索してそのアドレスを返すことは可能でしょうか?現在、各オブジェクトは独自のmmapを作成しますが、それは動作しますが、パフォーマンスの点では良いアイデアですか?複数のオブジェクトのMMAP共有

このクラスは、コンストラクタで渡される内容に応じてさまざまなメモリ領域をmmapするために使用されるため、静的は機能しません。

+0

"パフォーマンス面では良いアイデアですか?"なぜそれを測定しないのですか? –

+0

対策は?私はまだ別の方法はありません:) – user1876942

+0

それを2回mmappすることとそれを一度mmapし、そのmmapを再利用します。 –

答えて

0

私はあなたが達成したいことを100%確信していませんが、同じ領域が同じアプリケーション内で複数回使用される場合、オーバーヘッドが少なくなるように割り当てを最適化したいと思います。

カーネルは物理メモリのページへの各参照を追跡する必要があるので、コード内で「割り当てを追跡して同じポインタを返す」場合は、割り当てを自分で参照する必要があります。それが必要なときは無料です。

基本モードでは基本的にstd::map(または同様のもの)を基になるメモリとサイズをキーにして参照カウントをカウントし、参照カウントがゼロになるとmunmapを呼び出します地域が見つからない場合はmmapに電話してください)。あなたが同じ地域に異なるサイズの複数の割り当てをしている場合、それはもっと楽しいものになりますが、少なくとも2番目の呼び出しが要求している場合はそうではありません。より大きな割り当て。

ユーザーモードでこれを行う利点は明らかです。アカウントを間違えた場合、アプリケーションが停止してもカーネルはメモリを解放します。また、カーネルモードでのstd::map [またはそれと同等の]のメモリの割り当ては、処理するのがずっと難しくなります。

+0

これは私が思ったようなものです。既にマッピングされたアドレスとカウントを維持するために、ドライバのユーザーにそれを任せます。 – user1876942

関連する問題