プロセスがmallocを呼び出すときにI/O(キャッシュの交換など)が行われてメモリが利用可能になると仮定するのは間違いですが、これはかなりの時間をブロックする可能性があることを意味します。したがって、私たちはlinuxに2つのバージョンのmallocを持つべきではありません.1つは、小さなチャンクを得るのに適した "fast_malloc"と言います。&はブロックされないことが保証されています(もちろんOUT_OF_MEMORYで失敗するかもしれません)。スペースは必要ですが、コールバックが必要ですか?mallocは非同期ではありませんか?
例:リンクリスト内の項目の空き領域を確保するために必要なメモリ容量が小さい場合は、従来のインラインmallocよりOSが99.999%の時間を満たしているか、 。もう1つの例:インデックスに入れられるかなりのチャンクを割り当てようとしているDBサーバーの場合、私はasync_mallocを選択して "コールバックの複雑さ"を扱うかもしれません。
私がこれを持ち出した理由は、毎秒何十万というWeb要求を処理する非常に並行したサーバーを作成し、一般的に要求を処理するためのスレッドを避けることです。別の言い方をすれば、I/Oが発生するたびに、それを非同期にしたい(libeventベース)。残念ながら私は、ほとんどのC APIが同時使用のための適切なサポートが不足していることを認識しています。たとえば、ユビキタスなMySQL Cライブラリは完全にブロックされており、それは私のサーバが広範囲に使用するライブラリの1つです。繰り返しますが、私はいつも他のスレッドにオフロードすることでノンブロッキングをシミュレートできますが、完了コールバックで結果を待つほど安くはありません。 kaylumとして
'malloc'を呼び出すことは、本質的により多くのIOを引き起こすことはありません。たぶんあなたは、あなたにメモリを割り当てるだけではなく、返されたメモリを混乱させているかもしれません。あなたが100MBを求めるのは、mallocが直ちに100MBのスワップを引き起こすわけではありません。それはメモリにアクセスするときにのみ起こります。 – kaylum
Cは 'malloc()'のタイミング性能を指定していません。確かに、これはタイミングの問題がある最初のアプリケーションではありません。主要なOSである典型的な 'malloc()'は、長い時間ブロッキングを避け、代わりに使用時にしか割り当てません。 http://stackoverflow.com/q/19991623/2410359。 – chux