プロセスを強制終了しても、メモリ管理にとって悪いと考えられますか?


18

ですから、メモリ管理について上司と少し話し合いをしています。

プロセスを強制終了してもメモリの割り当てを解除できないと言われました。それはまだ事実ですか、それとも数年前ですか?

ここでは、WindowsとOS Xの両方について話します。


4
有効な質問; 再開する投票。OPは、投機や議論ではなく、OS(この場合は2つのOS)の動作に関する特定の情報を要求しました。
JRobert

うわー、この質問がこんなに早く注目されるとは思わなかった。
ジェフ

回答:


7

私がこのようなことを学んでから長い時間が経ちましたが、ここに行きます。

オペレーティングシステムがプロセスを起動すると、仮想メモリテーブルからページを割り当てます。オペレーティングシステムは、仮想メモリテーブルから実メモリまたはディスク上のスワップスペースへのマップを管理します。プロセスが強制終了されると、OSはCPUサイクルを停止するだけではありません。いくつかのクリーンアップ項目を実行します。その1つは、すべてのメモリページを空きとしてマークすることです。これにより、他のアプリケーションで再利用できます。OSはおそらく、プロセスが持っていたリソースハンドルもクリーンアップし、ファイル、ネットワーク接続、プロセス間パイプなどを自動的に閉じます。このプロセスは完全にOSの制御下にあり、プロセスがどのように停止したとしても、これらの手順は実行されます。

これらはすべてオペレーティングシステムプロセスに適用されることに注意してください。何らかの形の仮想マシンがあり、複数の仮想プロセスを一度に実行している場合、VMはそれらの仮想プロセスの割り当てと割り当て解除の方法を決定します。ただし、OSからは、1つのプロセスのように見えます。したがって、この1つのケースでは、複数のプロセスを実行するVMがあり、VM内でそれらの1つを強制終了した場合、ホストOSですぐにメモリを取り戻すことはできません。ただし、VMに戻すことができます。ただし、オペレーティングシステム内でVMを強制終了すると、OSはVMを強制終了(間接的にVMのプロセスを強制終了)し、すべてのメモリを解放します(ガベージコレクターfree()を経由する必要はありません) 、削除、その他)。

非常に投機的:

.NETが同じVM上で複数の.NETアプリを備えた仮想マシンとして実行される場合、.NETはGCを実行するまで、まだGCdではないメモリを保持でき、Windowsは.NETがそうであると考えるでしょう実際よりも多く使用しています。(そして、MSが本当に滑らかだった場合、Windowsはメモリ不足の状況で.NETにGCに伝えることができますが、それはディスクスワップスペースの目的なのでほとんど意味がありません。)

.NETがそのように機能する場合、OSはそれをOSの目的のための1つのプロセスと見なします。これは、何を保持し、何を破棄するかを決定する責任があります。メモリの割り当て解除を開始します。その時点で、MSが.NET専用の特別なAPIを構築し、.NETプロセスがWindowsプロセスのように見えるようになりますが、そうでない場合は考えられます。それは本当にです。間違ったプロセスを見ているだけです。

.NETについては、実際にそのように機能するとは言い切れません。Java VMは確かにそうではありません。

憶測の終わり。

編集:メモリ管理に悪いプロセスを殺すことに関する限り、同じプールから割り当てるために複数のプロセスが必要です(つまり、実際のプロセスよりもスレッドに似ています)、プロセスが解放された後にメモリが解放されない殺された。私の知る限り、仮想メモリとプリエンプティブマルチタスクは通常一緒に実装されていたため、これにはほとんど協調型マルチタスクシステムが必要になります(VMにより、プロセスを相互に分離し、相互のメモリを使用しないようにできます)。仮想メモリがあると、OSレベルでのプロセス後のクリーンアップが簡単になります。すべてのページをプロセスのプールから空きプールに移動するだけです。


素晴らしい答え; あなたはほんの数秒先だったので、まだ私のものを投稿しました。:)
サイモンリヒター

8

私の経験に問題はありません、殺してください。

たとえば、4 GBのRAMがあり、そのうち3 GBがゲームで使用されていて、ゲームプロセスを強制終了すると、ゲームを問題なく再起動でき、プロセス上に3 GBのRAMが再び搭載されます。


同意して、「クリーンアップ」できないことは正しいように聞こえますが、Sirexが述べたように問題であることは見ていません。NTでは、これらのプロセスは分離されるはずでしたが、win98に戻っても問題ではないようでした。あなたがそれを殺すことができれば、それの大部分はなくなるでしょう。論理的には、システムを閉じようとするか、最初にハードに閉じてから、最後のチャンスとして実際に強制終了させます。
サイコギーク

8

質問タグにリストされているオペレーティングシステム(WindowsおよびOS X)は仮想メモリを実装します。各プロセスには独自のアドレススペースが与えられ、OSによって物理メモリにマッピングされます。これらのマッピングテーブルは、プロセスが終了したときにメモリ割り当てをクリーンアップするために使用されるため、メモリは完全に解放されます。物理ページは複数のプロセス間で共有される場合があります。その場合、ユーザーがなくなるとページは解放されます。

通常、ファイルハンドルなどの他のリソースは、ケイパビリティの形式でプロセスに与えられます。プロセスは、リソースのハンドルを受け取り、適切に定義されたアクセス関数を通じてそれを操作します。OSは、ハンドル値から機能を提供するカーネル内オブジェクトへのテーブルマッピングを保持します。繰り返しますが、このテーブルは、プロセスが終了したときのクリーンアップに使用できます。

それらを作成したプロセスを生き残る特別なリソースがあります。たとえば、プロセス間通信で使用できる永続的な名前付き共有メモリ割り当てを作成することができます。OSがまだ必要かどうかを判断できないため、これらはほとんど使用されません。

他のオペレーティングシステムでは、明確なプロセス分離がない場合があります。これにより、個々のアプリケーションにクリーンアップの負担がかかります。

プロセスを強制的に閉じると、クリーンアップする機会を与えずにプロセスが終了します。OSにすべてのリソースの完全なリストがある場合、これは悪影響を及ぼしません。


5

それは、メモリ管理が広く実装される前の日にありました。現在、見逃す可能性のある唯一のメモリは、ドライバーやカーネルモジュールが使用するメモリであり、それらは殺されないかゾンビのままですが、それは本当にピーナッツです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.