ハードウェア設計またはソフトウェア設計に関係なく、キャッシングは高性能を達成するための一般的な手段です。 Linuxは、メモリ管理に関連したさまざまなキャッシュを使用します。
1。
バッファキャッシュ
:
バッファキャッシュには、ブロックデバイスで使用されるデータバッファが含まれています。これらのバッファには、デバイスから読み取られたデータブロック、またはデバイスに書き込まれたデータブロックが含まれています。バッファキャッシュはデバイス識別番号とブロックラベルでインデックス付けされているので、データブロックをすばやく見つけることができます。データがバッファキャッシュ内に見いだされる場合、システムは物理ブロックデバイス上で実際の読み出し動作を実行する必要はない。
カーネルは、書き込みを容易にするために、バッファごとに多くの情報を保持しています。この情報には、メモリ内のバッファが変更されたことを示す「ダーティ」ビットが含まれます。ディスクへの書き込み、バッファがディスクにフラッシュされるまでにメモリ内に存在していた時間を示すタイムスタンプも含まれます。バッファに関する情報はバッファヘッダに保持されているため、これらのデータ構造は、ユーザデータ自体のバッファとともに維持する必要があります。
バッファキャッシュのサイズはさまざまです。新しいバッファが必要であり、利用可能なバッファがない場合、ページは必要に応じて割り当てられます。前のセクションで見たように、空きメモリが不足すると、バッファは解放され、対応するページが繰り返し使用されます。
2。
Page Cache
Page Cacheは、データにアクセスするためにページI /O操作で使用されるディスクキャッシュです。ファイルシステムでは、read()、write()、およびmmap()システムコールが通常のファイルへのアクセスをページキャッシュを介して行うことがわかります。ページI / O操作はデータの全ページを転送することであるので、キャッシュに保持される情報単位は全ページである。ページには必ずしも物理的に隣接するディスクブロックではないデータが含まれているため、ページを識別するためにデバイス番号とブロック番号を使用することはできません。代わりに、ページキャッシュ内のページの識別は、ファイル内のインデックスとファイル内のオフセットによって達成されます。
ページキャッシュに関連する主な操作は3つあります。アクセスされているファイルの一部がキャッシュにないときにページを追加すること、キャッシュが大きくなりすぎるとページを削除すること、ファイルオフセットが配置されているページ。
3スワップキャッシュ
変更された(ダーティーな)ページだけがスワップファイルに保存されます。変更されたページがスワップファイルに書き込まれた後、そのページが再度交換されたが変更されていない場合は、スワップファイルを書き込む必要はなく、単にそのページを破棄します。交換キャッシュは実際にはページテーブルネックレステーブルを含み、システムの各物理ページはページテーブルエントリに対応する。交換されたページの場合、ページテーブルエントリは、ページを保存するための交換ファイル情報、および交換ファイル内のページの位置情報を含む。スワップページエントリがゼロ以外の場合は、スワップファイルに保存されている対応する物理ページが変更されていないことを示します。このページが後続の操作で変更されると、スワップキャッシュ内のページテーブルエントリがクリアされます。 Linuxが物理メモリからページをスワップアウトする必要がある場合、まずスワップキャッシュ内の情報を分析しますキャッシュに物理ページのゼロ以外のページエントリが含まれる場合、メモリがスワップアウトされてからページは変更されていません。この時点で、システムはページを破棄する必要があるだけです。
スワップキャッシュの機能の一部は、/linux /mm /swap_state.cにあります。
スワップバッファの初期化、サイズの設定、位置関数:
extern unsigned long init_swap_cache(unsigned long、unsigned long);
スワップバッファ情報を表示する関数:
extern void show_swap_cache_info(void);
< Br>スワップバッファ関数を追加する:
int add_to_swap_cache(符号なしlongインデックス、符号なしlongエントリ)
パラメータindexはバッファへのインデックスです(indexはインデックステーブルにあります)。エントリ)、エントリはページテーブルエントリです(つまり、交換ファイル内のこのページのロケーションレコード。このレコードはページテーブルエントリと似ています。スイッチシステムを参照してください)。
スワップアウトしたページをコピーする:
extern void swap_duplicate(unsigned long);
copy_page_tables()呼び出しを使用してfork()で子プロセスを実装する場合スワップアウトされたページを継承します。切り替えの節を参照してください。
バッファからページを削除する
delete_from_swap_cache(page_nr);
4ハードウェアキャッシュ
一般的なハードウェアキャッシュはページテーブルエントリのキャッシュで、実際にはプロセッサによって行われ、その動作は特定のプロセッサハードウェアに関連します(ただし、管理はソフトウェアは完成しており、このキャッシュについて次にさらに説明する。