2

メモリを割り当てようとすると:

int ramSize = magicLibrary.getRamSize();
assert(ramSize*2 <= pow(2,64-8));//Don't overflow the 64 bit limit (32 on some systems).

int * mainData new int[ramSize*2/sizeof(int)]; //2 times too big. 

スペースを埋めるためにディスク スワップを取得できますか? そうでない場合、どうすればスワップを使用できますか?

4

4 に答える 4

3

RAM もスワップ スペースも完全に使い果たされておらず、アドレス空間の制限 (つまり、32 ビットで 2 ~ 3GB、64 ビット システムでの RAM より多い) である限り、システムはメモリを割り当てることを許可します。RAM が使い果たされると、システムはスワップ領域を使用します。

場合によっては、OS が「オーバーコミット」を許可することもあります。これは、航空会社が「何人かの乗客が来ないことを期待する」ときに行うのと基本的に同じです。彼らがその時点に到達したとき。コンピュータに関して言えば、OS が実際に利用可能なメモリよりも多くのメモリを割り当てることを許可している可能性があることを意味し、「十分ではありません」というエラーは後で何らかの手段 (通常はメモリを解放すること) によって解決されます。 「スペア」または「ランダムなアプリケーションの強制終了」)。OS がこれを許可する理由は、アプリケーションが十分に使用されていない大きなメモリ領域を割り当てることが非常に多いためです。ゼロで埋められたメモリ領域は、「コピーオンライト」メモリとして「マージ」されることもあります。後で書き込むと、そのメモリの新しいコピーが作成されます。これはまた、大量のメモリを割り当てた場合、実際に何か (ゼロ以外?) を書き込んで「使用中」にする必要があることを意味する場合もあります。繰り返しますが、これは「大量のメモリを割り当て、ゼロで埋め、後でその一部のみを使用する」というアプリケーションの典型的な動作を反映しています。それらのゼロ」。

メモリが RAM にあるかスワップであるかは動的な基準であることに注意してください。メモリは常にスワップ インおよびスワップ アウトされており、プログラム コードとデータの両方がいつでもスワップ アウトされ、必要なときに元に戻されます。これが「ヒープ」であろうと他のメモリであろうと関係ありません。この点では、すべてのメモリがほぼ同じです。

実際に何を達成したいのかは完全には明らかではありませんが、うまくいけば、これで少なくとも何が起こるかを説明できます。

ああ、ramSizeバイト数であると仮定すると、これはほぼ確実に常に false です。

assert(ramSize*2) <= 2^(64-8)

ramSize * 2 > 0および(2 XOR 56) = 0

于 2013-04-03T18:49:35.460 に答える