この投稿は、前の投稿に基づいて構築され、カスタムメモリアロケーターのメモリの断片化に対処します。 中心的な問題は、小さなブロックを繰り返し割り当てて解放すると、多くの小さな、使用可能なメモリにギャップが作成され、十分な総自由スペースが存在する場合でも、より大きな割り当てを防ぐことです。 この記事では、解決策について説明します。隣接するフリーブロックをマージします
問題:メモリフラグメンテーション
著者は、コードの例と図を使用して断片化を示しています。 小さな割り当てに続いて、契約ロケーションが断片化された空きスペースを残します。 合計の自由スペースがリクエストを超えている場合でも、単一のフリーブロックが十分に大きいため、その後のより大きな割り当ては故障します。 図は、この問題を視覚的に示しており、より小さくて解放されたブロックが、より大きな自由領域の効率的な再利用をどのように防ぐかを示しています。
解決策:隣接するフリーブロックのマージ
ソリューションでは、隣接するフリーブロックをマージして、より大きく使用可能なメモリのチャンクを作成します。 著者は、読みやすさと再利用のためにコードをリファクタリングし、いくつかのヘルパー機能を導入します。
:ブロック内のユーザーアクセス可能なメモリ領域へのポインターを返します。header_user_area(Header *header)
header_address_after_block(Header *header)
header_previous_available(Header *header)
header_next_available(Header *header)
header_merge(Header *header)
に統合します
関数は、メモリを解放する前にを呼び出すように変更されます。 これにより、メモリがシステムにリリースされる前に、隣接するフリーブロックを組み合わせることが保証されます。
abfree()
結論と次のステップ
改善されたabfree()
関数とヘルパー機能は、メモリの断片化を大幅に削減します。 著者は、次の投稿で対処されるメモリブロックアライメント:メモリブロックアライメントが残っていることに注目しています。 完全な、更新されたabfree()
関数とそのサポート機能は、記事の最後に提供されます。
以上がmalloc()およびfree()の実装 - 小さなブロックのマージの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。