と について混乱heap
してfree list
います。いくつか質問がありますが、C で malloc がどのように機能するかについては理解しています。間違っている場合は修正してください。
- ヒープ メモリは、データ ブロックのリンクされたリスト (フリー リスト) として構成されていますか?
- ヒープメモリとフリーリストに違いはありますか?
ストレージ割り当てに関する私の理解 (改善の余地あり) :- malloc を呼び出すと、ヒープにメモリが割り当てられ、適切なサイズのデータ ブロックを から選択することによって行われfree list
ます。
malloc によって特定のメモリ ブロックが返されると、そのブロックはフリー リストから削除され、そのメモリ ブロックの物理アドレスがページ テーブルで更新されます。
を使用してメモリが解放されるfree()
と、データ ブロックがフリー リストに挿入され、断片化を減らすために、隣接するブロックと結合さpresent
れ、ページ テーブル エントリのビットがクリアされます。
したがって、ヒープ全体はフリーリスト(フリーブロックのリンクリスト)+割り当てられたデータブロックです。
それはストレージ割り当ての全体像ですか?
編集:Linuxカーネル開発(Robert Love)の章からメモリ管理、スラブ割り当て
「空きリストには、使用可能な、既に割り当てられているデータ構造のブロックが含まれています。コードがデータ構造の新しいインスタンスを必要とする場合、十分な量のメモリを割り当てて設定するのではなく、空きリストから構造の 1 つを取得できます。後でデータ構造が不要になると、割り当てを解除するのではなく、フリー リストに戻します。この意味で、フリー リストはオブジェクト キャッシュとして機能し、頻繁に使用されるタイプのオブジェクトをキャッシュします。
フリーリストは、「利用可能な、割り当てられたデータ構造のブロック」として言及されています。
- フリーリストにある場合、どのように割り当てられますか?
- そして、メモリのブロックを解放リストに返すことは、そのブロックの割り当てを解除することと同じではありませんか?
- スラブの割り当てとストレージの割り当ての違い