メモリを使うほど良いのでしょうか? —— Android(Linux)仮想メモリの簡単な概要

元のリンク:https://www.coolapk.com/…

— さまざまな投稿でよく「メモリを多く使うのは普通のことだ。メモリは使うためのものだ。なぜストリームライン作成にそんなに多くのメモリが残っているのか?」というコメントをよく目にします。 これが彼の発言です。 これらの主張は厳密さに欠けています。 以下では、あなた自身のイメージを伝えるために、より簡単な説明を試みます携帯電話メモリ管理(主に仮想記憶)基本的な理解はありますし、初心者のために書くのは初めてです一般向け科学もし間違いがあれば、コメント欄で指摘してください

—————境界線—————

注:この記事で言及されているすべての「メモリ」とは、一般的に「ランニングメモリ」、つまり「RAM」を指しており、ストレージスペースではありません!

—————境界線—————

まずは、いくつかの概念や専門用語を知りましょう

1. 仮想メモリ:

仮想メモリは、現代のオペレーティングシステムで一般的に用いられるメモリ管理の一種です技術現在、一般的に使われている方法はページベースの仮想メモリ管理で、通常はページ(4KB) メモリ割り当て、リサイクル、スワッピングを最小限の粒度で管理します。

2.SWAP:

SWAPは仮想メモリ技術の一部であり、ハードドライブのスペースを分割してメモリページを交換します。簡単に言えば、メモリからハードドライブへデータを移動させて物理メモリを解放するものです。 Windowsには「ページ内ファイル」という似た機能もあります。 しかしLinuxとは異なり、Windowsはページ付きファイルに大きく依存しており、それをオフにすると問題が発生します大きな問題詳細については、この記事の最後の追加章をご覧ください。

3.ZRAM:

ZRAMはSWAPの別の実装です。ハードディスク空間を使う代わりに、メモリ空間を直接スワップのページに分割し、LZ4やZSTDのような圧縮アルゴリズムを使ってメモリデータを圧縮し、物理メモリを解放します。

4.ZRAM Writeback

ZRAM WritebackはZRAMの拡張です。SWAPと同様に、メモリページを交換するためにハードドライブ空間にスワップファイルを作成します。違いは、ZRAMライトバックは圧縮されたメモリデータを交換する点です。 書き込み制御ロジックはカーネルではなくユーザー層で動作し、具体的な戦略はシステムベンダーによって決定されるため、本記事では詳しくは扱いません。

5. 直接リサイクルおよび非同期リサイクル

メモリ回収には2種類あります。非同期コレクションはバックグラウンドスレッド上で動作し、現在のプロセスには影響しません。パフォーマンスやスムーズさにはほとんど影響しませんが、収集速度は遅いです。 直接リクレイメーションは高速ですが、現在のプロセスをブロックし、ソフトウェアインターフェースが短時間(通常は非常に短時間)フリーズし、パフォーマンスや滑らかさに大きな影響を与えます。

—————境界線—————

まずはタイトルの質問に答えましょう:「使うメモリが多ければ多いほど良いのか?」 この発言は正しいのでしょうか? はい、でも完全にはそうではありません。

確かにメモリは使われますが、メモリはオペレーティングシステムやユーザーソフトウェアだけでなく、ファイルキャッシュも重要な要素です。ほとんどすべてのオペレーティングシステムにはファイルキャッシュの仕組みがあります。ハードドライブやフラッシュストレージから読み取ったファイルはメモリにキャッシュされるため、次回はハードドライブやフラッシュから読み取らずに直接ファイルキャッシュを呼び出すことで処理を早めましょう。 メモリが不足している場合、ファイルキャッシュを迅速に解放して割り当てることができ、迅速に回復されたメモリと空きメモリの両方をカーネルによって「利用可能なメモリ」として扱います。 しかし、システムのバックエンドインターフェースや各種ソフトウェア(例えばDEV Check)で見られるのは「空きメモリ」ではなく、カーネルやソフトウェア自身のアルゴリズムによって計算された「利用可能なメモリ」です。

写真に示すように、カーネルはmeに入っていますmiNFOでは「利用可能なメモリ」≠「空きメモリ」を区別します。「空きメモリ」とは、実際にはプロセスやファイルに占有されていない未割り当てメモリを指し、「利用可能メモリ」は割り当て可能なメモリを指します(そのサイズは主に、低水印以上のファイルキャッシュや空きメモリの割合、そして迅速に回復可能なメモリ項目によって決まります)

6688c8671d820c441abb2b04fb7b9daf0124e934

データソース:/proc/meminfo

ですので、システムのバックグラウンドや様々なアプリに多くのメモリが残っているのを見ても、それが完全に活用されているとは限りません。 代わりに、彼らはそれを効率化しました最適化私のような人のために、システム自身のメモリ使用量を減らし、より多くのメモリをユーザーに解放できるようにしようとしています応用これは「メモリを増やすのは普通のことだ。記憶は使うためのものだ」という見解と矛盾しません。

—————境界線—————

前進チュートリアル— メモリリサイクルおよびZRAM施策の管理:

所有ROOT以下のカーネルパラメータを変更すれば、メモリの回復やZRAM活動を制御できます。

1. vm.watermark_scale_factor:

メモリ水位ライン間の間隔を1~1000(総メモリサイズの0.01%から10%に相当)で調整できます。 値が低すぎると、しばしば直接リサイクルが発生しますラグ値が大きすぎるとメモリが無駄になります。100(総メモリの1%)に設定することが推奨されます。

