メモリは、オペレーティング システムにとって非常に重要なリソースです。オペレーティング システムがプログラムを実行するには、まずプログラム コード セグメントの命令とデータ セグメントの変数をハード ディスクからメモリにロードしてから実行する必要があります。次の図に示すように: しかし、メモリ リソースには限りがあります。システム内で実行されるプロセスが増えるにつれて、システム内で使用可能なメモリは少なくなります。では、利用可能なメモリが少ない場合、Linux カーネルはどのように状況を処理するのでしょうか? この記事では、使用可能なメモリが不足している状況を Linux カーネルがどのように処理するかについて説明します。 1. メモリ不足の対処方法システムの使用可能なメモリが不足し、プロセスがメモリを要求し続けると何が起こるか考えてみましょう。 システムの使用可能なメモリが不足している場合、カーネルはメモリをリサイクルして、プロセスに十分なメモリが使用可能であることを確認します。メモリのリサイクルには主に次の手順が含まれます。
メモリを再利用する方法は 3 つあるため、この記事ではスワップ メカニズムを分析対象として重点的に取り上げ、メモリが不足したときにカーネルがどのようにメモリを再利用するかを紹介します。 2. スワップメカニズムの原理スワップ メカニズムの実装を分析する前に、まずスワップ メカニズムの原理を紹介します。 この記事では Linux-2.6.23 カーネルを使用します。 スワップという言葉は交換を意味します。名前が示すように、特定のプロセスによって占有されているメモリをハードディスクに交換 (書き込み) し、その後、オペレーティング システムがより多くのメモリを使用できるようにメモリをオペレーティング システムに解放することを意味します。次の図に示すように: スワップ メカニズムの本質は、プロセスによって占有されているメモリをハード ディスクに書き込み、その後メモリを解放することだからです。次に、どのプロセスのメモリをハードディスクにスワップするかが問題になります。 各プロセスは、占有しているメモリがハードディスクにスワップされることを望みません。メモリがハードディスクにスワップされた後、プロセスがこのメモリを使用する場合、そのメモリを引き続き使用する前に、まずハードディスクからメモリにロードする必要があるため、プロセスのパフォーマンスが大幅に低下します。このため、カーネルは、プロセスのパフォーマンスへの影響を最小限に抑えながら、ディスクにスワップするメモリを選択するための最適なソリューションを提供する必要があります。 プロセスのメモリ空間は、コード セグメント、データ セグメント、mmap セグメント、ヒープ セグメント、スタック セグメントなどの複数のセグメントに分割されているためです。では、メモリのどのセグメントがハードディスクにスワップされるのでしょうか? 答えは、メモリのすべてのセグメントをハードディスクにスワップできるということです。ただし、コード セグメントや mmap セグメントなど、ファイルにマップされているメモリ領域の場合は、データをファイルに書き戻すだけで済みます (コード セグメントの内容は変更されないため、書き戻す必要はありません)。 データ セグメント、ヒープ セグメント、スタック セグメント内のメモリ ページはファイルにマップされないため (匿名メモリ ページと呼ばれる)、カーネルはこれらのメモリ ページのデータを格納するためのファイル (またはハード ディスク パーティション) を提供する必要があります。このファイル (またはハード ディスク パーティション) はスワップ パーティションと呼ばれます。 上記の分析から、2 つの重要なメッセージを引き出すことができます。 匿名メモリ ページ: どのファイルにもマップされていないメモリ ページ。 スワップ パーティション: 匿名メモリ ページ データを格納するために使用されるファイルまたはハード ディスク パーティション。 以下では、主にカーネルがプロセスの匿名メモリ ページをスワップ パーティションに書き込み、システムのメモリが不足しているときにこれらの匿名メモリ ページをリサイクルする方法について説明します。 1. LRUメモリ削除アルゴリズム システム メモリが不足し、スワップ メカニズムがトリガーされた場合、カーネルはどの匿名メモリ ページをスワップ パーティションに書き込むように選択する必要がありますか? 一部の匿名メモリ ページがランダムに選択されてスワップ パーティションに書き込まれると、次の問題が発生する可能性があります。 プロセスの匿名メモリ ページをスワップ パーティションに書き込んだ後、プロセスはすぐにこのメモリ ページにアクセスするため、このメモリ ページをスワップ パーティションからメイン メモリに読み込む必要があります。これにより、システム負荷が増加するだけで、システムメモリ不足の問題は解決されません。 この問題を解決するために、Linux カーネルは LRU メモリ削除アルゴリズムを導入しました。Memcached または Redis を使用したことがある学生は、LRU アルゴリズムに精通しているはずです。システムのメモリが不足すると、Memcached と Redis はどちらも LRU アルゴリズムを使用してメモリを削除します。 LRU (Least Recently Used) は、中国語では「最も最近使われていない」と翻訳されます。その原理は、メモリが不足している場合、システム内で最も使用されていないメモリが削除されるため、システム パフォーマンスの低下が最小限に抑えられるというものです。 LRU アルゴリズムを実装するために、カーネルは active_list と inactive_list という 2 つの二重リンク リストを維持します。以下では、これら 2 つのリンク リストの機能について説明します。
Linux カーネルでは、各メモリ ゾーンは active_list と inactive_list を維持します。メモリ領域は、メモリ管理におけるオブジェクトです。より明確な説明のために、カーネル内にメモリ領域が 1 つだけあると仮定します。つまり、カーネル内には active_list と inactive_list が 1 つだけ維持されていると仮定します。次の図に示すように: さらに、各メモリ ページには PG_referenced フラグがあり、メモリ ページがアクセスされたかどうかを示します。このフラグは、メモリ回復プロセスで重要な役割を果たします。 プロセスが匿名メモリ ページを要求すると、カーネルはそのメモリ ページをアクティブ メモリ ページ リスト (active_list) に追加し、PG_referenced フラグを 0 に設定します。次の図に示すように: プロセスによって匿名メモリ ページがアクセスされると、メモリ ページが配置されている LRU リンク リストに応じて異なる操作が実行されます。
次の図は、上記の状況の流れを示しています。 システムのメモリが不足している場合は、メモリ削除プロセスが必要になります。メモリ ページ削除プロセスは、上記のプロセスと正反対です。次に、メモリ ページ削除プロセスを紹介します。 メモリが削除される場合、非アクティブなリンク リストからのみ削除できます。削除プロセスは次のとおりです。
上記のプロセスは、次の図に示すように、shrink_inactive_list 関数によって完了します。 さらに、アクティブなリンク リスト内のメモリ ページにも減少プロセスがあり、減少プロセスは次のとおりです。
上記のプロセスは、次の図に示すように、shrink_active_list 関数によって完了します。 2. LRUアルゴリズムの状態フロー 最後に、状態フロー図を使用して LRU アルゴリズムのプロセスを説明します。 結論この記事では、Linuxカーネルのメモリリサイクルプロセスで使用されるLRUアルゴリズムの原理を主に紹介しました。次の記事では、Linuxカーネルがメモリリサイクルをどのように実装しているかを紹介します。ご興味があれば、お楽しみに。 |
<<: 人工知能は私たちの言語を理解するのでしょうか?思っていたよりも強力だ
>>: 自動運転の倫理的ジレンマを解決する: 道徳規範を数式に変換する
近年、人工知能の倫理的問題についての議論が盛んに行われている。最近終了した中国コンピュータカンファレ...
西オーストラリア大学の研究者らは、交通渋滞を緩和するために設計された無人運転車が逆の効果をもたらして...
ラボガイド現在、公共の場や個人の応用場面に設置されている監視カメラの総数は1億7500万台を超えてい...
仮想現実ゲームの発展により、ゲームのプレイ方法や交流の仕方が急速に変化しています。仮想現実はゲームの...
香港のサウスチャイナ・モーニング・ポストが5月3日に報じたところによると、人工知能分野の世界的な競争...
4月8日、「上海デジタル変革リーディンググループオフィス」が主導し、上海スマートシティ発展研究所が...
投資管理会社でシステム開発エンジニアとして働いていたとき、定量金融で成功するには、数学、プログラミン...
この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...
YouTube は 11 月 16 日に、ユーザーがテキストを入力したりメロディーをハミングしたりす...
SymphonyAI のマーケティング責任者として、私は企業における人工知能 (AI) のあらゆるア...
[[327238]] Twitter社が永久に在宅勤務を行うと発表した後、ザッカーバーグ氏は今後5年...
クルーズ社の自動運転意思決定計画および制御部門の責任者であるブランドン・バッソ氏は、コロンビア大学で...