5: ユーザー空間のメモリ割り当て

目次

ユーザー空間のメモリ割り当て

mmap

マロック


ユーザー空間のメモリ割り当て

mmap

カーネル空間をユーザー空間に直接マッピングし、カーネルからユーザー空間へのメモリ コピーを保存します。

mmapの欠点

  1. mmap を使用する場合は、メモリ マップのサイズを指定する必要があるため、mmap は可変長ファイルには適していません。
  2. mmap にファイルを更新するための操作が多数ある場合、2 状態コピーを回避するという mmap の利点は相殺され、最終的には多数のダーティ ページ ライトバックとそれによって引き起こされるランダム I/O に影響することになります。したがって、ランダムな書き込みが多い場合、効率の点で mmap メソッドがバッファを使用した通常の書き込みよりも必ずしも高速であるとは限りません。
  3. 小さいファイル (たとえば、16K 未満のファイル) の読み取り/書き込みの場合、mmap は読み取りシステム コールよりもオーバーヘッドと遅延が高くなります。同時に、mmap ディスクはシステムによって完全に制御されますが、データ量が小さい場合は、アプリケーション自体によって手動で制御する方が適切です。
  4. mmap は、オペレーティング システムのメモリ サイズによって制限されます。たとえば、32 ビット オペレーティング システムでは、仮想メモリの合計サイズはわずか 2GB ですが、mmap はメモリ内で連続したアドレス ブロックを見つける必要があるため、4GB ファイルを完全に mmap することはできません。この場合、mmap を複数のブロックに分割する必要がありますが、この時点でアドレス メモリ アドレスは連続していなくなり、mmap を使用する意味が大幅に減り、さらに複雑になります。

したがって、mmap が適用できるシナリオは実際には非常に限られており、次の状況では mmap メカニズムの使用を選択できます。

mmap メカニズムでは、複数のスレッドが同じ物理メモリ空間を共有します。したがって、mmap はマルチスレッド通信と共有メモリにより適しています。

マロック

  • 方法 1: brk() システム コールを通じてヒープからメモリを割り当てる
  • 方法 2: mmap() システム コールを通じてファイル マッピング領域にメモリを割り当てます。

しきい値はデフォルトで malloc() ソース コードに定義されています。

  • ユーザーが割り当てたメモリが 128 KB 未満の場合は、brk() を通じてメモリを申請します。
  • ユーザーによって割り当てられたメモリが 128 KB を超える場合は、mmap() を通じてメモリを申請します。

malloc() がメモリを割り当てるとき、ユーザーが要求したバイト数に応じてメモリ空間のサイズを正直に割り当てるのではなく、より大きな領域をメモリ プールとして事前に割り当てますたとえば、malloc(1) は 1 バイトの領域を割り当てますが、実際にはより大きな領域をメモリ プールとして割り当てます。メモリ プールは、プログラムの初期化時に一定量のメモリを事前に割り当て、割り当てられたメモリ ブロックをメモリ プールに格納し、必要に応じてオペレーティング システムにメモリの割り当てを要求せずにメモリ プールから直接メモリ ブロックを取得します。これにより、頻繁なシステム コールが回避され、効率が向上します。空きがあればメモリ プールに戻し、必要に応じてメモリ プールから直接取得します。

「 malloc によって要求されたメモリは、free によって解放されたメモリはオペレーティング システムに返されますか? 」という質問については、次のように要約できます。

  • brk()メソッドを通じて mallocによって要求されたメモリは、free がメモリを解放するときに、オペレーティング システムにメモリを返さず、次回使用するために malloc のメモリ プールにキャッシュします
  • mmap()を介して malloc によって要求されたメモリは、 free がメモリを解放すると、そのメモリをオペレーティング システムに返し、メモリは実際に解放されます。

 

おすすめ

転載: blog.csdn.net/qq_52353238/article/details/130217551