ホーム>source

の構造について混乱していますSLABメモリ管理メカニズム。

一般的に使用されるデータオブジェクトに固有の複数の「キャッシュ」があることがわかりますが、各キャッシュに複数の「スラブ」が含まれているのはなぜですか?

キャッシュ内の各スラブの違いは何ですか?単純に、キャッシュにデータオブジェクト自体を入れてみませんか?なぜこの追加レイヤーが必要なのですか?

あなたの答え
  • 解決した方法 # 1

    スラブアロケーターは、同じタイプの多数のオブジェクトを簡単に割り当てるための抽象化レイヤーです。 インターフェイスは機能を提供します

    ウィズウィズ
    

    この関数は、 struct kmem_cache * kmem_cache_create(const char *name, size_t size, size_t align, unsigned long flags, void (*ctor)(void*)); の割り当てを処理できる新しいスラブアロケーターを作成します バイト長のオブジェクト。作成が成功すると、関連する size へのポインタが表示されます 。この構造は、スラブ それは管理します。

    Wikipediaの説明に示されているように、そのような追加のレイヤーの目的は、メモリ割り当てが単純で直感的な方法で行われた場合に発生する可能性があるメモリの断片化の問題を防ぐことです。そうするために、それはの概念を導入しますスラブ 次のデータ構造を通じて:

    ウィズウィズ
    

    したがって、 struct kmem_cache  オブジェクトはその3つのリストを保持しますスラブ、3つのフレーバーで収集:

    空のスラブ:これらのスラブには使用中のオブジェクトが含まれていません。

    部分スラブ:これらのスラブには現在使用されているオブジェクトが含まれていますが、新しいオブジェクトを保持できるメモリ領域がまだあります。

    フルスラブ:これらのスラブには、使用中のオブジェクトが含まれており、新しいオブジェクト(フル...)をホストできません。

    スラブアロケーターを介してオブジェクトを要求すると、部分スラブ内の必要なメモリ領域を取得しようとしますが、取得できない場合は、空のスラブから取得します。

    これについてより多くの情報を収集したい場合は、Robert LoveのLinuxカーネル開発

  • 解決した方法 # 2

    私はこれに答えるには遅すぎるかもしれませんが、これは他の人にも役立つかもしれません。 Linux Virtual Memory Managerの理解からわかるように、スラブがあることには3つの大きな利点があります。

    内部の断片化を減らす バディシステムによって引き起こされます。小さいオブジェクトに最適なキャッシュがあるからです。

    ハードウェアキャッシュの使用率の向上 -オブジェクトを異なるスラブの異なるオフセットで開始するように調整して、キャッシュライン間の干渉を減らすことができます。これは、物理的にインデックス付けされたキャッシュがあるという仮定に基づいています。

    スラブはキャッシュ内のプライマリユニットであり、一度に取得/放棄されます。これは〜をひき起こす外部断片化の減少 同様に。

    The Slab Allocator:Object Caching Kernel memory Allocator(1994)のセクション3.2を参照してください。

    struct slab { struct list_head list; /* embedded list structure */ unsigned long colouroff; void *s_mem; /* first object in the slab */ unsigned int inuse; /* allocated objects in the slab */ kmem_bufctl_t free; /* first free object (if any) */ };

  • 前へ java - JPAクエリ:サブクエリをグループ化条件に結合する
  • 次へ r - 正規表現グループがstr_matchで機能していない理由がわかりません