「Linux ネットワークの内部構造を理解する」と「Linux カーネルを理解する」という 2 冊の本やその他の参考文献を読むことで、私はかなり混乱しており、「メモリ キャッシュ」と「メモリ プール」の手法について明確にする必要があります。
1) それらは同じ技術ですか、それとも異なる技術ですか?
2) 同じでない場合、違いを生むもの、または明確な目標は何ですか?
3) また、スラブ アロケータはどのように導入されますか?
「Linux ネットワークの内部構造を理解する」と「Linux カーネルを理解する」という 2 冊の本やその他の参考文献を読むことで、私はかなり混乱しており、「メモリ キャッシュ」と「メモリ プール」の手法について明確にする必要があります。
1) それらは同じ技術ですか、それとも異なる技術ですか?
2) 同じでない場合、違いを生むもの、または明確な目標は何ですか?
3) また、スラブ アロケータはどのように導入されますか?
スラブアロケータについて:
したがって、メモリがフラットであると想像してください。つまり、4ギガの連続したメモリのブロックがあります。次に、プログラムの1つが256バイトのメモリを必要とするため、メモリアロケータが実行する必要があるのは、この4つのギグから256バイトの適切なブロックを選択することです。だから今あなたの記憶は次のように見えます
<============256バイト=======================>
(各=は連続したメモリブロックです)。時間が経ち、メモリで動作する多くのプログラムは256ブロック以上またはそれ以下を必要とするため、最終的にメモリは次のようになります。
<== 256 == 256 = 256 = 86 = 68 = 121 ===>
そのため、断片化され、美しい4ギガのメモリブロックの痕跡はありません。これは断片化です。ここで、スラブアロケーターが行うことは、割り当てられたオブジェクトを追跡することです。オブジェクトが使用されなくなると、実際にはある種のリストに保持されるときにメモリが空いていると表示されます(FreeListsについて読みたい場合があります)。
ここで、最初のプログラムが割り当てられた256バイトを放棄し、次に新しいプログラムが256バイトを必要としていると想像してください。メインメモリの新しいチャンクを割り当てる代わりに、最後に解放された256バイトを負担をかけずに再利用できます。物理メモリを検索して、適切な連続したスペースブロックを探します。これは、基本的にメモリキャッシュを実装する方法です。これは、メモリが非常に断片化されて使用できなくなり、メモリマネージャが適切なサイズのブロックを取得するために何らかの魔法をかけなければならない状況になる可能性があるため、メモリの断片化が全体的に減少するように行われます。一方、スラブアロケーターを使用すると、問題に積極的に対処できます(ただし、解消されません)。
ルックアサイド キャッシュ- Linux カーネルのキャッシュ マネージャーは、スラブ アロケーターと呼ばれることもあります。同じサイズの多くのオブジェクトを何度も割り当てることになる可能性があるため、このメカニズムを使用すると、多くのオブジェクトを何度も割り当てる必要なく、同じサイズで多くのオブジェクトを割り当てて後で使用することができます。
メモリ プールは、緊急時に使用するメモリのリストを常に保持しようとするルックアサイド キャッシュの形式にすぎません。そのため、メモリ プールが作成されると、割り当て関数 (スラブ アロケータ) が事前に割り当てられたオブジェクトのプールを作成し、それらを取得できるようにします。必要なときに。