2016-05-31 8 views
8

C(およびC++)には、動的メモリ割り当て関数のファミリが含まれています。そのほとんどは直感的に名前が付けられており、メモリの基本的な知識を持つプログラマに説明しやすいものです。 calloc()はいくつかのメモリを割り当て、それを熱心に消去しますが、malloc()は単にメモリを割り当てます。 realloc()free()もありますが、それはかなり自明です。malloc()ではなくvalloc()を使用する方が適切なのはいつですか?

malloc()

のマンページは、ページ境界に整列(size)バイトを割り当てた、valloc()に言及しています。

残念ながら、私の背景は低レベルの複雑さでは十分ではありません。ページ境界に位置合わせされたメモリの割り当てと使用にはどのような影響がありますか?通常のmalloc()またはcalloc()とは対照的に、これが適切なのはいつですか?

+0

MSVCには 'valloc'はありませんが、' _aligned_malloc'があります –

+2

短い答え:**パフォーマンスのために**ほとんどのアーキテクチャでは実装固有の機能が必要です。 –

+1

これは参考になる可能性があります。https://www.ibm.com/support/knowledgecenter/SSLTBW_2.1.0/com.ibm.zos.v2r1.bpxbd00/rvallo.htm – JAL

答えて

8

vallocのマンページは、重要な注意事項が含まれます。

関数たvalloc()は3.0BSDで登場しました。 4.3BSDでは廃止され、SUSv2では遺産として文書化されています。 POSIX.1-2001には現れません。

valloc時代遅れと非標準である - あなたの質問に答えるために、新しいコードで使用することは適切ではありませんでしょう。

アライメントされたメモリを割り当てたいいくつかの理由がありますが、this questionにはいくつかのものがあります。通常、メモリアロケータにはどのメモリが割り当てられているかがわかります。新しく割り当てられたメモリが何かに整列している必要があることが確かな場合は、代わりにaligned_alloc(C11)またはposix_memalign(POSIX)を使用してください。

+0

他の質問で言及されているものは、* page * alignmentの割り当てにはまったく適用されません。 –

+0

