割り当てる50MBがあり、各反復でメモリを割り当てるforループがあるとします。次のforループを実行するとどうなりますか。
for(int i = 0; i <20; i ++){
int *p = malloc(5MB);
}
私はインタビューでこの質問をされました。誰かがこれについて私を導き、そのような状況を理解するために私が学ばなければならない必要なトピックに私を導くことができますか?
割り当てる50MBがあり、各反復でメモリを割り当てるforループがあるとします。次のforループを実行するとどうなりますか。
for(int i = 0; i <20; i ++){
int *p = malloc(5MB);
}
私はインタビューでこの質問をされました。誰かがこれについて私を導き、そのような状況を理解するために私が学ばなければならない必要なトピックに私を導くことができますか?
これが仮想メモリを利用するシステムである場合、mallocが単に失敗してnullポインタを返すよりも、状況は明らかに複雑です。この場合、malloc呼び出しにより、仮想アドレス空間にメモリのページが割り当てられます。このメモリにアクセスすると、ページフォールトが発生し、OSメモリマネージャに制御が与えられ、仮想メモリのページが物理メモリのページにマップされます。使用可能な物理メモリがいっぱいになると、メモリマネージャは通常、現在物理メモリにあるデータをディスクバッキングに書き込み(または、ディスクファイルによってすでにバッキングされている場合はこのデータを破棄する)、これを再マッピングすることで、さらなるページフォールトを処理します。元々ページフォールトが発生した仮想メモリページで使用可能な物理メモリになりました。
ウィキペディアには、さまざまなOSの実装の詳細を含む、このプロセスのかなり基本的な概要(http://en.wikipedia.org/wiki/Paging )が含まれています。より詳細な情報は、他の多くの情報源から入手できます。インテルアーキテクチャーのソフトウェア開発マニュアル(http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html)
mallocのドキュメント(例:http: //www.cplusplus.com/reference/cstdlib/malloc/ )によると、5MBのメモリブロックへのポインタを取得します(mallocの引数は必要なバイト数である必要があることに注意してください)。 、MBではありません。)最初の10回(使用可能な50MBから取り出されたmallocされたスペースに関連するオーバーヘッドがある場合は、おそらく9回)、このスペースへのポインターが返されます。これに続いて、さらに5MBのメモリチャンクは使用できなくなり、mallocは失敗し、nullポインタを返します。