仮想メモリは、コンピュータの物理メモリの一部です。仮想メモリはコンピュータ システムのメモリ管理テクノロジであり、通常は複数の物理メモリ フラグメントに分割され、一部は必要に応じてデータ交換のために外部ディスク ストレージに一時的に保存されます。
#オペレーティング システムには、仮想メモリと物理メモリの概念があります。仮想メモリの概念がなかった昔、プログラムはアドレス指定に物理アドレスを使用していました。プログラムがアドレス指定できる範囲は、CPU のアドレス線の数に応じて制限されます。たとえば、32 ビット プラットフォームでは、アドレス範囲は 2^32、つまり 4G です。仮想メモリがなく、プロセスが開始されるたびに 4G の物理メモリが与えられると、多くの問題が発生する可能性があります:
物理メモリが限られているためです。 , 実行するプロセスが複数ある場合、4Gのメモリを割り当てる必要がありますが、明らかにメモリが小さければすぐに割り当てられるため、リソースが割り当てられていないプロセスは待つことしかできません。プロセスの実行が終了すると、待機中のプロセスがメモリにロードされます。この頻繁なメモリのロード操作は非常に非効率です
命令は物理メモリに直接アクセスするため、プロセスは他のプロセスのデータを変更したり、カーネル アドレスのデータを変更したりする可能性があります。スペースは見たくないものです。
メモリはランダムに割り当てられるため、プログラムが実行されるアドレスも正しくありません。
そこで、上記で発生するさまざまな問題に対応して登場したのが、仮想メモリです。
プロセスの実行中に、4G の仮想メモリが取得されます。この仮想メモリについて考えてみましょう。各プロセスは自分に 4G のスペースがあると考えています。これは各プロセスが考えているだけです。しかし、実際には、仮想メモリに対応する物理メモリは少量の物理メモリにしか対応していない可能性があります。実際には、 , メモリの使用量は、物理メモリの使用量に対応します。
プロセスによって取得される 4G 仮想メモリは連続したアドレス空間です (これはプロセスが認識しているだけです)。しかし実際には、通常は複数の物理メモリ フラグメントに分割されており、一部は外部ディスクに保存されます。 . メモリ上では、必要に応じてデータのやり取りが行われます。
プロセスがアドレスへのアクセスを開始すると、次のプロセスが実行される場合があります。
アドレス空間内のアドレスにアクセスする必要があるたびに、アドレスを変換する 実際の物理メモリ アドレスについては
各プロセスが作成されると、カーネルは 4G の仮想メモリをプロセスに割り当てます。プロセスが実行を開始していないとき、これは単なるメモリ レイアウトです。実際、仮想メモリ内の対応する位置にあるプログラム データとコード (.text.data セグメントなど) は、すぐに物理メモリにコピーされるわけではなく、仮想メモリとディスク ファイル (メモリと呼ばれる) の間のマッピングにすぎません。マッピング)。この時点では、データとコードはまだディスク上にあります。対応するプログラムが実行されると、プロセスはページ テーブルを検索し、ページ テーブル内のアドレスが物理メモリではなくディスク上に格納されていることが判明するため、ページ フォールト例外が発生し、ディスク上のデータがコピーされます。物理メモリに。
また、プロセスの実行中に、malloc を通じてメモリが動的に割り当てられると、仮想メモリのみが割り当てられ、この仮想メモリに対応するページ テーブル エントリがそれに応じて設定されます。 this データが取得されると、ページ フォールト例外がトリガーされます。
仮想空間はディスク領域にマッピングされていると考えることができます (実際には、仮想空間とディスク領域の間のマッピング関係を確立するために使用される mmap を通じて、必要に応じてディスク領域にもマッピングされます)。
仮想メモリ機構を利用する利点
#各プロセスのメモリ空間は一貫していて固定されているため (32 ビット プラットフォームでは 4G) ), したがって、実行可能ファイルをリンクするとき、リンカはデータの最終的な実際のメモリ アドレスを気にせずにメモリ アドレスを設定できます。これは、マッピング関係を完了するためにカーネルに任されます
PHP 中国語 Web サイトをご覧ください。
以上が仮想メモリはコンピュータのメモリの一部ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。