システムプロセスとユーザープロセス、カーネル制御パス、カーネルスレッドの違い

システムプロセスとユーザープロセス、カーネル制御パス、カーネルスレッドの違い

私の理解は

  • プロセスは常にユーザーモードで実行され、ユーザースペースのみを使用します。
  • カーネルは常にカーネルモードで実行され、カーネルスペースのみを使用します。

しかし、次の2冊の本を読んだ後、私の見解が間違っている可能性があると思います。間違っていたら訂正してもらえますか?

  1. MaurerのLinuxカーネルアーキテクチャでは、「システムプロセス」と「ユーザープロセス」という用語は定義なしで使用されます。仮想アドレス空間が導入され、カーネル空間とユーザ空間に分けられる場合:

    すべてユーザープロセスシステムには、0 から TASK_SIZE まで拡張される独自の仮想アドレス範囲があります。上記の領域(TASK_SIZEから2 32または2 64まで)はカーネル専用に予約されており、ユーザープロセスではアクセスできません。 TASK_SIZE は、指定された割合でアドレス空間を分割するアーキテクチャ固有の定数です。たとえば、IA-32 システムでは、アドレス空間が 3GiB に分割されるため、各プロセスの仮想アドレス空間は 3GiB です。仮想アドレス空間の合計サイズは4GiBなので、カーネルで1GiBを使用できます。実際の数字はアーキテクチャによって異なりますが、一般的な概念はそうではありません。したがって、さらなる議論では、これらのサンプル値を使用する。

    この区分は、使用可能なRAM容量に依存しません。アドレス空間の仮想化により、各ユーザープロセスは3GiBのメモリを持っていると思います。個人ユーザースペースシステムプロセス互いに完全に分離されています。現在実行中のプロセスに関係なく、仮想アドレス空間の上部のカーネル空間は常に同じです。

    ...カーネルは、個人を保護するために仮想アドレス空間を2つの部分に分けます。 システムプロセスお互いから。

    本で「ユーザープロセス」または「システムプロセス」で検索すると、より多くの例が表示されます。

    ユーザープロセスとシステムプロセスはどちらもカーネルプロセスではありませんか?

    彼らの定義は何ですか?所有者(一般ユーザーまたはroot?)、それを開始したユーザー、または他のものが異なりますか?

    この本では、上記のように、両方のタイプの「プロセス」を扱うために、単に「プロセス」の代わりに「システムプロセス」または「ユーザープロセス」を明示的に書くのはなぜですか? 「ユーザープロセス」について言う内容は「システムプロセス」にも適用され、「システムプロセス」について言う内容は「ユーザープロセス」にも当てはまると思います。

  2. BovetのLinuxカーネルの理解にはいくつかの概念があります。カーネル制御パス「そして」カーネルスレッド」。

    カーネル制御パスシステムコール、例外、または割り込みを処理するためにカーネルで実行される一連のコマンドを表します。

    ...従来のUnixシステムは、ディスクキャッシュのフラッシュ、未使用のページ交換、ネットワーク接続のメンテナンスなど、断続的に実行されるプロセスにいくつかの重要なタスクを委任しています。実際、これらの作業を厳密な線形方法で行うことは非効率的である。その機能と目的ユーザープロセスバックグラウンドで予約すると、より良い応答が得られます。何かのため システムプロセスカーネルモードでのみ実行され、最新のオペレーティングシステムは機能を次に委任します。カーネルスレッド、不要なユーザーモードのコンテキストによって妨げられません。 Linuxでは、カーネルスレッドは次の点で通常のプロセスとは異なります。

    •カーネルスレッドはカーネルモードでのみ実行され、通常のプロセスはカーネルモードとユーザーモードで交互に実行されます。

    •カーネルスレッドはカーネルモードでのみ実行されるため、PAGE_OFFSETより大きい線形アドレスのみを使用します。一方、通常のプロセスでは、ユーザーモードまたはカーネルモードで合計4GBの線形アドレスを使用します。

    検索するとより多くのコンテンツを見ることができますGoogle ブック

    Maurerの本とBovetの本に出てくる「システムプロセス」は同じ概念ですか?

    両方の本で言及されている「システムプロセス」は、ユーザースペース、カーネルスペース、またはその両方で実行できますか?

    「システムプロセス」はカーネル制御パスやカーネルスレッドとは異なりますか?

