8

バッファとメモリ プールについていくつか質問があります。

サーバーがあり、1 秒あたり ~50-100+ メッセージを送受信しているとします。すべてのメッセージにはさまざまなサイズがあります。ここでメモリ管理を最大限に活用するにはどうすればよいでしょうか? 私の当初の計画では、固定サイズのバッファー ノードを使用して、次のようにプールしていました。

struct buffer{
    uint8_t  data[512];
    uint32_t end;
    buffer*  next;
}
buffer* b = pool_get_new_buffer();

そのため、メッセージが送信されると、サイズに応じて 1 つ以上のバッファーを作成し、それらをリンクします。このようにして、プール自体の断片化を恐れることはありません。(またはそれは少なくとも私が考えていることです)。しかし、小さなメッセージでは、スペースの無駄です。

しかし、ますますインターネットでコードを読んだりチェックしたりしていると、誰もこのアプローチを使用していないようです。では、より良いアプローチは何でしょうか? メッセージのサイズに応じてプールからメモリを割り当てますか?

編集:だから、ここで何をすべきかは、おそらくさまざまなアプローチのより詳細な比較です。

チェーン バッファ アプローチを使用すると、断片化を最低に保つと推測しますが、一方で、チェーン内のすべてのバッファに対して memcpy を実行するとコストもかかると思います。しかし、繰り返しになりますが、十分な大きさのバッファーを割り当てて単一の memcpy を実行することには、ほとんどの人がとにかくこのアプローチを選択したとしても、マイナス面もあるに違いありません。

4

1 に答える 1

1

サイズが0.5 / 1MBの単一のバッファを持つことはどうですか。これは明らかに、対象の OS/デバイスと、場合によっては最大メッセージ サイズに依存します。また、サーバーにパケット サイズを含めてもらいます。パケットが単一のバッファ サイズを超えないと仮定すると、データをバッファにダウンロードして処理し、メモリを使用可能としてマークできます。私はこのアプローチを単一のクライアント サーバー アプリケーションに使用しました。

于 2013-03-31T01:07:59.190 に答える