Linux カーネルには 5 つのサブシステムがあります: 1. プロセス スケジューリング制御システム (SCHED); 2. メイン メモリ領域を安全に共有するために複数のプロセスを制御することが主な機能であるメモリ管理システム (MM); 3.仮想ファイル システム (VFS)、4. ネットワーク インターフェイス (NET)、5. プロセス間通信 (IPC)。
このチュートリアルの動作環境: Ubuntu 16.04 システム、Dell G3 コンピューター。
カーネル:
コンピュータ サイエンスにおいて、ソフトウェアによって発行されたデータ I/O (入出力) 要求を管理し、これらの要求を変換するために使用されるコンピュータ プログラムです。データ処理の命令を提供し、コンピューター内の中央処理装置 (CPU) およびその他の電子コンポーネントによって処理され、最新のオペレーティング システムの最も基本的な部分です。これは、多くのアプリケーションにコンピュータ ハードウェアへの安全なアクセスを提供するソフトウェアです。このアクセスは制限されており、プログラムがハードウェアの特定の部分でいつ、どのくらいの時間動作できるかはカーネルによって決定されます。ハードウェア上で直接操作することは非常に複雑です。したがって、カーネルは通常、これらの操作を完了するためのハードウェア抽象化メソッドを提供します。プロセス間通信メカニズムとシステム コールを通じて、アプリケーション プロセスは必要なハードウェア リソース (特にプロセッサと IO デバイス) を間接的に制御できます。
Linux カーネルのサブシステムとは何ですか?
Linux カーネルは、主にプロセス スケジューリング (SCHED) とメモリ管理 (MM) で構成されます。 、仮想ファイル システム 以下の図に示すように、5 つのサブシステム (VFS)、ネットワーク インターフェイス (NET)、およびプロセス間通信 (IPC) で構成されます。
1. プロセス スケジューリング
プロセス スケジューリング制御の多くのプロセスシステム CPU へのプロセスのアクセスにより、CPU 内で複数のプロセスを「マイクロ直列およびマクロ並列」で実行できます。プロセス スケジューリングはシステムの中心にあり、各サブシステムはプロセスを一時停止または再開する必要があるため、カーネル内の他のサブシステムはプロセス スケジューリングに依存します。
以下の図に示すように、Linux プロセスはいくつかの状態を切り替えます。
Linux プロセスの状態遷移
デバイス ドライバー プログラミングでは、要求されたリソースが満たされない場合、ドライバーは通常、他のプロセスの実行をスケジュールし、このプロセスを状態遷移させます。スリープ状態の場合、要求したリソースが解放されるまで起動されず、準備完了状態になります。スリープには、中断可能なスリープと中断不可能なスリープがあり、両者の違いは、中断可能なスリープは信号を受信するとスリープが解除されることです。
完全に TASK_UNINTERRUPTIBLE 状態にあるプロセスは「強制終了」することさえできないため、Linux 2.6.26 以降のカーネルにも TASK_KILLABLE 状態があり、これは「TASK_WAKEKILL|TASK_UNINTERRUPTIBLE」に等しく、致命的なエラーに応答できます。信号。
Linux カーネルでは、task_struct 構造体 (include/linux/sched.h) を使用してプロセスを記述します。この構造体には、メモリ リソース、ファイル システム リソース、ファイル リソース、tty リソース、およびプロセスを記述する信号が含まれています。プロセス、ハンドルへのポインタなどLinux スレッドは軽量プロセス モデルを使用して実装されており、pthread_create() API を使用してユーザー空間にスレッドが作成されると、基本的にカーネルは新しい task_struct を作成し、新しい task_struct のすべてのリソース ポインターがそれを作成したものにポイントするだけです。 task_struct のポインタ。
プロセスの大部分 (およびプロセス内の複数のスレッド) はユーザー空間アプリケーションによって作成され、基盤となるリソースやハードウェアへのアクセスが必要になると、システム コールを通じてカーネル空間に入ります。カーネル プログラミングでは、複数のタスクを同時に実行する必要がある場合に、カーネル スレッドが開始されることがありますが、これらのスレッドにはユーザー領域がありません。カーネル スレッドを開始する関数は次のとおりです: pid_t kernel_thread(int (*fn)(void *), void *arg, unsigned long flags);
2. メモリ管理
メモリ管理の主な機能は、複数のプロセスを制御してメイン メモリ領域を安全に共有することです。 Linux のメモリ管理では、CPU がメモリ管理ユニット (MMU) を提供すると、プロセスごとに仮想メモリから物理メモリへの変換が完了します。 Linux 2.6 では、MMU レス CPU のサポートが導入されました。
図に示すように、一般的に、32 ビット プロセッサ上の Linux の各プロセスは 4GB のメモリ空間を享受し、0 ~ 3GB はユーザー空間に属し、3 ~ 4GB はカーネル空間に属し、カーネル空間に属します。従来のメモリには一定の影響を与えますが、I/O デバイスのメモリとハイエンドのメモリでは処理方法が異なります。カーネル空間とユーザー空間の間の特定の境界は調整でき、カーネル設定オプションの [カーネル機能]→[メモリ分割] で、境界を 2GB または 3GB に設定できます。
Linux プロセス アドレス空間
上の図に示すように、Linux カーネルの全体的なメモリ管理は、各メモリの管理に使用される基礎となる Buddy アルゴリズムを含め、比較的大規模です。ページの占有、カーネル空間でのスラブ アロケータ、およびユーザー空間での C ライブラリの二次管理。さらに、カーネルは、メモリを使用してディスクをキャッシュするページ キャッシュ サポートも提供し、バッキング デバイスごとの情報フラッシャー スレッドを使用して、ダーティ ページ キャッシュをディスクにフラッシュします。 Kswapd (スワップ プロセス) は、Linux のページ リサイクル (ファイル バック ページや匿名ページを含む) に使用されるカーネル スレッドで、メモリのリサイクルに最も最近使用されていない (LRU) アルゴリズムを使用します。
3. 仮想ファイル システム
図に示すように、
Linux 仮想ファイル システム
Linux 仮想ファイル システムは、さまざまなハードウェアの特定の詳細を隠し、すべてのデバイスに統一されたインターフェイスを提供します。さらに、それはそれぞれの特定のファイル システムから独立しており、さまざまなファイル システムを抽象化したものです。これは、上位層アプリケーションに統合された vfs_read()、vfs_write() およびその他のインターフェイスを提供し、特定の基礎となるファイル システムまたはデバイス ドライバーに実装された file_operations 構造体のメンバー関数を呼び出します。
4. ネットワーク インターフェイス
ネットワーク インターフェイスは、さまざまなネットワーク標準へのアクセスと、さまざまなネットワーク ハードウェアのサポートを提供します。図 3.8 に示すように、Linux のネットワーク インターフェイスは、ネットワーク プロトコルとネットワーク ドライバーに分けることができます。ネットワーク プロトコル部分は、考えられるすべてのネットワーク伝送プロトコルの実装を担当します。ネットワーク デバイス ドライバーは、ハードウェア デバイスとの通信を担当します。考えられるすべてのハードウェアデバイスには対応するデバイスドライバーがあります。
Linux ネットワーク アーキテクチャ
Linux カーネルは、インターネット、UNIX、CAN、NFC、Bluetooth、WiMAX、IrDA など、多くの種類のプロトコル スタックをサポートします。上位層のアプリケーションは一律にソケット インターフェイスを使用します。
5. プロセス間通信
プロセス間通信は、プロセス間の通信をサポートします。Linux は、セマフォ、共有メモリ、メッセージなど、プロセス間のさまざまな通信メカニズムをサポートします。これらのメカニズムは、複数のプロセス、複数のリソースへの相互排他的アクセス、プロセス間の同期、およびメッセージ配信を支援します。実際の Linux アプリケーションでは、System V IPC のメッセージ キューやその他のメカニズムではなく、UNIX ドメイン ソケットを使用する傾向があります。 Android カーネルには、新しい Binder プロセス間通信メソッドが追加されました。
Linux カーネルの 5 つのコンポーネント間の依存関係は次のとおりです。
プロセス スケジューリングとメモリ管理の関係: これら 2 つのサブコンポーネント- システムは相互に依存しています。マルチプログラム環境では、プログラムを実行するには、そのプログラム用のプロセスを作成する必要があります。プロセスを作成するときに最初に行うことは、プログラムとデータをメモリにロードすることです。
プロセス間通信とメモリ管理の関係: プロセス間通信サブシステムは、共有メモリ通信メカニズムをサポートするためにメモリ管理に依存しています。このメカニズムにより、2 つのプロセスが独自のメモリを持つことができます。さらに、共有メモリ領域にもアクセスできます。
仮想ファイル システムとネットワーク インターフェイスの関係: 仮想ファイル システムは、ネットワーク インターフェイスを使用してネットワーク ファイル システム (NFS) をサポートし、またメモリ管理を使用して RAMDISK をサポートします。デバイス。
メモリ管理と仮想ファイル システムの関係: メモリ管理は仮想ファイル システムを使用してスワッピングをサポートし、スワッピング プロセスはスケジューラによって定期的にスケジュールされます。これがメモリ管理が依存する理由です。プロセスのスケジューリング上。プロセスによってアクセスされたメモリ マップがスワップアウトされると、メモリ管理は仮想ファイル システムにリクエストを発行し、同時に現在実行中のプロセスを一時停止します。
これらの依存関係に加えて、カーネル内のすべてのサブシステムはいくつかの共通リソースにも依存します。これらのリソースには、メモリ空間の割り当てと解放を行う関数、警告やエラー メッセージを出力する関数、システムが提供するデバッグ インターフェイスなど、すべてのサブシステムで使用される API が含まれます。
関連する推奨事項: 「Linux ビデオ チュートリアル 」
以上がLinux カーネルのサブシステムとは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。