~によるとLinuxカーネル分析Linuxカーネルには、プロセス管理、メモリ管理、ネットワーク、VFS、およびデバイスの5つのサブシステムがあります。
そのうちの2つは必須です:1.プロセス管理2.メモリ管理
ネットワーキング、VFS、デバイスの処理にデフォルトのLinuxカーネルサブシステムが使用されていますか?
Linuxカーネルのプロセス管理とメモリ管理の目的は何ですか?
また、他のLinuxカーネルサブシステム(プロセス管理やメモリ管理など)と共に存在するLinuxカーネルサブシステム(VFS、ネットワーキング、デバイス)の目的を見つけようとしています。
VFS、ネットワーク、およびデバイスがプロセス管理とメモリ管理によって処理される場合、VFS、ネットワーク、およびデバイスをLinuxカーネルのサブシステムとして扱うのは論理的ですか?
ユーザーがユーザー空間でプログラムを実行すると、プロセス管理とメモリ管理が機能します。このプログラムには、VFS、ネットワーキング、またはデバイスに関するコンテンツを含めることができますか?
プロセス管理とメモリ管理は、他のLinuxカーネルサブシステムでどのように機能しますか?
答え1
注:「プロセス管理」という用語は、Linuxカーネルで正式に定義または使用されていません。 「プロセス管理」を考えることは大丈夫ですが、それが正確に何を含むかについては、人々が同意しないかもしれません。
この答えは、あなたが見つける必要があるいくつかの一般的な定義とキーワードを提供したいので、少し複雑です。残念ながら、いくつかの言葉は場所によって異なる意味を持ちます。
注意深く読んで、各単語の使い方を積極的に再確認してください。文章を書くときは、いくつかの背景情報を提供してください。誰もが同じ定義を使用すると仮定しないでください。
いつものように、この答えは単純化されています:-)。
「工程管理
コンピュータには、コードを実行するためのプロセッサ、つまり「CPU」があります。お使いのコンピュータにはおそらく2つのCPUがあります。 Linux CPUスケジューラは、より便利な概念を提供するためにCPUを管理します。乱数「プロセス」を実行するか、「スレッド」を実行します。スケジューラはスレッド間の切り替えを強制します。毎秒数回切り替えます。
さらに、スケジューラは、スレッドを別のCPUに割り当てる必要があるかどうかを定期的に考慮します。つまり、各CPUに割り当てられているスレッド数の「バランス」を調整します。
従来、CPUスケジューラは「プロセススケジューラ」とも呼ばれていました。しかし、当時は、ユーザーレベルのプロセスごとに実行スレッドが1つしかありませんでした。今日、UNIXプロセスには多くのスレッドがあります。カーネル内では、単に「スケジューラ」と呼ぶのが一般的です。
スケジューラは、「作業」という単語を使用してカーネルスレッドの概念を表します。それにもかかわらず、カーネルはしばしば「作業」(スレッド)を意味するために「プロセス」を使用します。違いが重要な場合は、文脈を再確認して混同しないように努力する必要があります。 :-).
のコアスケジューリングアルゴリズムは、kernel/sched/
使用するCPUスイート(CPU「アーキテクチャ」)に依存しません。プロセス間の遷移の詳細は、のアーチ関連コードで処理されますarch/*/
。
プロセス管理の別の側面は、プロセスがイベントを待つ場合です。たとえば、プロセスがデバイスからデータを読み取るためにシステムコールを実行するときにデータが準備されたら、デバイスが信号(割り込み信号)を送信するのを待つ必要があります。それまで、そのプロセスは実行キューから削除され、他のプロセスはCPUで予約できます。
メモリ管理
もう一度言いますが、ハードウェアを最初に検討してください:物理RAM。ハードウェアは、次の部分で構成されるメモリを提供します。バイト。各バイトには数値アドレスがあり、個別にアクセスできます。お使いのコンピュータには約1,000,000,000バイトのRAMがあります。
一つLinuxメモリ管理の1つの側面は、各ユーザープロセスに独自の仮想メモリを提供することです。我々は再びハードウェアリソースを分割し、それらのいくつかを他の目的に割り当てます。仕事をより楽しくする新しい概念を提供することが目標です。
なぜ仮想メモリがそんなに有用なのかを理解するには、仮想メモリがないと何が起こるのかを考えてください。すべてのプロセスは物理メモリ全体にアクセスできます。これは、実行中のプログラムに単純なバグがあるか、悪意のある場合にシステム全体が破損する可能性があることを意味します。
もともとUNIXに仮想メモリを追加すると、システムがより強力になりました。メモリ保護と強制上記のタスク切り替え(「プリエンプティブ」マルチタスクとも呼ばれます)プリエンプティブマルチタスクは、1つのユーザープロセスが唯一のCPUで連続ループで実行されている場合、システムは他のプロセスを実行し続け、入力に応答できるようにします。
上記のように、UNIXプロセスには多くのスレッドがあります。ただし、プロセス内部では、すべてのスレッドが同じ仮想メモリにアクセスします。
私がUNIXプロセスの概念に言及しているのは、Linux固有の機能が技術的にさまざまな可能な組み合わせを可能にするからです。追加の組み合わせはほとんど使用されません。ポータブルUNIXという概念で考えると最善です。
ハードウェアの詳細はどうですか?メモリ管理ユニットアーキテクチャ固有のコードで仮想メモリ処理をサポートします。ただし、その中にはまだmm/
すべてのCPUアーキテクチャで使用されている多くのメモリ管理コードがあります。
スケジューラコードとVMコードの間にいくつかの協力があることがわかります!カーネルがCPUを別の実行スレッドに切り替えるとき、スレッドが正しい仮想メモリ空間で実行されるように関連するMMUを更新する必要があります。
ユーザーがユーザー空間でプログラムを実行すると、プロセス管理とメモリ管理が機能します。このプログラムには、VFS、ネットワーキング、またはデバイスに関するコンテンツを含めることができますか?
全体的に「はい」です。最も正確で有用な答えは「はい」です。
開いている()VFS()へのシステムコールですfs/
。呼び出しプロセスに「ファイル記述子」を返します。それは数字だけです。各プロセスに対して、カーネルは開いたファイルテーブルを保持します。たとえば、電話するとき閉鎖()、ファイル記述子を渡すと、カーネルはテーブル内でそれを見つけます。
所有しているテーブルを閲覧していると言えるので、task_struct
実際にVFSに直接アクセスするのではなく、「プロセス管理」を進めています。しかし、私は同意しません。そして次に定義されたシステムopen()
コールclose()
ファイルシステム/open.c。数値のファイル記述子を使用して呼び出され、独自に検索する必要があります。
渡すファイル名はopen()
おそらくデバイスノードです。この場合、返されたファイル記述子(含む)に対する操作は最終的にclose()
デバイスドライバ()とdrivers/
通信します。
ネットワーク接続はファイル記述子としても表示されます。ほとんどの場合、ファイル記述子はopen()
ファイルシステムのパスを介して取得されません。socket()
代わりに使用されます。 (カーネルソースコードディレクトリnet/
:)