あなたに良い答えを与えることは不可能ではありませんが、自分のメモリを管理すること(多くの場合、大きなブロックを割り当て、その大きなブロックで独自の割り当てを行うことによって)は、汎用メモリマネージャです。たとえば、Windowsでは、多くの小さな割り当てによってパフォーマンスが低下します。既存の実装はほぼすべてのタイプのメモリマネージャに存在しますが、私はどのような種類のメモリマネージャが存在するのかよく分かりません。
Windowsでプログラミングする場合、malloc /バッチ処理でメモリ割り当てを償却するアプリ内メモリ割り当ては、割り振り/解放時のプロセッサ時間を節約できます。したがって、デフォルトアロケータを呼び出していない限り、使用するアプローチはそれほど重要ではありません。
Thisは厳密スラブマネージャではありませんが、それは良いバランスを達成するようで、一般的に使用されます。
言われていること、ここでいくつかの単純なマルチスレッド・ナイーブなアイデアです。
私は個人的には、同じサイズのメモリブロックに対してかなり簡単に実装できるメモリ再利用マネージャを使用しています。固定サイズの未使用メモリのリンクリストを保持し、メモリが必要なときに。ここでのトリックは、リンクされたリストのポインタを未使用のメモリブロックに格納することです。つまり、4バイトの非常に小さなオーバーヘッドがあります。メモリーを再利用しているときは、プロセス全体がO(1)になります。
純粋に割り当て専用のスラブアロケータの場合は、システムに(大きな)チャンクを与えて追跡してもらうだけです(スムーズにスラブアロケータを呼び出すことができます)。あなたがまだ使用していないスペース(未使用領域の先頭と最後のポインタへのポインタを維持するだけです)。要求されたサイズを割り当てるのに十分なスペースがない場合は、新しいスラブを割り当てます。 (大きなチャンクの場合は、システムアロケータに渡すだけです。)
これらのアプローチを連鎖させる問題はありますか?アプリケーションはメモリーを解放しませんが、パフォーマンス重視のアプリケーションは、ワンショット処理アプリケーションであるか、同じサイズの多数のオブジェクトを作成してから使用を停止することがよくあります。
注意しておけば、上記の方法では、アトミック操作だけでもマルチスレッドを使いやすくすることは難しくありません。
私のサイトをチェックしてください:https://github.com/bbu/Userland-slab-allocator :-) –
@BlagovestBuyukliev:ありがとう、私自身のSLABを実装するととても役に立ちます。 いくつかのアイデアは、intresting、私はメモリ管理ではあまり強くないので、それは役に立つでしょう。 –
+1はメモリ管理を認識するのが難しく、既存の実装を求めています。 –