スラブ割り当ては、オブジェクトの効率的なメモリ割り当てを目的としたメモリ管理メカニズムです。以前のメカニズムと比較して、割り当てと割り当て解除によって発生する断片化が軽減されます。この手法は、特定のタイプのデータ オブジェクトを含む割り当て済みメモリを保持し、同じタイプのオブジェクトの後続の割り当て時に再利用するために使用されます。これはオブジェクト プールに似ていますが、メモリにのみ適用され、他のリソースには適用されません。
スラブ割り当ては、Solaris 2.4カーネルでJeff Bonwickによって初めて導入されました。[1]現在では、 FreeBSD [2]やLinux [3]を含む多くのUnixおよびUnix系オペレーティングシステムで、SLABアロケータとその代替であるSLUB [4]の両方で広く使用されています。
基礎
スラブ割り当てにより、カーネルデータオブジェクトの初期化と破棄の計算コストが大幅に削減され、メモリ割り当てのコストを上回る場合があります。[1]カーネルがオブジェクトを頻繁に作成および削除すると、初期化のオーバーヘッドコストによってパフォーマンスが大幅に低下する可能性があります。オブジェクトキャッシュにより、オブジェクト状態を初期化する関数の呼び出し頻度が減ります。スラブに割り当てられたオブジェクトが使用後に解放されると、スラブ割り当てシステムは通常、そのオブジェクトをキャッシュしたままにして(破棄するのではなく)、次回そのタイプのオブジェクトが必要になったときに再利用できるようにします(したがって、新しいオブジェクトの構築と初期化の作業を回避します)。
スラブ割り当てでは、特定のタイプまたはサイズのデータ オブジェクトのキャッシュに、事前に割り当てられたメモリの「スラブ」がいくつかあり、各スラブ内には、オブジェクトに適した固定サイズのメモリ チャンクがあります。[5]スラブ アロケータはこれらのチャンクを追跡するため、特定のタイプのデータ オブジェクトにメモリを割り当てる要求を受信すると、通常は既存のスラブから空きスロット (チャンク) を使用して要求を満たすことができます。アロケータがオブジェクトのメモリを解放するように要求されると、アロケータは、そのスロットを、それを含むスラブの空き (未使用) スロットのリストに追加します。同じタイプのオブジェクトを作成する (または同じサイズのメモリを割り当てる) ための次の呼び出しでは、そのメモリ スロット (または他の空きスロット) が返され、空きスロットのリストから削除されます。このプロセスにより、適切なメモリ領域を検索する必要がなくなり、メモリの断片化が大幅に軽減されます。このコンテキストでは、スラブは、事前に割り当てられたメモリ チャンクを含むメモリ内の 1 つ以上の連続したページです。
実装
スラブ割り当てアルゴリズムでは、次の用語が定義されます。
- キャッシュ: キャッシュは少量の非常に高速なメモリを表します。キャッシュは、セマフォ、プロセス記述子、ファイルオブジェクトなどの特定の種類のオブジェクトを格納するストレージです。
- スラブ: スラブは連続したメモリ部分を表し、通常は複数の仮想的に連続したページで構成されます。スラブは、それを含むキャッシュの特定の種類のオブジェクトに関連付けられたデータの実際のコンテナです。
プログラムがキャッシュを設定すると、そのキャッシュに関連付けられたスラブにいくつかのオブジェクトが割り当てられます。この数は、関連付けられたスラブのサイズによって異なります。
スラブは次のいずれかの状態になります。
- 空 – スラブ上のすべてのオブジェクトが空としてマークされている
- 部分的 – スラブは使用済みオブジェクトと空きオブジェクトの両方で構成されています
- フル – スラブ上のすべてのオブジェクトが使用済みとしてマークされている
最初に、システムは各スラブを「空」としてマークします。プロセスが新しいカーネル オブジェクトを呼び出すと、システムはそのタイプのオブジェクトのキャッシュ内の部分スラブ上でそのオブジェクトの空き場所を見つけようとします。そのような場所が存在しない場合は、システムは連続した仮想ページから新しいスラブを割り当て、それをキャッシュに割り当てます。新しいオブジェクトはこのスラブから割り当てられ、その場所は「部分的」としてマークされます。
システムはオブジェクトを事前に構築し、スラブから簡単に割り当てるため、割り当ては迅速に行われます。
実装技術
無料リスト
スラブは、マシンからキャッシュへの 1 つのメモリ割り当てを表し、そのサイズは通常、ページ サイズの倍数です。スラブは複数のエントリに分割され、クライアント コードが新しいオブジェクト用のメモリを要求すると、キャッシュによって要求されます。次に、スラブのどの部分が自由に使用でき、どの部分がすでに使用されているかを追跡する必要があります。これは通常、「空きリスト」を使用して行われます。これは、新しいオブジェクトを格納する準備ができているスラブ内の空きエントリのリストです。
フリーリストは、スラブのどのエントリが空いているかを示すインデックスの配列などの独立したデータ構造である場合もあれば、スラブ内に埋め込まれている場合もあります。Linux SLUBアロケータは、フリーリストをポインタのリンクリストとして保持し、各ポインタは、それらが表すスラブの空きメモリ領域に直接格納されます。[6]
スラブサイズ
オペレーティング システムは、格納されるオブジェクトのサイズに応じて、異なるスラブ サイズと内部レイアウトを使用する場合があります。大きなスラブが小さなスラブとは異なるレイアウトを持つ理由は、大きなスラブをページ サイズの単位にうまく詰め込むことができるため、断片化が軽減されるからです。たとえば、特定のマシンのページ サイズの 1/8 以上であるオブジェクトは、明示的なフリー リストを備えた「大きなスラブ」サイズの恩恵を受ける可能性がありますが、小さなオブジェクトは、フリー リストの追跡を埋め込んだ「小さなスラブ」設定を使用できます。Bonwick によるスラブ アロケータの最初のプレゼンテーションでは、すでに大きなスラブと小さなスラブのレイアウトが区別されていました。[1]
スラブ割り当てを使用するシステム
- AmigaOS ( AmigaOS 4で導入)
- DragonFly BSD (リリース 1.0 で導入)
- FreeBSD (5.0 で導入)
- GNU Mach [7]
- 俳句(アルファ 2 で導入)
- Horizon(Nintendo Switchマイクロカーネル)[8]
- HP-UX(11iで導入)[9]
- Linux (カーネル 2.1.23 で導入され、現在はSLOBおよびSLUBとともに 3 つのメモリ アロケータ実装の 1 つです。この 3 つのアロケータは、標準の 4 KB ページ サイズよりも柔軟なメモリ割り当てを必要とするカーネルのセクションに対して、ゾーン バディ アロケータの一種のフロントエンドを提供します)。
- NetBSD (4.0 で導入)
- Solaris (2.4 で導入)
- Perl 5コンパイラは内部メモリ管理にスラブアロケータを使用する[10] [11]
- Memcachedはメモリ管理にスラブ割り当てを使用する
- イルモス
参照
注記
- ^ abc Jeff Bonwick、「スラブアロケータ:オブジェクトキャッシングカーネルメモリアロケータ」(1994)
- ^ FreeBSD カーネル開発者マニュアル
- ^ M. Tim Jones、Linux スラブアロケータの解剖学、2013 年 10 月 2 日アーカイブ、Wayback Machineより
- ^ Vlastimil Babka、SLABアロケータを削除
- ^ アブラハム・シルバーシャッツ 他著:オペレーティングシステムの概念。Wiley:2004年。ISBN 0-471-69466-5
- ^ Lameter, Christoph. 「Linux カーネルのスラブ アロケータ: SLAB、SLOB、SLUB」(PDF)。LinuxCon /Düsseldorf 2014 (2014 年 10 月 3 日改訂)。
- ^ 「Gnu Mach アロケータのドキュメント」。
- ^ 「コンソールセキュリティ - スイッチ (34c3)」。media.ccc.de 。 2017年12月28日閲覧。
- ^ Chris Cooper および Chris Moore、「HP-UX 11i Internals」、ニュージャージー州アッパーサドルリバー: Prentice Hall PTR、2004 年、ISBN 0-13-032861-8、334ページ。
- ^ 「Perl5-Porters Weekly: 2012年6月17日」 。 2012年11月18日閲覧。
- ^ Bonwick, Jeff. 「Magazines and Vmem: Slab Allocator を多数の CPU と任意のリソースに拡張する」 USENIX 2001 . 2012 年11 月 18 日閲覧。
外部リンク
- FreeBSD uma(9) マニュアルページ
- SLUB アロケータは、2 つの異なるアロケータ (SLUB アロケータと SLAB アロケータ) によるLinuxのスラブの管理に関するコメントです。
- Memory Compaction v7 (SLAB の断片化と圧縮の問題に対処する Mel Gorman による Linux パッチ セット、2010 年 4 月 2 日)
- カーネルメモリリークの検出 Jonathan Corbet、Linux Weekly News、2006; ガベージコレクションに関するユーザーコメントを含む
- Linux のパフォーマンス: Linux はあまりにも遅くなり、肥大化しつつあるのでしょうか? SLAB と SLUB について。フリー ソフトウェア マガジン 2010。
