2

かなり大きな、約 100 GB のメモリのチャンクを割り当てています。正確なサイズは、コンパイル時に常にわかります。

静的に割り当てる必要がありますか?

static char data[DATA_SIZE];

またはmmapを使用していますか?

data = mmap(NULL, DATA_SIZE, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE|MAP_LOCKED|MAP_UNINITIALIZED, -1, 0)

前者では、アプリケーション (起動時間を無視) がわずかに高速に実行されているように見えます。

失敗した割り当てを無視すると、各アプローチの長所と短所は何ですか?

4

2 に答える 2

5

これを使用する理由はまったくありませんmmapmallocはそれを行う能力があり、通常は内部で使用しますmmapが、使用mallocするとコードがよりシンプルになり、理解しやすくなり、移植性が高くなります。

静的配列が望ましいかどうかについては、おそらく。主な短所は、複数のインスタンスに存在する必要がない場合でも、データ構造の単一のインスタンスを持つのではなく、実際のシングルトン (これは悪いことです) を持つことを強制することです。観点に応じて、長所または短所になる可能性のある静的配列を使用するもう1つの側面は、実行時に処理する必要があるものから、プログラムの呼び出し元が処理する必要があるものに失敗のケースを移動することです(失敗したため)execveまたは、制御がプロセスに到達する前の早期プロセス終了)。

于 2014-01-03T07:34:46.963 に答える
4

mmaporを使用するmallocのは、単純に失敗のケースの方が処理しやすいからです (そして、少なくとも意味のあるエラー メッセージを表示できるからです)。静的データを使用すると、プログラムのexecve(2)は失敗します (そして、それを試みるシェルはあまり役に立たないメッセージを出します)。

/proc/meminfoただし、基盤となるシステムに十分なメモリ リソースがあることを(解析によって) テストすることも考えられます。

最後に、なぜそんなに多くのデータが必要なのかを知らずに、それはかなり悪臭を放ちます. そうでなければできないと確信していますか?本当に 100G バイトが必要な場合は、非常に大きな (そして高価な) マシンでしか実行できません。

仮想メモリサブシステムがページングによって適切に処理するとは思わないでください。スラッシングは、コンピューターを使用不能にするために非常に重要です。または、madvise(2)の使用を検討してください。

特殊なスーパーコンピューターにアクセスできない限り、設計ミスのように見えます (現在のデスクトップは最大で 32G バイトです)。

于 2014-01-03T07:29:15.370 に答える