GNU/Linux >> Linux の 問題 >  >> Linux

Linux – Pdflush、Kjournald、Swapdなどはどのように相互運用しますか?

最近、この考えを引き起こした質問を見ました。ここまたはGoogleのマシンで答えを見つけることができませんでした。基本的に、私はカーネルI/Oアーキテクチャがどのように階層化されているかを知りたいと思っています。たとえば、kjournaldpdflushにディスパッチします またはその逆?私の仮定は、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などのファイルシステムが、変更が行われる前に、ファイル内のディスクへの変更を追跡する方法です。

関連:LinuxCLIコマンドのチートシート

上記の詳細については、このホワイトペーパーで詳しく説明します。

write()の概要 手順

I / O sybsystemの操作の概要を簡単に説明するために、関数write()の例を使用します。 ユーザースペースアプリケーションによって呼び出されます。

  1. プロセスは、write()を介してファイルの書き込みを要求します システムコール。
  2. カーネルは、ファイルにマップされたページキャッシュを更新します。
  3. pdflushカーネルスレッドは、ページキャッシュをディスクにフラッシュします。
  4. ファイルシステムレイヤーは、各ブロックバッファーをbio structにまとめます。 (1.4.3、23ページの「ブロックレイヤー」を参照)そして、書き込み要求をブロックデバイスレイヤーに送信します。
  5. ブロックデバイスレイヤーは、上位レイヤーからリクエストを取得し、I / Oエレベータ操作を実行して、リクエストをI/Oリクエストキューに入れます。
  6. SCSIやその他のデバイス固有のドライバーなどのデバイスドライバーが書き込み操作を処理します。
  7. ディスクデバイスファームウェアは、シークヘッド、回転、プラッター上のセクターへのデータ転送などのハードウェア操作を実行します。

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カーネルの構造
  • セマンティックアウェアリモートレプリケーションの場合

Linux
  1. Linuxカーネルパニックを処理する方法

  2. Linuxデスクトップでカーネルをアップグレードする方法

  3. Linuxでカーネルバージョンを確認する方法

  1. CentOS7にLinuxカーネル5.0をインストールする方法

  2. Linux –カーネルモジュールを適切にリロードする方法は?

  3. Linux カーネルモジュールのコーディング方法は?

  1. Linuxカーネルが割り込みを処理する方法

  2. Linux カーネルはどうしてこんなに小さいのでしょうか?

  3. Linux で KPTI が有効になっているかどうかを確認するにはどうすればよいですか?