オペレーティングシステムが子プロセスに伝える「利用可能なメモリ」

オペレーティングシステムが子プロセスに伝える「利用可能なメモリ」

オペレーティング システムがどのようにして子プロセスに使用可能なメモリの量を知らせるのか疑問に思っています。

コンピュータ全体に 1GB の RAM メモリが組み込まれているとします。オペレーティング システムが実行され、100MB を使用します (オペレーティング システムが実際にどれだけ使用するかはわかりません)。したがって、900MB が残ります。

次に、10 個のプログラムを実行します。各プログラムは 10 個の子プロセスを作成します。問題は、これらの親プロセスと子プロセスが、使用可能なメモリの合計として何を認識するかです。

質問の 2 番目の部分では、もう少し複雑になりますが、アプリケーションがしばらく実行されていて、現在コンピューターで 500 MB が使用可能であるとします (オペレーティング システムが 100 MB 多く使用し、アプリケーションが 300 MB 多く使用して、この 500 MB のレベルに達したとします)。ここでの質問は、この時点でこれらの親プロセスと子プロセスが使用可能なメモリとして何を見ているかです。以前と同じか、または異なるか、どのように異なるか。

質問の理由は、私が読んだことがあるからです仮想メモリどの州:

仮想メモリ「特定のマシンで実際に利用可能なストレージ リソースの理想的な抽象化」を提供し、「ユーザーに非常に大きな (メイン) メモリがあるという錯覚を生み出す」技術です。

つまり、基本的に、ケース(1)の各プロセスには、「使用可能なメモリは1GBあります」または「使用可能なメモリは900MBあります」と通知されるようです。合計コンピュータ全体、または合計 - オペレーティング システムの使用状況。

すると、ケース (2) では、「1GB 使用可能」、「900MB 使用可能」、「600MB 使用可能」、「500MB 使用可能」のいずれかが表示されます。同じ状況ですが、何が表示されるかわかりません。

また、これらの値と異なる可能性もあります。オペレーティングシステムは、100 の子プロセスごとに利用可能なメモリを概算し、均等に分割することもできます。したがって、コンピュータに 500MB が残っている場合、各プロセスに「500 / 100 == 5MB の空き容量があります」と通知されます。しかし、この場合、1 つのプロセスが 5MB を使い切って、まだ 495MB が残っている場合、そのプロセスがこれを使い始めてもよいかどうか疑問に思い、利用可能な空き容量の新しい数値を通知されます。これが、これが通常の方法ではないと思う理由です。むしろ、OS が次のように通知するようです。おそらくコンピュータで利用できるもの全体として(つまり 1GB)。

また、常に「1GB」と表示される理由は、単一のプロセスがどれだけのメモリを使用しているかを判断する方法があるかどうか(またはオペレーティングシステムがどれだけのメモリを使用しているかを知っているかどうか)がわからないからです。OSがする自分自身がどれだけ使用しているかがわかっている場合は、900MB と報告されるようです。

混乱を招くもう 1 つの要因は、メモリ使用量が常に変化し、OS が各プロセスに合計メモリ (使用メモリ) を通知する場合、より多くのメモリにアクセスしようとすると、使用可能なメモリの量を常に確認する必要があることです。つまり、プログラムの起動時にメモリ使用量をキャッシュすることはできません。数時間アイドル状態になっているプログラムは、「コンピューター上」のメモリが 100 MB の状態で起動しますが、その後、再度確認すると、「ああ、5 MB しか使用できない」という状況になることがあります。何らかの理由で、これは望ましくない動作のように思えますが、よくわかりません。

OS が子プロセスにさまざまな時点で使用可能なメモリの量を伝える方法を一般的に理解するための助言があれば助かります。ありがとうございます。

答え1

OS は空きメモリについてプログラムに何も「伝え」ません。

すべてのプログラムは、独自の仮想メモリ領域で動作し、そこから(それが認識している)メモリ全体にアクセスします。潜在的メモリ アドレス空間は許容されます。32 ビット プロセスの場合、「メモリ」として認識されるのは、アドレス指定可能なメモリの 4 GB 全体ですが、64 ビットの場合、その空間ははるかに大きくなります。プロセスはその領域からメモリを割り当てることができます。その後、オペレーティング システムに、そのアドレス空間の領域を物理メモリでバックアップして、読み取りと書き込みを可能にする必要があることを伝えますが、プログラムは (理論上) 必要なだけのメモリを持ちます。

RAM が 1GB しかないシステムでは、物理メモリがいっぱいになると、オペレーティング システムはデータをスワップ ファイルまたはパーティションにプッシュし始めます。これは、メモリがページ アウトされている実際のプロセスが関与することなく実行されます。プロセスがページ アウトされたメモリにアクセスしようとすると、オペレーティング システムはプロセスを停止し、データをディスクから引き出してプロセスを再開します。

プログラムはクエリ空き物理 RAM の容量は、メモリ不足の状況でプログラムが自らを制限できるようにするために設定されていますが、物理 RAM とスワップ領域が不足しない限り、オペレーティング システムによって人為的に制限されることはありません。物理 RAM とスワップ領域が不足すると、プログラムはメモリを割り当てようとしたときに単にエラーを受け取ります。

答え2

最新の OS で実行することの素晴らしい点の 1 つは、アプリケーションがシステム内の RAM の量や使用可能な量を知る必要がないことです。実際、ほとんどのアプリケーションは、RAM の詳細、CPU のコア数、物理ドライブのサイズと数、コンピューターがネットワークまたはインターネットに接続されているかどうかなど、さまざまなことをまったく知りません。これは当然のことです。OS はこのように使用されるように設計されています。

OS は、ハードウェアに依存しない標準の仮想化環境をアプリケーションに提供します。アプリケーションは、RAM に直接アクセスするのではなく、RAM のサイズに依存しない仮想アドレス空間のみにアクセスします。アプリケーションにとって、メモリとはそういうものです。RAM は、パフォーマンスの最適化 (現在のテクノロジでは必須) と実装の詳細にすぎません。アプリケーション コードとデータの一部は、RAM、ページ ファイル、または元のファイルにあります。これは、アプリケーションのニーズとリソースの可用性に応じて変更できます。これらの詳細は OS によって管理され、アプリケーションからは見えません。アプリケーションは、たとえ探しても見つけることができません。

この情報を必要とするアプリケーションでは、OS からハードウェアの詳細を要求できますが、そうするアプリケーションはほとんどありません。ほとんどの場合、この情報を必要とするのはシステム ユーティリティだけです。ほとんどのアプリケーションでは、平均的なドライバーが点火時期や燃料混合について知る必要があるのと同じくらい、この情報を必要としません。

これらはすべて良いことです。つまり、アプリケーション開発者は、アプリケーションが実行されるハードウェアの煩雑な詳細に対処することなく、アプリケーションの要件に時間を費やすことができます。これが OS の目的です。つまり、4 MB の RAM を搭載した Windows 95 用に適切に作成されたアプリケーションは、数 GB の RAM を搭載した最新の Windows 10 システムで実行できます。アプリケーションは同じように動作し、違いを認識しません。すべてのアプリケーションがそれほど適切に作成されているわけではありません。もちろん、最新のシステムはパフォーマンスが向上し、ユーザーに多くの機能を提供しますが、アプリケーションはそれをまったく認識していません。

これは OS の設計者や開発者にとって多大な作業を意味しますが、何百万ものユーザーがその恩恵を受けます。

関連情報