[glibcマニュアル](https://www.gnu.org/software/libc/manual/html_node/Aligned-Memory-Blocks.html)にはまだ不思議なことに言及されており、実装さえ提供しています。 –

+0

@iharob:最新のリリースであるUbuntu Xenialでは、 'valloc'は' posix_memalign'のマニュアルページで議論され、 'man valloc'はそれを引き上げます。 –

-2

最初にvallocは廃止され、代わりにmemalignを使用してください。

2番目のことは、C(C++)標準の一部ではありません。

これは、境界が_SC_PAGESIZE境界に揃った特別な割り当てです。

いつ使用するのが便利ですか?私はあなたが特定の低レベルの要件を持っていない限り、決してないと思います。必要なのであれば、ほんのわずかなマイクロ最適化やプロセス間の共有メモリの作成のように便利ではないので、必要があると分かります。

4

通常、ページのアラインメントは、通常はページの細分性で動作するプロセッサのMMUの機能を利用したいので、高速化のためには行われません。

mprotect(2)を使用してそのメモリのアクセス権を変更する場合の1つの例です。たとえば、あるデータをメモリのチャンクに格納し、それを読み込み専用にして、そこに書き込もうとするプログラムのバグのある部分がセグメンテーションをトリガーするとします。 mprotect(2)は、パーミッションをページ単位でしか変更できないため(これは基本的なCPUハードウェアが実行できるものなので)、データを格納するブロックの方がページの整列がよく、そのサイズはページサイズの倍数である方がよい。それ以外の場合は、読み込み専用に設定した領域には、まだ書き込まれていない関連のない他のデータが含まれている可能性があります。

または、おそらくメモリ内に実行可能コードを生成しておき、後でそれを実行することになります。デフォルトで割り当てるメモリは、おそらくコード実行を許可するように設定されていないため、実行許可を与えるにはmprotectを使用する必要があります。ここでも、これはページの粒度で行わなければなりません。

もう1つの例は、今すぐメモリを割り当てる場合ですが、後でその上に何かmmapが必要な場合があります。

一般に、ページアライメントされたメモリの必要性は、かなり低レベルのアプリケーションに関連し、しばしばシステム固有のものが関係します。あなたがそれを必要としたら、あなたは知っているでしょう。 (前述のように、あなたはvallocていないことを割り当てるが、posix_memalignを使用して、または、おそらく匿名mmap必要があります。)

-2

自明の答えは、たvallocを使用することが適切であるとのmallocは(効率の低い)には不向きであるときアプリケーション(仮想)メモリ使用パターンとvallocがより適しています(より効率的です)。これは、OSやライブラリ、アーキテクチャ、アプリケーションに依存します...

mallocは、使用可能であれば解放されたメモリから実際のメモリを割り当てていましたが、そうでない場合はbrkポイントを増やすことで、セキュリティ上の理由からOSによってクリアされます。

dumb実装のcallocはmallocを実行してからメモリをクリアしますが、スマートな実装では、オペレーティングシステムによって自動的にクリアされる、新たに割り当てられたメモリの再呼び出しが回避されます。

vallocは仮想メモリに関連しています。ファイルシステムを使用している仮想メモリシステムでは、大量のメモリまたはファイルスペース/スワップスペースを物理メモリよりも多く割り当てることができ、ページ単位でスワップされます。 Unixでは、指定されたファイルのファイルの作成とページの追加/削除は、ファイルを定義するためにinodeを使って行われますが、実際のディスクブロックは必要に応じて処理されません。したがって、実際に物理ページやスワップページを割り当てたり、forループを実行したりすることなく、ファイルシステムとページングシステムが必要に応じてデータセグメントスワップのサイズを増やすことができます。したがって、vallocはmallocよりもずっと高速です。しかし、callocと同様に、どのようなidiotsyncratic * x/Cフレーバがそれをするのかは、彼らの責任であり、vallocのmanページは、これらの期待に全く役に立たない。

伝統的に、これはbrk/sbrkで実装されました。もちろん、ページングされたシステムであれ、セグメント化されたシステムであれ、仮想メモリシステムでは、このbrk/sbrkのものはまったく必要ありません。ファイルまたはアドレススペースに最後の場所を書き込むだけで十分ですポイント。

通常、ユーザーが必要とするものではなく、通常はシステムが望むまたは必要とするものであるページ境界への割り当てを再割り当てします。

vallocをシミュレートする(おそらくもっと高価な)方法は、ページ境界を決定してからこのalignment仕様でaligned_allocまたはposix_memalignを呼び出すことです。

vallocが推奨されなくなった、または一部のOSで削除されている、または不要であるという事実は、他のものではまだ効率的ではないことを意味しません。それが廃止されたり削除されたりすると、効率的な代替品があることを期待しています(しかし、私はそれに賭けることはできませんし、実際に自分自身のmalloc交換を書いたかもしれません)。

過去40年間にわたり、仮想メモリと実メモリのトレードオフは定期的に変更されており、主流のOSは効率(時間やスペース)のないプログラマ主要な命令として組み込みシステムでは、効率はより重要ですが、標準のOSやツールでは効率がよくサポートされないことがよくあります。しかし疑いの余地があるときは、誰かが目を覚まして実行/実行することに頼ったり、元に戻す/やめることを決めるのではなく、自分が必要とするものを自分のアプリケーションにロールバックすることができます。

本当の答えは、必ずしもvallocやmalloc、calloc、あるいはあなたの現在のOSのサブバージョンのいずれかを使用したくないということです。

+0

'セキュリティ上の理由からOSが[メモリ]をクリアした場合'これは間違っているだけです。環境がこのように動作するという保証はありません。さらに、私はこの答えが質問スレッドに新しいものを追加するとは思わない。 – Jules

+0

@Jules - 何が間違っていますか?あなた(またはmalloc)が新しいメモリ(他のユーザ/プロセスによって使用されている可能性がある)を取得するためにbrkを使用すると、OSによって消去されますが、セキュリティ上の問題はありません。最新のOSでは、これは物理メモリを割り当てる際に仮想メモリシステムによって処理されます。 vallocはまだ役に立たないかどうかはOSによって異なります:vallocは、説明されている (仮想メモリ割り当て)条件の下でmallocより高速です。これは、元の質問に対する答えです。 vallocとmallocをいつ使用するのか、なぜvallocを使用するのか –

+0

「最新のOS」 - あなたはいくつかの非常に強力な仮定をしています。一般的なデスクトップOSやサーバOSでは、特定のセキュリティ対策を施行しない多くの最新のOS(例えば、組み込みアプリケーションやIoTアプリケーションなど)が数多くあります。ちなみに、 'valloc'は、非推奨のために実装を完全に削除した多くのOSでは高速化できません。 – Jules

関連する問題