プロセスが終了すると、Linuxはメモリ破損をどのように処理しますか?

プロセスが終了すると、Linuxはメモリ破損をどのように処理しますか?

スタックオーバーフローには、システムがメモリリークを処理する方法と、異常終了した場合に何が起こるのかを尋ねる質問がたくさんあります。例:

https://stackoverflow.com/questions/6727383/dynamically-allocation-memory-after-program-termination

https://stackoverflow.com/questions/10223677/when-a-program-terminates-what-happens-to-the-memory-allocation-using-malloc-that

https://stackoverflow.com/questions/2975831/is-leaked-memory-freed-up-when-the-program-exits

しかし、メモリの破損について尋ねられた記事は参照できません。 Linuxカーネルはメモリリークとメモリ破損を同じように扱いますか?プロセスが終了すると、破損したメモリセグメントが解放され、回収され、他のプロセスで使用しても安全ですか?

また、POSIX共有メモリ(/dev/shm)を使用するプロセスはどうですか?私が理解しているように、shm_unlinkによって削除されない限り、共有メモリはシステムから回収されないようです。 (http://man7.org/linux/man-pages/man7/shm_overview.7.html)これは、共有メモリセグメントが何らかの方法で破損した場合、システムを再起動するまでデフォルトでユーザーが壊れることを意味しますか?または、すべてのユーザープロセスが終了した後にユーザーが再起動せずにログオフすると、カーネルはshm_unlinkを介して共有メモリを自動的に消去しますか?

ありがとうございます!

ベストアンサー1

プロセスが終了すると、オペレーティングシステムはそのメモリを回復します。これは使用可能とマークされ、近いうちにメモリが必要なときに他のプロセスに割り当てられます。メモリは、プロセスに割り当てられる前に常に消去されます。

この過程でメモリ破損が発生しても問題はありません。メモリ破損の概念は、プロセスの実行に関連しています。これは、メモリの内容がプログラマが意図したものと異なることを意味します。プロセスが終了すると、この概念はもはや意味がありません。メモリリークの場合も同様です。プロセスが終了すると、すべてのメモリが回収されます。

共有メモリは単一のプロセスに属さないため、例外です。プロセスが終了すると、共有メモリへのプロセスハンドルのみが明示的に削除されるまで、共有メモリ自体がリサイクルされます。共有メモリオブジェクトは、ファイルシステムに接続されておらず、メモリにのみ存在するファイルであると考えてください。名前のない一時ファイルと同じです。

共有メモリを使用するプロセスは、終了する前にそれをクリーンアップする必要があります。好ましくは、プロセスが共有メモリを使用する場合、そのプロセスはスーパーバイザプロセスによって実行され、スーパーバイザプロセスはメインプロセスがクラッシュしたときに共有メモリ、一時ファイルなどのリソースをクリーンアップする必要があります。

おすすめ記事