1

一部のOSでは、プロセスが正常に終了するか、異常に終了します。OSは、そのプロセスに割り当てられたメモリ(データ、コードなど)を消去することを決定します。終了時、または新しいプロセスにメモリを割り当てたいとき?

そして、このメモリ割り当て手順の消去は、すべてのオペレーティングシステム(winXP、Win7、linux、Mac)で同じですか?

ページテーブルには、そのプロセスの仮想アドレスとメモリ内の実際の物理アドレスのマッピングがあることを理解しています。

ありがとう。

4

2 に答える 2

4

OS がプロセス リソースを再利用する方法は、OS によって異なります (通常は異なります)。Windows 側では、NT 由来の OS は同様に動作するため、win XP と win7 の間にほとんど違いはないはずです。メモリにはさまざまな種類があるため、この文脈では「メモリ」について尋ねるのは単純化しすぎていることに注意してください。たとえば、典型的な Windows アプリケーションには、スタック メモリ、ヒープ メモリ (場合によっては複数のヒープ)、命令/静的メモリ、およびおそらく共有メモリがあります。このメモリのほとんどはプロセスによってのみ所有され、Windows はプロセスの終了 (異常終了の場合も含む) でそれを解放します。

ただし、共有メモリは複数の所有者を持つことができます (多くの場合そうです)。これは、 Windows ハンドル(複数のプロセスから参照される可能性があるカーネル レベルのオブジェクト) に関連付けられています。ハンドルには参照カウントがあり、参照カウントがゼロになると、関連するリソースが回収されます。これは、共有メモリは、それを参照するプロセスよりも長く存続できることを意味します。また、プロセスがハンドルを「リーク」し、ハンドルが再利用されない可能性もあります。そのようなハンドルが適切に閉じられ、リークしないことを確認するのはプログラマの責任です。異常終了の可能性は、この責任を複雑にします。

補足として、Windows がメモリを「再利用」するとき、それは単にメモリが他のプロセスなどへの将来の割り当てに使用できることを意味します。実際の 1 と 0 は通常、OS がメモリを割り当てて新しい所有者が割り当てられるまでそこに留まります。メモリのアクティブに上書きします。したがって、「再利用」とは、メモリがすぐにゼロになるなどのことを意味するものではありません。この問題でメモリをスクラブすることは非効率的であり、多くの場合不要です。セキュリティ上の懸念から質問している場合は、OS に頼るべきではありません。プロセスがメモリを OS に解放する前に、自分でメモリをスクラブする必要があります。

最新の Windows OS がメモリを処理する方法について詳しく知りたい場合、掘り下げてもかまわない場合は、MSDN の Windows API ドキュメントにこの件に関する多くの情報がありますが、少し散らばっています。開始するのに適した場所は、おそらく Windows ハンドルと、ライブラリのロード/アンロード/プロセス呼び出しです。 Application Programming for Windows (Richter)には、私の記憶が正しければ、おそらくこれに関する適切な情報がいくつかありますが、確認するためのコピーが手元にありません。

願わくば、Linux の内部に詳しい人が質問のその側面に対処してくれることを願っています。これはOS固有のものなので、違いがある可能性があります。NT 以前の Windows (Windows 95、98 など) では、プロセス メモリのモデルがまったく異なることに注意してください。これらの違いにより、OS が異常終了した場合にメモリを再利用することが難しくなる傾向がありました。一部のユーザーは、不安定なアプリケーションを実行している場合、蓄積されたメモリ リークをクリーンアップするために OS を頻繁に再起動する必要があることに気付きました。

于 2012-10-03T20:07:29.760 に答える
1

Linux では、リソースは通常、プロセスの終了時に解放されます。Linux がプロセスの終了を処理する方法については、http: //www.informit.com/articles/article.aspx?p=370047&seqNum=4を参照してください。

また、メモリが極端に少ない状況で作動する OOM キラーもあります。埋め込み Android の世界で起こっていることがわかっていますが、これについてはまだ詳しく把握していません。

于 2012-10-04T04:48:35.690 に答える