最近、この考えを引き起こした質問を見ました。ここまたはGoogleのマシンで答えを見つけることができませんでした。基本的に、私はカーネルI/Oアーキテクチャがどのように階層化されているかを知りたいと思っています。たとえば、kjournald
は pdflush
にディスパッチします またはその逆?私の仮定は、pdflush
(マスストレージI / Oに対してより一般的です)は、より低いレベルに位置し、実際に書き込みを実行するために必要なSCSI / ATA /すべてのコマンド、およびkjournald
をトリガーします。 書き込む前に、より高いレベルのファイルシステムデータ構造を処理します。ただし、kjournald
を使用すると、逆に表示することもできます。 ファイルシステムのデータ構造およびpdflush
と直接インターフェースする 時々目を覚まして、kjournald
を介してデバイスにダーティページキャッシュページを書き込みます 。他の理由で2つがまったく相互作用しない可能性もあります。
基本的に: Linuxカーネル内のマスストレージにI/Oをディスパッチするために使用される基本的なアーキテクチャを視覚化する(グラフまたは単なる説明)方法が必要です。
承認された回答:
pdflush
に関する詳細について説明する前に 、kjournald, and
kswapd`、最初に、Linuxカーネルに関して正確に話している内容のコンテキストについて少し背景を説明しましょう。
GNU/Linuxアーキテクチャ
GNU / Linuxのアーキテクチャは、2つのスペースと考えることができます。
- ユーザー
- カーネル
ユーザースペースの間 およびカーネルスペース GNU Cライブラリ(glibc
)。これにより、カーネルをユーザースペースアプリケーションに接続するシステムコールインターフェイスが提供されます。
カーネルスペースはさらに3つのレベルに細分化できます:
- システムコールインターフェース
- アーキテクチャに依存しないカーネルコード
- アーキテクチャ依存コード
システムコールインターフェース その名前が示すように、glibc
間のインターフェースを提供します とカーネル。 アーキテクチャに依存しないカーネルコード VFS(仮想ファイルシステム)やVMM(仮想メモリ管理)などの論理ユニットで構成されています。 アーキテクチャ依存コード は、特定のハードウェアアーキテクチャのプロセッサおよびプラットフォーム固有のコードであるコンポーネントです。
GNU/Linuxアーキテクチャの図
この記事の残りの部分では、カーネルスペース内のVFSおよびVMM論理ユニットに注目します。
GNU/Linuxカーネルのサブシステム
VFSサブシステム
GNU / Linuxカーネルがどのように構造化されているかについての高レベルの概念により、VFSサブシステムをもう少し深く掘り下げることができます。このコンポーネントは、物理デバイス(HDDなど)上のファイルシステム(ext3 / ext4など)に最終的にマップされるさまざまなブロックストレージデバイスへのアクセスを提供する役割を果たします。
VFSの図
この図は、write()
がどのように機能するかを示しています。 ユーザーのプロセスからVFSをトラバースし、最終的にはデバイスドライバーに到達し、そこで物理ストレージメディアに書き込まれます。これは、pdflush
に遭遇する最初の場所です。 。これは、ダーティデータとメタデータバッファブロックをバックグラウンドでストレージメディアにフラッシュする役割を担うデーモンです。この図にはこれは示されていませんが、別のデーモンkjournald
があります。 、pdflush
の横にあります 、ダーティジャーナルブロックをディスクに書き込む同様のタスクを実行します。 注: ジャーナルブロックは、ext4やJFSなどのファイルシステムが、変更が行われる前に、ファイル内のディスクへの変更を追跡する方法です。
上記の詳細については、このホワイトペーパーで詳しく説明します。
write()
の概要 手順
I / O sybsystemの操作の概要を簡単に説明するために、関数write()
の例を使用します。 ユーザースペースアプリケーションによって呼び出されます。
- プロセスは、
write()
を介してファイルの書き込みを要求します システムコール。 - カーネルは、ファイルにマップされたページキャッシュを更新します。
- pdflushカーネルスレッドは、ページキャッシュをディスクにフラッシュします。
- ファイルシステムレイヤーは、各ブロックバッファーを
bio struct
にまとめます。 (1.4.3、23ページの「ブロックレイヤー」を参照)そして、書き込み要求をブロックデバイスレイヤーに送信します。 - ブロックデバイスレイヤーは、上位レイヤーからリクエストを取得し、I / Oエレベータ操作を実行して、リクエストをI/Oリクエストキューに入れます。
- SCSIやその他のデバイス固有のドライバーなどのデバイスドライバーが書き込み操作を処理します。
- ディスクデバイスファームウェアは、シークヘッド、回転、プラッター上のセクターへのデータ転送などのハードウェア操作を実行します。
VMMサブシステム
さらに深く掘り下げて、VMMサブシステムを調べることができます。このコンポーネントは、メインメモリ(RAM)、スワップ、および物理ストレージメディア間の整合性を維持する役割を果たします。一貫性を維持するための主要なメカニズムはbdflush
です 。メモリのページはダーティと見なされるため、ストレージメディアにあるデータと同期する必要があります。 bdflush
pdflush
と調整します このデータをストレージメディアと同期するデーモン。
VMMの図
スワップ
システムメモリが不足するか、カーネルスワップタイマーが期限切れになると、kswapd
デーモンはページを解放しようとします。無料ページの数がfree_pages_high
を上回っている限り 、kswapd
何もしません。ただし、空きページの数が下がった場合は、kswapd
ページ再利用プロセスを開始します。 kswapd
の後 ページを再配置用にマークしました、bdflush
pdflush
を介して、ストレージメディアへの未処理の変更を同期するように注意します デーモン。
参考資料と参考資料
- Linuxカーネルの概念アーキテクチャ
- Linux I / Oスタック図–ver。 0.1、2012-03-06 –カーネル3.3現在のLinux I/Oスタックの概要
- ローカルファイルシステムの更新–特にスライド#7
- インタラクティブなLinuxカーネルマップ
- Red Hat EnterpriseLinux4の仮想メモリについて
- Linuxのパフォーマンスとチューニングのガイドライン–特に19〜24ページ
- Linuxカーネルの構造
- セマンティックアウェアリモートレプリケーションの場合