スラブメカニズムの分析
前書き
スラブは、パートナーシステム上のLinuxのメモリ管理メカニズムです。バディシステムの最小メモリ処理サイズは4k(つまり、ページのメモリサイズ)です。ただし、実際のメモリの使用では、それらの多くは小さなメモリです。メモリアプリケーションのリリースの効率を向上させるために、メモリフラグメントの生成を防ぎ、継続的なメモリ割り当てを防ぎます。CPUキャッシュのヒット率は低くなります。Linuxは、これらの問題を解決するために、パートナーシステム上にスラブメカニズムを設計しました。スラブは、Linuxカーネルのオブジェクトプールとして理解できます。
1。概要
スラブメカニズム全体のデータ構造を次の図に示します。
注1:ページ記述子の多くのフィールドは共用体の形式であるため、ソースコードと組み合わせて表示することをお勧めします。
1.1 kmem_cache
kmem_cacheキャッシュオブジェクト。各kmem_cacheはオブジェクトタイプに対応します。各フィールドの意味は次のとおりです。
- 名前:キャッシュ名;
- list:キャッシュリンクリスト。すべてのkmem_cacheはグローバルリンクリストに接続されます。
- refcount:アプリケーション数;
- object_size:オブジェクトサイズ;
- align:オブジェクトはalignバイトで整列されます。
- ctor:オブジェクト初期化関数ポインター。C++のコンストラクターとして理解できます。
- node:kmem_cache_node配列を保存します。NUMAアーキテクチャでは、各メモリノードは個別の管理用のキャッシュノードに対応します。
- cpu_cache:各cpu変数のオブジェクトキャッシュプール。オブジェクトの割り当てを高速化するために使用されます。
1.2 kmem_cache_node
kmem_cache_nodeは、さまざまなメモリノードのキャッシュ構造です。これは主に3つのlist_heads、つまりスラブ記述子を格納するための3つのリンクリストで構成されています。スラブは、オブジェクトに必要なメモリを割り当てるために使用される連続したページフレームのセットです。
スラブ記述子はページ記述子と組み合わされます。つまり、ページ記述子がスラブを記述する場合、それはスラブ記述子です。少なくとも、4.0のソースコードに見られます。この本によると、スラブ記述子は2つの場所に保存されています。
- 外部スラブ記述子:スラブの外部に格納され、cache_sizesが指すISADMAに適さない通常のキャッシュに配置されます。
- 内部スラブ記述子:スラブに割り当てられた最初のページフレームの先頭にある、スラブ内に格納されます。
オブジェクトが512MBより小さい場合、または内部フラグメントがスラブ記述子とオブジェクト記述子のためにスラブに十分なスペースを残している場合、スラブアロケーターは2番目のスキームを選択します。スラブ記述子がスラブの外部に格納されている場合、キャッシュ記述子のフラグフィールドのCFLGS_OFF_SLABフラグは1に設定され、それ以外の場合は0に設定されます。
3つのストレージスラブ記述子のリンクリストフィールドの意味は次のとおりです。
- slabs_free:フリースラブ、つまり、スラブがオブジェクトを割り当てていません。
- slabs_partial:スラブの一部、つまり、スラブにはオブジェクトが割り当てられていますが、割り当てることができる部分はまだあります。
- slabs_full:完全なスラブ、つまり、割り当て可能なすべてのオブジェクトが割り当てられており、これ以上割り当てを行うことはできません。
3つのリンクリストは、状態とともに移行されます。
1.3ページ
pageはページ記述子フィールドです。同時に、ネストされたスラブ記述フィールドのフラグがPG_slabの場合、それがスラブ記述子であることを示します。ページ記述子構造には、2つのキーフィールドs_memとfreelistがあります。
- s_mem:この連続ページフレームの最初のオブジェクトを指します。
- freelist:無料オブジェクトのリンクリストを指します。
ページ全体が指すメモリ構造は次のとおりです。
メモリ全体が前面のfreelistによってポイントされ、オブジェクト配列が背面にあり、s_memがオブジェクト1の開始アドレスを指します。中央がオブジェクト記述子です。アレイ。
オブジェクトアプリケーションのリリースプロセスは次のとおりです。
- 初期状態
サイズを割り当てることができるオブジェクトが5つあると仮定すると、それらは最初はすべてフリーであり、フリーリストは0を指し、ページのアクティビティは0です。 - 3つのオブジェクトを
連続して割り当てる3つのオブジェクトを連続して割り当てた後、フリーリストは3を指し、ページのアクティビティは3になります。 - オブジェクト1を
解放するオブジェクト1を解放するときは、最初にページのアクティビティを1から2に減らし、次にアクティブが配置されている1と2の位置を入れ替えます。その後、オブジェクトを申請する際は、オブジェクト1を直接申請してください。
注:実際、スラブのオブジェクトの適用と解放はこれよりもはるかに複雑です。この方法では、CPUキャッシュラインのヒット率が低下します。スラブは、色付けメカニズムを使用して、オブジェクトの割り当て順序を混乱させます。