カーネルは3本のウォーターマークラインを定義しています:min/low/high。空きメモリ(注:「利用可能なメモリ」ではなく「free memory」)が低ウォーターマークを下回ると、カーネルはkswapで非同期にメモリを回収(データをZRAM/SWAPにスワップし、ファイルキャッシュを回収)し、空きメモリがハイウォーターマークを超えるまで起動します。 アイドルメモリが最小水位を下回ると、直接回復がトリガーされます。 最小水位線の値は、総メモリサイズと計算vm.min_free_kbytesに基づいてカーネルによって算出されます。このパラメータを変更してデフォルト値を保持することは推奨されません。

2. vm.extra_free_kbytes:

追加の予約メモリは最小ウォーターマークと低ウォーターマークの間に一定の値を設定します。値が低すぎると頻繁に直接回収を引き起こし遅延が発生し、大きすぎるとメモリを無駄にします。総メモリサイズの1~2%(KB単位)に設定することが推奨されます。

3. vm.swappiness:

カーネルメモリが不足している場合(低い閾値以下)、スワップページとZRAM/SWAPおよび回復されたファイルキャッシュ間のバイアスは0~200、古いカーネルでは0~100の範囲です。 値が小さいほどファイルキャッシュを収集しやすく、値が大きいほどZRAM/SWAPを使う可能性が高くなります。

上記の核パラメータが利用可能ですSceneまた、ルート権限を使って以下のコマンドを実行して修正することもできます:

echo 100 >/proc/sys/vm/watermark_scale_factor

echo 131072 >/proc/sys/vm/extra_free_kbytes

echo 100 >/proc/sys/vm/swappiness

033b71c32ad792c6d350fc9a9eba667ccdba5b14

– バックエンドを増やしたい場合は、extra_free_kbytesやwatermark_scale_factorの価値を下げ、スワッピーネスの価値をやや高めることができます。

– より滑らかさを望む場合は、extra_free_kbytes値とwatermark_scale_factor値を上げつつ、スワップ性をよりバランスの取れた値を調整できます。

– 両方欲しいなら、より大きなメモリの電話を選びましょう

—————境界線—————

LMKとバックステージキリング:

Android 9以降、Googleは組み込みのLMKカーネルを放棄し、システムのデーモンとして動作するLMKDに切り替え始めました。したがって、バックグラウンドでのアプリキルやカーネル自体は、各メーカーのアプローチとはほとんど関係ありません構成LMKD/他の背景除去メカニズムを導入しました。 この件についてMIUILMKDの設定に加え、「バッテリーとパフォーマンス」と「フレームワークシステムフレームワーク」の両方にバックグラウンドキリングコードがあります。 メーカーが導入した追加のバックグラウンドキル機構を使いたくなく、LMKDを自分で設定したいなら、これは良い選択肢ですLSPosed「AppRetention」モジュールはベンダーのバックグラウンドエンドの削除メカニズムをブロックします。

9d81077744f85a683960c178d78a3f3519e465b8

次に、Googleのドキュメントに従ってLMKDを設定します:リンクを見る

0051b630293a33fa77802e7e31a72ca679f1a637

—————境界線—————

追加セクション — WindowsのページングファイルPagefile.sysおよび仮想メモリアドレス割り当てに関する追加知識:

Windowsは2段階のメモリ割り当て(予約+コミット)を使用し、コミットフェーズでは物理アドレス(物理メモリやページングファイル)のマッピングを確実に行うことが重要です。 ページングファイルはシステムの送信制限の一部であり、システムがサポート可能な仮想メモリの総量を直接決定します(Windowsタスクマネージャーのメモリカードページには「コミット済み」というデータ項目があり、スラッシュの左側はすべてのプログラムが要求したメモリサイズの合計、右側は仮想メモリの総容量で、値は = 物理メモリサイズ + ページングファイルサイズで、ページングファイルはシステムによって動的に分割されています)。

55fbb2ccf8dcaa9b5eacde40d4500ea06489ae2e

Windowsタスクマネージャーのメモリ情報

単純に、Windowsでプログラムが一定のメモリを許可すると、システムが対応する物理アドレスサイズをプログラムに割り当てると考えることができます。割り当て後は他のプログラムがこのメモリ空間を使えなくなり、プログラムが割り当てるメモリは一般的に実際に必要とするものより多くなっています。したがって、ページングファイルを閉じる際に物理メモリが大量に残っている場合でも、新しいプログラムを開くとメモリ不足が示されることがあります。 しかしLinuxにはこの問題はありません。Linuxは遅延割り当て戦略を採用しており、プロセスが実際にメモリにアクセスするときのみ物理メモリアドレスを割り当てます。プログラムが要求するメモリについては、Linuxが「実」仮想アドレスを割り当て、その上限は「vm.overcommit_memory」カーネルパラメータによって決まります。私たちが使うAndroidスマートフォンでは、仮想メモリ割り当ての制限は「overcommit_memory」です デフォルト値は1で、仮想メモリの制限を無視し、すべての物理メモリを割り当てることを可能にします。

SceneのSWAP管理ページでは、私のスマホのすべてのプロセスが最大208GBのメモリを要求しているのがわかります! しかし物理メモリは使い切られていなかったので、新しいソフトウェアを開くことはできました。

54adfd909d6eaf857d40dca9428b9f075a4a65ed

なぜWindowsがLinuxと同じか似た仕組みに変わらないのかはわかりません。Windowsがあまりにも歴史的な負担を背負っているからだと思います(WINの伝説的な互換性に相当します)。

#HyperOS##HyperOS2##玩机技巧#

© 著作権通知
THE END
気に入ったら、ぜひ応援の気持ちを示してください
グッドアップ1 シェア
解説 ソファをめぐって戦う

ログインしてコメントを残してください

    まだコメントはありません