2 つのプログラムを作成しました。1 つは を使用しmalloc
、もう 1 つは を使用しmmap
ました。を使用した場合の実行時間mmap
は、 を使用した場合よりも大幅に短縮されmalloc
ます。
たとえば、使用しているときはmmap
、システムへの読み取り/書き込み呼び出しを避けることを知っています。そして、メモリアクセスは少なくなります。
mmap
しかし、 overを使用した場合の利点について、他に何か理由はありますmalloc
か?
どうもありがとう
mmap
ファイルからのデータの使用とmalloc
読み取りについて言及していると思います。その場合、あなたはほとんど要点を得ました:
fread
/を使用fwrite
すると、OS に対して多くの呼び出しを行う必要があります。mmap
すると、1 回の操作でファイル全体にアクセスできるように見えます。OS はおそらく一度に 1メモリ ページずつファイルをマップするため、これは完全に正しいわけではありませんが、それでもはるかに高速です。一般に信じられていることとは反対に、mmap は実際には malloc に似たメモリ割り当て関数です。
mmaped ファイルはその 1 つの用途です。ファイル記述子として -1 を渡すメモリ割り当て関数として使用できます。
したがって、一般的な使用法は、小さなオブジェクトには malloc を使用し、大きなオブジェクトには mmap を使用することです。
これは良い戦略だ..
関数スコープのみの変数に alloca() を使用します。
mmap
実際にはファイルをメモリにロードしないため、ロードは速くなりますが、編集は遅くなります。
もう 1 つのポイントは、mmap
メモリをまったく使用しないことですが、アドレス空間を占有します。64 ビット マシンでは、ほとんどのメモリ アドレス空間にメモリがありませんmalloc
。
malloc と mmap はどちらも遅い場合があります。主に使用パターンに依存します。
mmap: カーネル ページング サブシステムは、ページ サイズ単位で動作します。つまり、ファイルからページ全体を読み取り、それを繰り返し実行したい場合 (適切なローカリゼーション)、mmap で問題ありません。逆に、その 5 Gb ファイルをマップして分散アクセスを行うと、カーネル スワップ ページが頻繁に出入りすることになります。実際の I/O に加えて、ページ管理にも時間がかかります。待ち時間が気になる場合は、このアクセス パターンを避けてください。Linux のページ再利用メカニズムはバーストする傾向があり、顕著なラグが発生し、キャッシュ ポイズニングによって他のプロセスが遅くなるからです。
malloc: ページ サイズ単位ではないメモリが必要な場合は問題ありません。しかし、mlock() のようなことをまともに行うことはできません。I/O に関しては、速度はその方法に大きく依存します。fread/fwrite は舞台裏でページをマップするか、ユーザー空間でバッファリングを行います。ローカライズされたアクセスはかなり高速になります。読み取り/書き込みはカーネルを直接通過するため、小さな分散アクセスでもキャッシュ ミスによる I/O が発生しますが、カーネルからユーザー空間に転送される実際のデータはわずかに少なくなります。それが測定可能かどうかはわかりません。
mlock() が実行されない限り、ユーザー ページはいつでもスワップ アウト/ライト バックされる可能性があります。これも時間がかかります。そのため、メモリがほとんどないシステムでは、最小のメモリをマップするバリアントが優先されます。Linux カーネルでは、未使用のページが I/O のキャッシュに使用されるため、すべてのシステムのメモリが少なすぎます。また、メモリの使用または I/O がバーストしている場合、カーネルがページを使用可能にするのにかなりの時間がかかる場合があります。
mmap は実際にはファイルを読み取りません。それをアドレス空間にマップするだけです。そのため、アドレス空間のその領域に実際にアクセスするまでディスク I/O は発生せず、非常に高速です。
malloc は単にアドレス空間からメモリへのマッピングです