8

for / while/do内の多くのc/malloc()は多くの時間を消費する可能性があるため、オペレーティングシステムが高速malloc用にメモリをバッファリングするかどうか知りたいです。

私は、mallocの「貪欲な」ラッパーを作成することでmallocを高速化できるかどうかを考えてきました。たとえば、1MBのメモリを要求すると、最初のアロケータは10MBを割り当て、2番目、3番目、4番目などにmalloc関数を呼び出すと、最初に「通常の」方法で割り当てられたチャンクからメモリが返されます。もちろん、使用可能なメモリが十分にない場合は、新しい貪欲なメモリチャンクを割り当てる必要があります。

どういうわけか、誰かが以前にこれまたは同様のことをしたに違いないと思います。だから私の質問は単純です:これはメモリ割り当てプロセスを大幅にスピードアップするものですか?(はい、質問する前に試してみることができましたが、必要がなければ、そのようなことを書くのは怠惰です)

4

5 に答える 5

3

しばらく前にGoogleChromeコードを閲覧していたときに、http://www.canonware.com/jemalloc/を見つけました。これは、無料の汎用でスケーラブルなmalloc実装です。

明らかに、多くのプロジェクトで使用されています。これは、通常、多くの実際のシナリオで標準のmallocの実装よりも優れているためです(いくつかの大きな割り当てではなく、多くの小さな割り当て)。

間違いなく一見の価値があります!

于 2010-09-04T16:04:23.973 に答える
3

すべてのバージョンのmalloc()doバッファリングは、ある程度説明します。現在のリクエストよりも大きなチャンクを取得し、その大きなチャンクを使用して複数のリクエストを満たしますが、リクエストサイズはある程度までです。これは、一度に16バイトの複数の要求が、50〜100回の呼び出しごとに1回、またはそれらの一般的な行に沿った何かで、o/sからのより多くのメモリを必要とすることを意味します。

あまり明確ではないのは、境界サイズが何であるかです。一度に4KiBの比較的小さな倍数を割り当てる可能性があります。より大きな要求(MiBサイズの要求)は、空きリストにあるものから要求を満たすことができないたびに、より多くのメモリを求めてシステムに戻ります。ただし、このしきい値は通常、1MiBよりもかなり小さくなります。

の一部のバージョンではmalloc()、割り当て特性を多かれ少なかれ調整できます。それは研究の肥沃な分野でした-多くの異なるシステム。一連の議論については、 Knuthの「TheArt of ComputerProgramming」第1巻(基本的なアルゴリズム)を参照してください。

于 2010-09-04T16:11:13.983 に答える
2

この手法はSlabAllocatorと呼ばれ、ほとんどのオペレーティングシステムでサポートされていますが、カーネル割り当てのためだけに、ユーザースペースmallocで利用できる情報が見つかりません。

ここで、 Jeff Bonwickによる論文を見つけることができます。これは、Solarisの元の手法について説明しています。

于 2010-09-04T16:10:05.490 に答える
1

Googleには、おおよそあなたが考えていることを実行するmalloc()の貪欲な実装があります。いくつかの欠点がありますが、多くのユースケースで非常に高速です。

于 2010-09-04T16:16:25.500 に答える
-2

あなたが言っていることはおそらく行われているでしょう、私は本当に知りません。ただし、システムレベルでmalloc()をバッファリングする際のレイテンシーによって、レイテンシーが大幅に減少するかどうかはわかりません。あなたはまだprivに入るのに時間をかけなければなりません。システムコールのモード、カーネルレベルの構造をロックする可能性(つまり、より多くのシステムコールとロックの待機)、およびその性質のもの。

プログラムのユーザースペースに独自のメモリマネージャーを記述し、プールにより多くのメモリが必要な場合にのみmalloc()を呼び出すことができる場合は、レイテンシが減少する可能性があります。

于 2010-09-04T16:08:10.243 に答える