51

2 つのプログラムを作成しました。1 つは を使用しmalloc、もう 1 つは を使用しmmapました。を使用した場合の実行時間mmapは、 を使用した場合よりも大幅に短縮されmallocます。

たとえば、使用しているときはmmap、システムへの読み取り/書き込み呼び出しを避けることを知っています。そして、メモリアクセスは少なくなります。

mmapしかし、 overを使用した場合の利点について、他に何か理由はありますmallocか?

どうもありがとう

4

6 に答える 6

16

mmapファイルからのデータの使用とmalloc読み取りについて言及していると思います。その場合、あなたはほとんど要点を得ました:

  • fread/を使用fwriteすると、OS に対して多くの呼び出しを行う必要があります。
  • あなたを使用mmapすると、1 回の操作でファイル全体にアクセスできるように見えます。OS はおそらく一度に 1メモリ ページずつファイルをマップするため、これは完全に正しいわけではありませんが、それでもはるかに高速です。
于 2009-11-15T23:44:57.467 に答える
16

一般に信じられていることとは反対に、mmap は実際には malloc に似たメモリ割り当て関数です。

mmaped ファイルはその 1 つの用途です。ファイル記述子として -1 を渡すメモリ割り当て関数として使用できます。

したがって、一般的な使用法は、小さなオブジェクトには malloc を使用し、大きなオブジェクトには mmap を使用することです。

これは良い戦略だ..

関数スコープのみの変数に alloca() を使用します。

于 2010-10-21T22:31:39.050 に答える
15

mmap実際にはファイルをメモリにロードしないため、ロードは速くなりますが、編集は遅くなります。

もう 1 つのポイントは、mmapメモリをまったく使用しないことですが、アドレス空間を占有します。64 ビット マシンでは、ほとんどのメモリ アドレス空間にメモリがありませんmalloc

于 2009-11-15T23:45:51.350 に答える
12

malloc と mmap はどちらも遅い場合があります。主に使用パターンに依存します。

mmap: カーネル ページング サブシステムは、ページ サイズ単位で動作します。つまり、ファイルからページ全体を読み取り、それを繰り返し実行したい場合 (適切なローカリゼーション)、mmap で問題ありません。逆に、その 5 Gb ファイルをマップして分散アクセスを行うと、カーネル スワップ ページが頻繁に出入りすることになります。実際の I/O に加えて、ページ管理にも時間がかかります。待ち時間が気になる場合は、このアクセス パターンを避けてください。Linux のページ再利用メカニズムはバーストする傾向があり、顕著なラグが発生し、キャッシュ ポイズニングによって他のプロセスが遅くなるからです。

malloc: ページ サイズ単位ではないメモリが必要な場合は問題ありません。しかし、mlock() のようなことをまともに行うことはできません。I/O に関しては、速度はその方法に大きく依存します。fread/fwrite は舞台裏でページをマップするか、ユーザー空間でバッファリングを行います。ローカライズされたアクセスはかなり高速になります。読み取り/書き込みはカーネルを直接通過するため、小さな分散アクセスでもキャッシュ ミスによる I/O が発生しますが、カーネルからユーザー空間に転送される実際のデータはわずかに少なくなります。それが測定可能かどうかはわかりません。

mlock() が実行されない限り、ユーザー ページはいつでもスワップ アウト/ライト バックされる可能性があります。これも時間がかかります。そのため、メモリがほとんどないシステムでは、最小のメモリをマップするバリアントが優先されます。Linux カーネルでは、未使用のページが I/O のキャッシュに使用されるため、すべてのシステムのメモリが少なすぎます。また、メモリの使用または I/O がバーストしている場合、カーネルがページを使用可能にするのにかなりの時間がかかる場合があります。

于 2013-03-02T05:16:56.800 に答える
3

mmap は実際にはファイルを読み取りません。それをアドレス空間にマップするだけです。そのため、アドレス空間のその領域に実際にアクセスするまでディスク I/O は発生せず、非常に高速です。

malloc は単にアドレス空間からメモリへのマッピングです

于 2009-11-15T23:49:21.950 に答える