2

C 関数の malloc と calloc をいじっていて、いくつか質問があります。

これら2つの関数を使用して物理メモリのみを割り当てることができるかどうかを確認したいのですが、私のMacには4GBまたはRAMがあり、mallocを使用すると4GBを超える方法を割り当てることができます。つまり、mallocは物理メモリと仮想メモリの両方を割り当てます。

いくつか質問があります。

  1. 物理メモリのみを割り当てることができるように、使用できる関数はありますか (仮想メモリの割り当てなし)

  2. malloc と calloc を呼び出すとき、およびポインターが返されるときに、ポインターを使用して、割り当てられている物理メモリの量と割り当てられている仮想メモリの量を判断する方法はありますか?

簡単な例は本当に高く評価されます:)

ご協力いただきありがとうございます :)

4

2 に答える 2

3

はい、mlock() を使用してメモリ領域を RAM にのみ保持し、ページアウトを回避できます。通常は暗号化に使用され、後で攻撃者に取得される危険を伴うキーがディスクに保存されるのを防ぎます。

もちろん、RAM にロックできるメモリの量は限られています。それはまだ仮想メモリになりますが、ディスクには移動しません。これがあなたが望むものだと思います。

malloc/calloc は、メモリを割り当てるための OS の実際の呼び出しの周りの libc ラッパーです (そして、OSX に何があるかはわかりません)。また、頻繁なシステム呼び出しを避けるために内部バッファーを保持します。これらの呼び出しの libc 実装を確認し、それらがデータを保持する場所と形式を確認して、アクセスできるようにする必要があります。

于 2013-01-05T09:58:09.123 に答える
3

短い答え:いいえ、いいえ。

長い答え: 「仮想メモリ」とは、ディスク上に保存されているという意味ではなく、実際の場所が抽象化されていることを意味するため、プログラムは実際に保存されている場所を知ることができません。これは、VM システムが「同じ」メモリを移動して、コンピュータの全体的なメモリ使用量を最適化できることを意味します。仮想メモリのページが最初に RAM に格納され、(しばらく使用されていない場合) ディスクにページアウトされて別のもののためのスペースが確保され、(実際にアクセスされたときに) RAM にページバックされることはまったく正常です。 、次にディスクに戻り、次に RAM に戻ります。

ユーザー空間プログラムは、常にこの抽象化レイヤーを介してすべてのメモリにアクセスします。つまり、プログラムは仮想メモリ以外のものを割り当てたりアクセスしたりすることはできません。

「有線」と呼ばれるメモリのクラスがあります。これはまだ仮想ですが、ページング ポリシーにより、ディスクへの移動が許可されていません。あなたのプログラムはこれを割り当てることができません。カーネルだけができます。

詳細については、Apple 開発者サイトのメモリ管理に関する説明を読むことをお勧めします。

于 2013-01-04T15:47:40.913 に答える