答え1

Q:ユーザープロセスとカーネルプロセスはどちらもカーネルではありませんか?

正解があるかどうかはわかりませんが、一度試してみます。
「オペレーティングシステムの設計と実装」(A. Tanenbaum)第3版2.1章で引用すると、次のようになります。

2.1.プロセス紹介

すべての最新のコンピュータは同時に複数のタスクを実行できます。ユーザープログラムの実行中に、コンピュータはディスクからデータを読み取り、テキストを画面またはプリンタに出力することもできます。マルチプログラミングシステムでは、CPUはあるプログラムから別のプログラムに切り替え、各プログラムは数十または数百ミリ秒間実行されます。厳密に言うと、CPUは一度に1つのプログラムのみを実行しますが、1秒以内に複数のプログラムを同時に実行することができ、ユーザーに並列性という幻想を与えることができます。時々、人々は複数のプロセッサシステム(同じ物理メモリを共有する2つ以上のCPUを持つ)の実際のハードウェア並列性と対照的に疑似並列性について話します。複数の並列活動を追跡することは困難です。したがって、オペレーティングシステムの設計者は、長年にわたって並列処理をより簡単に処理できる概念モデル(シーケンシャルプロセス)を開発してきました。モデル、その用途、および結果の一部がこの章のトピックを構成します。

2.1.1.プロセスモデル

このモデルでは、コンピュータ上で実行可能なすべてのソフトウェア(オペレーティングシステムを含む)が複数の順次プロセスまたは単純なプロセスで構成されています。プロセスは、プログラムカウンタ、レジスタ、変数の現在値を含む単純な実行プログラムです。

(強調は私のもの)

まだ本を読む時間はありませんでしたが、この説明によると、「プロセス」はプロセッサで実行される作業単位であり、必要なすべてのリソース(画像、ステータス、レジスタ、カウンタ...)を持っています。 。

修正された質問に対する回答

カーネルは常にカーネルモードで実行され、カーネルスペースのみを使用します。

これはコアの種類によって異なります。モノリシックカーネルは単一のアドレス空間(カーネル空間)でコンテンツを実行しますが、マイクロカーネルはユーザー空間でカーネルプロセスを実行できます。

両方の本で言及されている「システムプロセス」は、ユーザースペース、カーネルスペース、またはその両方で実行できますか?

上記のように、システムプロセスはカーネルの種類に応じて2つのモードで実行できます。

ユーザープロセスとシステムプロセスはどちらもカーネルプロセスではありませんか?

はい、ユーザープロセスとシステムプロセスの両方がプロセスなので、名前が付けられました。 ;-) しかし、カンマの後ろの部分を理解していません。

「システムプロセス」はカーネル制御パスやカーネルスレッドとは異なりますか?

はい。プロセス(ユーザーまたはシステム=カーネル)が異なります。

カーネル制御パスは一連のコマンドを表し、カーネルスレッド(別名LWP - 軽量プロセス)は、スレッドライブラリで作成されたユーザースレッドとは異なり、カーネルから直接作成および予約されたスレッドです。

結論として

プロセス理論的な構成にすぎません。
コアたとえば、プロセス概念を実装するオペレーティングシステムの一部です。そのプロセスのスケジュールを計画します。
ワイヤー独立して予約できるプロセスの最小部分です。

答え2

