メモリは完全にランダムな読み書きではないでしょうか?メモリは機械式のハードディスクとは異なる物理媒体ですが、メモリ内にメモリの断片があるとパフォーマンスに影響を与えるのはなぜでしょうか?このメモリの断片化とは正確には何を指しますか?
メモリ アロケータは通常、事前にメモリの大部分を OS に適用し、malloc()时标记一小段为已分配,free()この小さなセクションが割り当てられるたびに未割り当てとしてマークします。
malloc()
free()
malloc/free の順序は一般に任意であるため、複数回の malloc/free の後、分配1 -- 未分配1 -- 分配2 -- 未分配2 のように割り当てられたメモリと未割り当てのメモリが交互になります。つまり、未割り当てのメモリが 1 つずつ「断片化」されます。
分配1 -- 未分配1 -- 分配2 -- 未分配2
メモリ断片化のデメリット:
追加のメモリ占有: 未割り当てメモリの合計量が十分であっても、連続メモリが分離されない場合があります。この場合、OS から追加のメモリを申請する必要があります
キャッシュに影響します: キャッシュはページに基づいており、ページの未割り当て部分もキャッシュを占有します
最善の方法は、システムのデフォルトのプロセス ヒープを使用しないことです。代わりに、新しいメモリ ヒープを自分で申請してください。 1 種類のデータがヒープに配置されます。これは、頻繁にリクエストおよびリリースされる小さなデータに適しています。 最初に大きなデータを自分で malloc し、それから独自のメモリ プールを使用してそれを管理することもできます。 前者の場合は、WindowsのファイルマネージャーExploreが便利です。たとえば、走査されたディレクトリ ツリー構造は別のヒープに配置され、HeapFree はリーフ ノードを何度も解放する必要がなく、ヒープ全体を一度に解放します。 2 番目に、たとえば、libjpeg 自体には専用のメモリ プールがあります。
バディアルゴリズムについて学ぶことができます
こんなPDFもあります
開けられないなら壁を越えてください
複雑ではないのでmalloc实现就去看看dlmallocのソースコードを知りたいです
malloc
dlmalloc
メモリ アロケータは通常、事前にメモリの大部分を OS に適用し、
malloc()
时标记一小段为已分配,free()
この小さなセクションが割り当てられるたびに未割り当てとしてマークします。malloc/free の順序は一般に任意であるため、複数回の malloc/free の後、
分配1 -- 未分配1 -- 分配2 -- 未分配2
のように割り当てられたメモリと未割り当てのメモリが交互になります。つまり、未割り当てのメモリが 1 つずつ「断片化」されます。メモリ断片化のデメリット:
追加のメモリ占有: 未割り当てメモリの合計量が十分であっても、連続メモリが分離されない場合があります。この場合、OS から追加のメモリを申請する必要があります
キャッシュに影響します: キャッシュはページに基づいており、ページの未割り当て部分もキャッシュを占有します
最善の方法は、システムのデフォルトのプロセス ヒープを使用しないことです。代わりに、新しいメモリ ヒープを自分で申請してください。 1 種類のデータがヒープに配置されます。これは、頻繁にリクエストおよびリリースされる小さなデータに適しています。
最初に大きなデータを自分で malloc し、それから独自のメモリ プールを使用してそれを管理することもできます。
前者の場合は、WindowsのファイルマネージャーExploreが便利です。たとえば、走査されたディレクトリ ツリー構造は別のヒープに配置され、HeapFree はリーフ ノードを何度も解放する必要がなく、ヒープ全体を一度に解放します。
2 番目に、たとえば、libjpeg 自体には専用のメモリ プールがあります。
バディアルゴリズムについて学ぶことができます
こんなPDFもあります
開けられないなら壁を越えてください
複雑ではないので
malloc
实现就去看看dlmalloc
のソースコードを知りたいです