ホームページ > 記事 > システムチュートリアル > もうメモリの問題を心配する必要はありません - Linux システムのメモリ管理の概要
コンピュータの発展に伴い、ソフトウェア アプリケーションの複雑さとデータ量は増加しており、システム メモリの要件もますます高くなっています。 Linux システム管理者は、メモリ リソースを適切に管理および割り当てる方法を理解することが不可欠です。この記事では、Linux システムのメモリ管理の基礎知識を紹介します。
初期のプログラムは物理アドレス上で直接実行されていたため、プログラムに必要なスペースがマシンの物理メモリを超えることはなく、問題はありませんでしたが、実際のシナリオでは複数のタスクが存在します。プロセスの場合、この種の物理アドレスがプロセスごとに予約されることは信頼できません。
例: 3 つのプログラム a、b、c があり、a には 10M、b には 100M、c には 20M が必要な場合、合計メモリは 120M になります。前の割り当て方法によれば、最初の 10M が割り当てられます。 a に 10M ~ 110M が b に与えられます。システムには 10M が残っていますが、c には 20M が必要です。明らかに、c には残りのメモリが十分ではありません。何をするか?
メモリ管理が必要な理由:
1. 効率の問題
プログラム c の実行中にプログラム b のデータをディスクに書き込み、プログラム b の実行時にディスクからデータを書き戻すことを考えるかもしれません。言うまでもなく、これでは並列実行のニーズを満たすことができません。プログラム b および c. 頻繁な IO 操作によって引き起こされる時間のかかる問題も容認できません。
2. プロセス アドレス分離の問題
効率の問題に加えて、プロセス用に予約されたスペースは、他のプロセスからアクセスする必要がある場合にクラッシュします。たとえば、プロセス a がアクセスする空間は最初の 10M ですが、プログラム a に 10 ~ 110M にアクセスするコードがあると、プログラム b がクラッシュする可能性があるため、プロセスのアドレス空間をプロセスから分離する必要があります。お互い。
3.移転問題
実際のシナリオでは、割り当てられたメモリで 1 つのタスクを実行することは不可能です。複数のタスクが並行して実行されている場合、メモリの解放を動的に適用する際に、他のプロセスのアドレスを適用することができます。このとき、新しい住所に移転する必要がある。
メモリ管理とは、上記の 3 つの問題を解決する方法を見つけることに他なりません。メモリの使用効率を向上するにはどうすればよいでしょうか?プロセスのアドレス空間を分離するにはどうすればよいですか?プログラムの実行中に再配置の問題を解決するにはどうすればよいですか?
メモリ管理が仮想アドレスから物理アドレスにマッピングされる方法:
仮想アドレスから物理アドレスへのメモリ管理マッピングのプロセスは、上記の 3 つの問題を解決するプロセスでもあります。メモリ管理では、セグメンテーション メカニズムとページング メカニズムを使用して、上記 3 つの問題をそれぞれ解決します。おおよそのプロセスは次のとおりです。
セグメンテーションのメカニズム:
プログラムがセグメントに分割され、セグメント全体が任意の位置に移動される限り、セグメント内のアドレスはセグメント ベース アドレスに対して変化しません。セグメント ベース アドレスが何であっても、セグメントが存在する限り、セグメント内のアドレスは変化しません。オフセットアドレスが与えられると、CPU は正しい命令にアクセスできます。したがって、ユーザプログラムをロードするときは、セグメント全体の内容を新しい場所にコピーし、セグメントベースアドレスレジスタのアドレスをそのアドレスに変更するだけで、セグメント内オフセットアドレスを使用するため、プログラムを正確に実行できます。プログラム内では、新しいセグメント ベース アドレスに対して、オフセット アドレスの内容は同じままです。セグメンテーション メカニズムにより、プロセス間の分離と再配置の問題が解決されることがわかります。このアクションはハードウェアで実行されますが、一部のハードウェアにはセグメンテーション メカニズムがありません。クロスプラットフォームとして、Linux はより汎用性の高いページング メカニズムを使用して、リニア アドレスから仮想アドレス、物理アドレスへの変換を解決します。
ページングメカニズム:
「CPU はどのようにメモリにアクセスしますか?」を参照してください。 》 1 レベルのページ テーブルの概念を理解する. 32 ビットと 64 ビットとの互換性を保つために、Linux は通常、4 レベルのページ テーブル、ページ グローバル ディレクトリ、ページ上位ディレクトリ、ページ中間ディレクトリ、ページ テーブルを使用します。 ##Linux が 4 レベルのページ テーブルを使用してリニア アドレス (仮想アドレス) を物理アドレスに変換する方法については詳しく説明しません。プロセスが切り替わると、task_struct に従って mm_struct 内の pgd フィールドを見つけ、新しいプロセスのページ グローバル ディレクトリを取得して、それを CR3 レジスタに書き込み、ページの切り替えを完了します。
mmu ページングとアドレス指定のプロセスを実際に見てみましょう:
コード:
仮想アドレス ffff99b488d48000 に対応する物理アドレスは 80000000c8d48000 であることがわかります。このプロセスは mmu のプロセスでもあります。
この記事の導入を通じて、メモリ パーティション、仮想メモリ、スワップ領域などを含む、Linux システム メモリ管理の基本的な知識を学びました。実際の作業では、メモリを正しく管理することでシステムの安定性とパフォーマンスが向上し、メモリの問題による予期せぬ障害を回避できます。この記事での紹介が、Linux システムのメモリ管理の原理と方法をより深く理解し、メモリ管理のさまざまな問題に簡単に対処できるようになることを願っています。
以上がもうメモリの問題を心配する必要はありません - Linux システムのメモリ管理の概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。