Linuxの場合、タスク(スレッドのカーネル内部の概念;スレッドはメモリやオープンファイルなどのリソースを共有でき、一部はカーネル内でのみ実行されます)がユーザーモードで実行されたり(実行スレッド)システムコールを実行したりするカーネル(およびそれ以上)に送信されます。ユーザースレッドは、割り込みを実行するために一時的にハイジャックすることができます(ただし、これは実際の実行スレッドではありません)。

プロセスが「システムプロセス」であるか一般ユーザープロセスであるかは、Unixではまったく関係がなく、同じ方法で処理されます。 Linuxでは、いくつかのタスクがカーネルで実行され、他のタスクを処理します。しかし、これは「システムプロセス」ではなくカーネル操作です。

1つの重要な警告:複雑なソフトウェア製品(コンパイラとオペレーティングシステムは特にとんでもない例)の教科書は、単純なアルゴリズム(しばしば半世紀にわたって真剣に使用されていないアルゴリズム)を説明する傾向があります。たくさん体系的で簡単な方法で説明できる方法で処理するのは複雑すぎます。コンパイラのほとんどは一時的な調整です(特に、変換が主に実際の使用で発生する可能性のサブセットであるコード最適化領域で)。 Linuxの場合、ほとんどのコードはデバイスドライバ(オペレーティングシステムのテキストではデバイス関連と呼ばれます)であり、このコードの大部分は独自の仕様に従わない誤動作するデバイスを処理するために使用されます。または、「同じデバイス」のバージョンによって動作が異なります。説明されている詳細は、解決すべき作業の一部にすぎないことがよくあります。できるいくつかの良い理論に単純化され、汚れて不規則な部分は(ほぼ)完全に除外されています。例えば、Cris FraserとDavid Hansonは彼らの本で次のように説明しています。低価格航空会社コンパイラステートメント 一般的なコンパイラテキストには、主に語彙解析と解析の説明が含まれており、コード生成の説明はほとんどありません。これはコンパイラコードの約5%を占め(単純に設計されています)、エラー率は無視できます。コンパイラの複雑な部分は標準テキストでは扱いません。

答え3

ここに短いが明確な答えを与えたいと思います。最新のLinuxカーネルでのみ動作します。

struct taskカーネル内で内部的に最小の予約可能な単位として使用されるsがあります。これは常にring0を使用してカーネルコードによって生成され、ring0で実行を開始しますが、後でring3に切り替えるか、リング0に戻すことも、そうでない場合もあります(プラットフォーム固有のシステムコールコマンド))。

ジョブには多くのリソースや属性があり、その中で最も重要なのは、メモリースペース、ジョブID(最上位pid名前空間から見たtid)、およびワークグループid(最上位名前空間から見たpid)です。 ring3では、ジョブはstruct task自分のジョブに直接アクセスできませんが、少なくとも上記の属性は/procカーネルによってfsを介してring3に公開されます。ただし、最新のKenerlは、/proc/[pid]/statusprocfsインスタンスに関連付けられているpid名前空間に表示されているジョブIDを参照するために「Pid」という単語を使用するなど、奇妙な方法でそれを公開できます。

ジョブは、同じメモリースペースを共有したり、同じワークグループIDを持つことができるように、これらの属性(トップレベルのpid名前空間で見たときにtidを除く)を他のジョブと共有したり共有したりすることはできません。

リング3、つまりユーザースペースのユーザーは、「スレッド」と「プロセス」の概念を考案できます。ただし、これは純粋にユーザースペースの発明であるため、他の人/教科書では異なる用語を使用できます。だからここでは一般的に使われる用語についてだけ話しましょう。

OS-Thread(スレッド):ジョブの同義語です。

カーネルスレッド:リング3に切り替えずに常にカーネルとメモリスペースを共有する作業です。

OS-Process:カーネルはプロセスの存在を追跡せず、人間はそれを同じワークグループID(最上位のpid名前空間で見るとpid)を持つ1つ以上のジョブとして定義します。このスレッドがすべて死ぬと、人間の脳からプロセスが失われます。

