短くするために、アクティブでワイヤードのメモリが使用されており、メモリを解放するためにスワップアウトすることはできません。一方で、非アクティブが適切にスワップアウトすることができますが、まだ所有している、これは頻繁にメモリを使用しますが、まだ使用されていないので、プロセスまたはカーネルによって(解放されません)。
新しいものは、スワップデバイスに書き込む必要があるダーティメモリページのリストであるランドリーです。ダーティメモリをスワップする必要があるかどうかにかかわらず、それらは非アクティブなキューに戻されます。
ワイヤードメモリは、安全のため(カーネルの場合)、またはユーザーランドプロセスの最適化(ZFSなど)のために、スワップされることは想定されていません。有線メモリはファイルシステムのキャッシュに使用され、カーネルによって解放される場合があります。少なくともZFSの場合、これはほとんど空きメモリと見なすことができます。
空きメモリは間違いなく無料です。
すでにスワップアウトされており、再割り当てが可能な場合にのみキャッシュされるため、キャッシュ(現在は非推奨、おそらく非推奨)を解放する準備ができています。
バッファは、ほとんどのファイルシステム(UFS、FATなど)でキャッシュとして使用され、ファイルシステムで使用されるメモリの量です。それはactice、inactive、またはwiredのいずれかです。
ARC(Adaptive Replacement Cache)はZFSによって使用されるキャッシュであり、必要なときに解放できるメモリです。
メモリに関するFreeBSD Wikiから
メモリクラス
アクティブ
- ユーザーランドによって「アクティブに」(最近)参照されているページが含まれています
- クリーンページとダーティページが混在しています
- ページはページデーモンによって定期的にスキャンされます(各ページはvm.pageout_update_period秒ごとに1回アクセスされます)
- スキャンは、最後のスキャン以降にページが参照されているかどうかを確認します
- 参照を見ずに十分なスキャンが完了すると、ページは非アクティブなキューに移動されます
- 疑似LRUを実装します
非活性
- アクティブなキューから期限切れになったページが含まれています
- バッファキャッシュから削除されたページが含まれます
- クリーンページとダーティページが混在しています
- メモリが不足している場合、ページはページデーモン(キューの先頭から開始)によってスキャンされます。
- 参照されたページは、アクティブなキューまたは非アクティブなキューの末尾に戻されます
- ダーティなページはランドリーキューの末尾に移動されます
- 参照されていないクリーンなページは解放され、すぐに再利用できます
- セカンドチャンスLRUを実装
ランドリー
- ダーティで非アクティブなページを管理するためのキュー。再利用する前にクリーンアップ(「ロンダー」)する必要があります。
- ページデーモンではなく、独立したスレッドであるランドリースレッドによって管理されます。
- ランドリースレッドは、非アクティブなキューとランドリーキューのバランスをとるために少数のページを洗濯します
- ロンダリングの頻度は以下に依存します。
- ページデーモンが解放しているクリーンページの数。フリーの数が多いほど、洗濯の頻度が高くなります
- 非アクティブなキューに対するランドリーキューのサイズ。ランドリーキューが増えている場合は、より頻繁に洗濯します
- ページはランドリースレッドによってスキャンされます(キューの先頭から開始)。
- 参照されたページは、アクティブキューまたはランドリーキューの末尾に戻されます
- ダーティページは洗浄され、非アクティブなキューの先頭近くに移動されます
自由
有線
- 非ページング可能メモリ:所有者が明示的に解放するまで解放できません
- ユーザーランドのメモリはmlock(2)によって配線できます(システムおよびユーザーごとの制限に従う)
- カーネルメモリアロケータが有線メモリを返す
- ARCとバッファキャッシュの内容は有線です
- 一部のメモリは永続的に配線され、決して解放されません(たとえば、カーネルファイル自体)
FreeBSDオペレーティングシステムの章6.12ページ置換の設計と実装から(これ以上完全に正確ではありませんが、古い質問の参照用にここにあります):
カーネルはメインメモリを5つのリストに分割します。
- 有線:有線ページはメモリ内でロックされており、ページアウトすることはできません。通常、これらのページはカーネルまたは物理メモリページャーによって使用されているか、mlockでロックされています。さらに、ロードされた(つまり、スワップアウトされていない)プロセスのスレッドスタックを保持するために使用されているすべてのページもワイヤリングされます。
- アクティブ:アクティブページは、仮想メモリの1つ以上の領域で使用されています。カーネルはそれらをページアウトすることができますが、そうすることで、アクティブなプロセスがそれらを再びフォールトさせる可能性があります。
- 非アクティブ:非アクティブなページはダーティであり、コンテンツがまだ認識されている可能性がありますが、通常はアクティブな領域の一部ではありません。ページのコンテンツがダーティである場合、ページを再利用する前に、コンテンツをバッキングストアに書き込む必要があります。ページがクリーンアップされると、キャッシュリストに移動されます。システムのメモリが不足すると、ページアウトデーモンは、実際に使用されていないページを見つけるために、アクティブページを非アクティブリストに移動しようとする場合があります。アクティブリストから非アクティブリストに移動するページを選択するためにページアウトデーモンが使用する選択基準については、このセクションで後述します。空きメモリとキャッシュのリストが低くなると、ページアウトデーモンは非アクティブリストを走査して、キャッシュと空きページをさらに作成します。
- キャッシュ:キャッシュページにはまだ認識されているコンテンツがありますが、マッピングの一部ではありません。それらがアクティブ領域にフォールトされている場合、それらはマッピングの一部ではありません。アクティブな領域で障害が発生した場合、それらはキャッシュリストからアクティブリストに移動されます。それらが読み取りまたは書き込みに使用される場合、それらは最初にキャッシュリストからバッファキャッシュに移動され、最終的に非アクティブリストに解放されます。mlockシステムコールは、キャッシュリストからページを再生し、それをワイヤリングできます。キャッシュリストのページは、ページインされたために変更されていないか、バッキングストアに書き込まれているためにダーティではないことを除いて、非アクティブページに似ています。それらは、ページが必要なときに新しい使用を要求できます。
- 無料:無料のページには有用なコンテンツがなく、新しいページフォルト要求を満たすために使用されます。
元の質問に答えるには
FreeBSDカーネルは、必要に応じて、非アクティブ、キャッシュ、およびバッファのプールからアクティブまたは有線にスペースを自動的に割り当てることを訂正しますか?
アクティブなページは、しばらく使用されなかった場合、非アクティブになる可能性があります。カーネルが非アクティブなページをスワップアウトすると、このページはキャッシュリストに移動されます。キャッシュリストのページは、プロセスの仮想マッピングの一部ではありませんが、アクティブまたは有線として簡単に再利用できます。または、バッファキャッシュとしてのI / Oに必要な場合。
有線メモリをメインメモリからスワップアウトすることはできません。プロセスによって配線されている場合、再びアクティブなメモリmunlock
になるためには、呼び出しによって配線を解除する必要があります。
アクティブ、非アクティブ、および有線のメモリは、プロセスまたはカーネルによって解放され、空きリストに追加されます。
Inactive
、Wired
、Cache
およびBuffers
にプールActive
またはWired
必要に応じて?」私が尋ねることを意図しながら、「アム私はFreeBSDカーネルから自動的に割り当てスペース正しいInactive
、Cache
とBuffers
プールがへActive
たりWired
、必要に応じて?」。最初の質問を更新しました。だから、一言で言えば、FreeBSDの中に使用されるメモリがあるWired
+Active
とそれら二つのプールは、メモリの追加量を必要とする場合、これはから取られInacative
、Cached
、Buffers
またはFree
プール?