重要な興味深い事実は、オペレーティングシステムプロセスに1つ以上のオペレーティングシステムスレッドを含めることができると結論付けることができるということです。オペレーティングシステムプロセスの操作は、実際にはカーネルのスレッドによって制限されます。実行できる項目に関する属性です。連合国共有する。

ジョブが作成されると、特定のプロセスに属し、この関係は終了するまで絶対に変更されません。

プロセスに属するタスクは、まったく同じメモリ空間を共有する必要があります。

プロセスに属するタスクは、他のユーザー名前空間またはpid名前空間には存在できず、共有する必要があります。

答え4

質問:Maurerの本とBovetの本の「システムプロセス」は同じ概念ですか?

Maurerが使用しているのを見ました。システムプロセス両方を包括する一般的な用語としてユーザープロセスそしてカーネルスレッド

私が知っている限り、Bovetは以下を使用しません。システムプロセスMaurerよりも具体的な概念を定義します。しかし、彼はあまり厳格な言語を使用していない可能性があります。だから私はそれらを直接同一視しないように注意します。この文章は難しいです。

一部のシステムプロセスはカーネルモードでのみ実行されるため、最新のオペレーティングシステムはその機能を不要なユーザーモードのコンテキストによって妨げられないカーネルスレッドに委任します。

誰の機能が誰に委任されますか?オペレーティングシステムの機能ですか、それともシステムプロセスの機能ですか?システムプロセスはカーネルモードでのみ実行されるため、その機能がカーネルスレッドに委任されると言うことは意味がありません。オペレーティングシステムが特定のオペレーティングシステムの機能をカーネルスレッドに「委任」すると考えるのは妥当です。しかし、Maurersの定義を使用すると、「なぜなら」は実際には意味がありません。システムプロセス。したがって、私はこの文がどんな厳密な意味を持つとは思わない。

(「ブロック」の欠如はややマイナーであり、この詳細は特定の実装と矛盾する可能性があります)。

合理的に緩やかな再解釈は、カーネルがカーネル外の特定の「重要なタスク」の実行をサポートしておらず、これらのタスクのいくつかはカーネルスレッドによって処理されるということです。

Q. 両方の本で言及されている「システムプロセス」は、ユーザー空間、カーネル空間、またはその両方で実行できますか?

ある時点で、システムプロセスはユーザー空間またはカーネル空間で実行できます。

ユーザープロセスがシステムコールを実行すると、そのプロセスはカーネルスペースで実行されるように変換されます。システムコールが返されると、プロセスはユーザー空間で実行中の状態に戻ります。

Q:「システムプロセス」はカーネル制御パスとカーネルスレッドとは異なりますか?

上記の定義によれば、カーネルスレッドはシステムプロセスであるが、システムプロセスはカーネルスレッドではないかもしれない。

Bovetは、spin_lockこのマクロが成功すると、現在のカーネルパスがスピンロック(他のカーネルパスを除く)を「取得」させます。 spin_lockカーネルスレッドから呼び出すことができるので、カーネルスレッドはカーネル制御パスと見なされます。私の知る限り。私が知る限り、これは矛盾ではありません。しかし、カーネル制御パスが何であるか、何でないかについての明示的な定義が見つからないため、彼はそのフレーズを使用するたびに適用するためにこの暗黙の定義に依存しません。

システムコール、例外、または割り込みのカーネル制御パスはカーネルスレッドではありません。

一部のドライバを除外すると、スレッドを使用して割り込みに対するほぼすべての応答を処理します。 (スレッド外の唯一の部分は、複数のデバイス間で共有される割り込みラインを明確にすることです。)

割り込みをスレッドに移す- LWN.net、2008

https://www.kernel.org/doc/html/v4.20/core-api/genericirq.html(「トピック」を検索してください)

関連情報