1324

プロセスとスレッドの技術的な違いは何ですか?

私は、「プロセス」のような言葉が酷使され、ハードウェアとソフトウェアのスレッドもあると感じます。以下のような言語での軽量プロセスはどうでしょうか。アーラン?ある用語を他の用語に対して使用する明確な理由はありますか?


  • 関連するstackoverflow.com/questions/32294367/… - zxq9
  • おそらく、各OSが「スレッド」とは異なる考えを持っていると言うのは当然でしょう。または'プロセス'一部の主流のOS' 「スレッド」の概念がない場合は、組み込みOSもいくつかあります。スレッドがあるだけです。 - Neil

30 답변


1199

プロセスとスレッドはどちらも独立した実行シーケンスです。一般的な違いは、(同じプロセスの)スレッドは共有メモリ空間で実行されるのに対し、プロセスは別々のメモリ空間で実行されることです。

「ハードウェア」スレッドと「ソフトウェア」スレッドのどちらを参照しているのかわかりません。スレッドは、CPU機能ではなく、オペレーティング環境の機能です(CPUには通常、スレッドを効率的にする操作があります)。

Erlangは共有メモリマルチプログラミングモデルを公開していないため、「プロセス」という用語を使用します。それらを「スレッド」と呼ぶことは、それらが共有メモリを持っていることを意味します。


  • それはHyperThreading(tm)への参照でしょうか。 - RobS
  • ハードウェアスレッドは、おそらくコア内の複数のスレッドコンテキスト(HyperThreading、SMT、SunのNiagara / Rockなど)を参照しています。これは、重複したレジスタファイル、パイプラインを介して命令と共に持ち越される余分なビット、そしてとりわけ複雑なバイパス/転送ロジックを意味します。 - Matt J
  • @JeshwanthKumarNK:新しいスレッドを作成すると、新しいスタックに少なくとも十分なメモリが割り当てられます。このメモリはプロセスAでOSによって割り当てられます。 - Greg Hewgill
  • この答えは間違っているようです。プロセスとスレッドの両方が独立した実行シーケンスである場合、2つのスレッドを含むプロセスは3つの実行シーケンスを持つ必要があり、それは正しくありません。スレッドだけが実行シーケンスです。プロセスは、1つ以上の実行シーケンスを保持できるコンテナです。 - David Schwartz
  • "ハードウェアスレッド"個々のハードウェアリソース(個別のコア、プロセッサ、またはハイパースレッド)が割り当てられているスレッドです。 "ソフトウェアスレッド"同じ処理能力を競う必要があるスレッドです。 - jpmc26

673

プロセス

各プロセスは、プログラムの実行に必要なリソースを提供します。プロセスには、仮想アドレス空間、実行可能コード、システムオブジェクトへのオープンハンドル、セキュリティコンテキスト、一意のプロセス識別子、環境変数、優先度クラス、最小および最大作業セットサイズ、および少なくとも1つの実行スレッドがあります。各プロセスは、プライマリスレッドと呼ばれることが多い単一のスレッドで開始されますが、その任意のスレッドから追加のスレッドを作成できます。



スレッドは、実行をスケジュールできるプロセス内のエンティティです。プロセスのすべてのスレッドは、その仮想アドレス空間とシステムリソースを共有します。さらに、各スレッドは、例外ハンドラ、スケジューリング優先順位、スレッドローカルストレージ、一意のスレッド識別子、およびスケジュールされるまでスレッドコンテキストを保存するためにシステムが使用する一連の構造を管理します。スレッドコンテキストは、スレッドのプロセスのアドレス空間内に、スレッドのマシンレジスタのセット、カーネルスタック、スレッド環境ブロック、およびユーザースタックを含みます。スレッドは独自のセキュリティコンテキストを持つこともでき、これはクライアントを偽装するために使用できます。


ここMSDNでこれを見つけた:

プロセスとスレッドについて

Microsoft Windowsはプリエンプティブマルチタスクをサポートしています。これは、複数のプロセスからの複数のスレッドの同時実行の効果を生み出します。マルチプロセッサコンピュータでは、システムはコンピュータ上のプロセッサと同じ数のスレッドを同時に実行できます。


  • なぜあなたはフロッピーを同時に傾けることができないのか知りたい人のために:stackoverflow.com/questions/20708707/… - Computernerd
  • @LuisVasconcellos - スレッドがない場合、プロセスは何もしません。このプロセスは、コードとプログラムの状態がメモリにロードされることだけです。あまり使用されていません。車が走っていない道路があるようなものです。 - Scott Langham
  • @LuisVasconcellos - いいね。はい、スレッドはプロセスのコード内を移動し、そのコード内の命令を実行するものと考えることができます。 - Scott Langham
  • この答えは、受け入れられた答えよりもはるかに優れています。理想的プロセスとスレッド:それらは別々の懸念を持つ別々のものであるべきです。事実、ほとんどのオペレーティングシステムは、スレッドの発明よりもはるかに古い歴史を持ち、その結果、ほとんどのオペレーティングシステムでは、時間の経過とともにゆっくりと改善していても、これらの懸念は依然としていくらか絡み合っています。 - Solomon Slow
  • @BKSpurgeon説明をするたびに、読者を理解の1つのレベルから次のレベルへと導きます。残念ながら、私はすべての読者に答えを仕立てることはできないので、ある程度の知識を必要とします。知らない人にとっては、自分が使っていることが理解できない用語をさらに検索することはできますが、理解できない基準に達するまではできません。私はあなたがあなた自身の答えを提供することを提案するつもりでしたが、あなたがすでに持っているのを見てうれしいです。 - Scott Langham

246

プロセス:

  • プログラムの実行インスタンスはプロセスと呼ばれます。
  • 一部のオペレーティングシステムは、実行中のプログラムを指すために「タスク」という用語を使用します。
  • プロセスは、常にプライマリメモリまたはランダムアクセスメモリとも呼ばれるメインメモリに格納されます。
  • したがって、プロセスはアクティブエンティティと呼ばれます。マシンを再起動すると消えます。
  • 複数のプロセスが同じプログラムに関連付けられている可能性があります。
  • マルチプロセッサシステムでは、複数のプロセスを並列に実行できます。
  • ユニプロセッサシステムでは、真の並列処理は実現されませんが、プロセススケジューリングアルゴリズムが適用され、プロセッサは各プロセスを一度に1つずつ実行するようにスケジュールされ、並行性の錯覚を生じます。
  • 例:「電卓」プログラムの複数のインスタンスを実行する。各インスタンスはプロセスと呼ばれます。

糸:

  • スレッドはプロセスのサブセットです。
  • 実際のプロセスに似ていますが、プロセスのコンテキスト内で実行され、カーネルによってプロセスに割り当てられたものと同じリソースを共有するため、これは「軽量プロセス」と呼ばれます。
  • 通常、プロセスには制御スレッドが1つしかありません - 一度に1セットの機械命令が実行されます。
  • プロセスは、命令を同時に実行する複数の実行スレッドで構成されている場合もあります。
  • マルチスレッド制御は、マルチプロセッサシステムで可能な真の並列処理を利用することができます。
  • ユニプロセッサシステムでは、スレッドスケジューリングアルゴリズムが適用され、プロセッサは各スレッドを一度に1つずつ実行するようにスケジュールされます。
  • プロセス内で実行されているすべてのスレッドは、同じアドレス空間、ファイル記述子、スタック、およびその他のプロセス関連の属性を共有します。
  • プロセスのスレッドは同じメモリを共有するため、プロセス内で共有データへのアクセスを同期することは、これまでにない重要性を増します。

私はから上記の情報を借りましたナレッジクエスト!ブログ


  • Kumar:私の知る限りでは、スレッドは同じスタックを共有しません。それ以外の場合は、それぞれに対して異なるコードを実行することはできません。 - Mihai Neacsu
  • うん、私は@ MihaiNeacsuが正しいと思います。スレッドは「コード、データ、ファイル」を共有します。独自の"レジスタ&スタック"を持つ。私のOSコースからスライドしてください。i.imgur.com/Iq1Qprv.png - Shehaaz
  • これはスレッドやプロセスとは何か、そしてそれらがお互いにどのように関連しているかを拡張するので、非常に便利です。特にプロセス用のスレッドがあるので、スレッドの例を追加することをお勧めします。良いもの! - Smithers
  • Kquest.co.ccのリンクが切れています。 - Elijah Lynn
  • @Kumarスレッドのスタック共有部分に関する答えを修正してください。混乱を招きます。 - Rndp13

100

まず、理論的側面を見てみましょう。プロセスとスレッドの違い、およびそれらの間で共有されていることを理解するには、プロセスが概念的にどのようなものであるかを理解する必要があります。

課から以下があります2.2.2古典的スレッドモデル現代のオペレーティングシステム3eTanenbaum著:

プロセスモデルは、2つの独立した概念に基づいています。   グループ化と実行時にはそれらを分離するのが便利です。   これはスレッドが入るところです....

彼は続けます:

プロセスを見る一つの方法は、それが   関連するリソースをまとめてください。プロセスにアドレス空間があります   プログラムのテキストとデータ、およびその他のリソースを含みます。これら   リソースには、開いているファイル、子プロセス、保留中のアラーム、   シグナルハンドラ、アカウンティング情報など入れて   プロセスの形で一緒にすれば、それらはより簡単に管理できます。   プロセスが持っている他の概念は実行のスレッドです、通常   ただスレッドに短縮されました。スレッドは、プログラムカウンタを保持しています。   次に実行する命令を追跡します。それはレジスタを持っています、   現在の作業変数を保持します。それはスタックを持っています。   実行履歴。各プロシージャに1フレームずつ呼び出されますが、呼び出されません。   まだから戻った。スレッドはあるプロセスで実行されなければなりませんが、   スレッドとそのプロセスは異なる概念であり、扱うことができます   別に。プロセスはリソースをグループ化するために使用されます。スレッド   CPU上で実行がスケジュールされているエンティティです。

さらに彼は以下の表を提供する。

Per process items             | Per thread items
------------------------------|-----------------
Address space                 | Program counter
Global variables              | Registers
Open files                    | Stack
Child processes               | State
Pending alarms                |
Signals and signal handlers   |
Accounting information        |

対処しましょうハードウェアマルチスレッド問題。従来、CPUは単一の実行スレッドをサポートし、単一のプログラムカウンタと一連のレジスタを介してスレッドの状態を維持していました。しかし、キャッシュミスがあるとどうなりますか?メインメモリからデータを取得するには長い時間がかかります。その間、CPUはアイドル状態で待機しています。そのため、他のスレッドがメインメモリで待機している間に別のスレッド(おそらく同じプロセス内、または別のプロセス内)が作業を完了できるように、基本的に2組のスレッド状態(PC +レジスタ)を持つという考えがありました。 HyperThreadingやHyperThreadingなど、この概念には複数の名前と実装があります。同時マルチスレッド(略してSMT)。

それではソフトウェア側を見てみましょう。ソフトウェア側でスレッドを実装する方法は、基本的に3つあります。

  1. ユーザースペーススレッド
  2. カーネルスレッド
  3. 2つの組み合わせ

スレッドを実装するために必要なのは、CPU状態を保存し、複数のスタックを維持する機能だけです。これは、多くの場合、ユーザー空間で実行できます。ユーザー空間スレッドの利点は、カーネルに囚われたり、自分のスレッドを好きなようにスケジュールすることができないので、超高速のスレッド切り替えです。最大の欠点は、I / Oをブロックできないことです(これがプロセス全体とそのすべてのユーザースレッドをブロックすることになります)。これは、最初にスレッドを使用する大きな理由の1つです。スレッドを使用してI / Oをブロックすると、多くの場合、プログラム設計が非常に簡単になります。

カーネルスレッドには、スケジューリングの問題をすべてOSに任せることに加えて、ブロッキングI / Oを使用できるという利点があります。しかし、各スレッドの切り替えにはカーネルへのトラップが必要ですが、これは比較的遅い可能性があります。しかし、I / Oがブロックされているためにスレッドを切り替えているのであれば、I / O操作によってすでにカーネルに閉じ込められている可能性があるため、これは実際には問題になりません。

もう1つの方法は、2つを組み合わせて、それぞれが複数のユーザースレッドを持つ複数のカーネルスレッドを使用することです。

用語の問題に戻って、プロセスと実行のスレッドは2つの異なる概念であり、どの用語を使用するかはあなたが話している内容によって異なります。 「軽量プロセス」という用語に関しては、「実行のスレッド」という用語だけでなく現在行われていることを実際には伝えていないので、その点を個人的には見ていません。


  • 優れた答え!それは多くの専門用語と仮定を破ります。それでも、この行はぎこちなく目立つようになります。「したがって、基本的に2組のスレッド状態(PC +レジスタ)を使用するという考えがありました」。 - 「PC」とは何ですか。ここで言及? - Smithers
  • @Smithers PCはプログラムカウンタ、つまり命令ポインタで、次に実行する命令のアドレスを示します。en.wikipedia.org/wiki/Program_counter - Robert S. Barnes
  • あなたがそこで何をしたかわかる。stackoverflow.com/questions/1762418/process-vs-thread/… - Alexander Gonchiy
  • なぜ「スタック」なのか[プロセス別アイテム]の下に表示されないプロセスとスレッドはどちらも独自のスタックを持っています。 - stackoverflowuser2010
  • @ stackoverflowuser2010スレッドだけがスタックを持つことはできません。プロセスと呼ぶのは、単一の実行スレッドを持つプロセスであり、スタックではなくプロセスであるスレッドです。 - Robert S. Barnes

66

並行プログラミングに関してさらに説明する

  1. プロセスは自己完結型の実行環境を持ちます。プロセスは一般に、基本的なランタイムリソースの完全なプライベートセットを持っています。特に、各プロセスには独自のメモリスペースがあります。

  2. スレッドはプロセス内に存在します - すべてのプロセスは少なくとも1つを持っています。スレッドは、メモリや開いているファイルなど、プロセスのリソースを共有します。これは、効率的ではあるが潜在的に問題のあるコミュニケーションになります。

平均的な人を心に留めて、

コンピュータで、Microsoft WordとWebブラウザを開きます。これら二つを呼ぶプロセス

Microsoftの言葉では、何かを入力すると自動的に保存されます。これで、編集と保存が並行して行われていることがわかりました。一方のスレッドで編集し、もう一方のスレッドで保存します。


  • 優れた答え、それは物事を単純に保ち、質問を見ているすべてのユーザーが関連することができる例を提供します。 - Smithers
  • プロセス内の複数のスレッドの編集/保存は良い例です。 - user645579

44

アプリケーションは1つ以上のプロセスで構成されています。プロセスは、最も簡単に言えば、実行中のプログラムです。 1つ以上のスレッドがプロセスのコンテキストで実行されます。スレッドは、オペレーティングシステムがプロセッサ時間を割り当てる基本単位です。スレッドは、現在別のスレッドによって実行されている部分を含め、プロセスコードの任意の部分を実行できます。ファイバーは、アプリケーションによって手動でスケジュールされる必要がある実行単位です。ファイバーは、それらをスケジュールするスレッドのコンテキストで実行されます。

から盗まれたここに


  • Linuxなどの他のオペレーティングシステムでは、スレッドが通常親プロセスと同じメモリスペースを共有することを除いて、オペレーティングシステムレベルでこの2つの間に実質的な違いはありません。 (だから私のマイナス投票) - Arafangion
  • 2つの要素とセグエの関係を簡単に予想される「次の質問」に示すので、良い答え(特にクレジット付き)。 (繊維について)。 - Smithers

24

プロセスは、コード、メモリ、データ、およびその他のリソースの集まりです。スレッドは、プロセスの範囲内で実行される一連のコードです。 (通常は)同じプロセス内で複数のスレッドを同時に実行することができます。


22

  • すべてのプロセスはスレッド(プライマリスレッド)です。
  • しかし、すべてのスレッドがプロセスではありません。それはプロセスの一部(実体)です。


  • あなたはもう少しそれを説明することができますそして/またはいくつかの証拠を含みますか? - Zim84
  • それで、スレッドを含まないプロセスはありませんね。 - PeerNet

18

プロセスとスレッドの実例 これにより、スレッドとプロセスに関する基本的な考え方がわかります。 enter image description here

Scott Langham's Answerから上記の情報を借りました。 - ありがとう


17

プロセスはアプリケーションの実行インスタンスです。どういう意味ですか?たとえば、Microsoft Wordのアイコンをダブルクリックすると、Wordを実行するプロセスが開始されます。スレッドはプロセス内の実行パスです。また、プロセスは複数のスレッドを含むことができます。 Wordを起動すると、オペレーティングシステムがプロセスを作成し、そのプロセスのプライマリスレッドの実行を開始します。

スレッドはプロセスができることなら何でもできることに注意することが重要です。しかし、プロセスは複数のスレッドで構成されることがあるので、スレッドは「軽量」プロセスと見なすことができます。したがって、スレッドとプロセスの本質的な違いは、それぞれが達成するために使用される作業です。スレッドは小さなタスクに使用されますが、プロセスはより重いタスク、基本的にはアプリケーションの実行に使用されます。

スレッドとプロセスのもう1つの違いは、同じプロセス内のスレッドは同じアドレス空間を共有するのに対し、異なるプロセスは共有しないという点です。これにより、スレッドは同じデータ構造および変数から読み書きでき、またスレッド間の通信も容易になります。プロセス間の通信 - IPC、またはプロセス間通信としても知られている - は、非常に困難でリソース集約的です。


  • この説明に加えて、ある瞬間にCPUは単一のプロセス/スレッドを処理しているということを追加するのは良い考えかもしれません。また、CPUは1秒間に1つのスレッド/プロセスから別のスレッド/プロセスにすばやく切り替わるので、並行操作の外観/錯覚/効果が得られます。 - Casey Flynn
  • 「スレッドは小さなタスクに使用されますが、プロセスはより重いタスク、基本的にはアプリケーションの実行に使用されます。」 - プロセスにはプロセッサ時間がないのでコードは実行されないので、あなたは間違っています。スレッドのみがコードを実行します - Konstantins Bogdanovs

17

プロセス:

  1. プロセスは重いプロセスです。
  2. プロセスは、別々のメモリ、データ、リソースなどを持つ別々のプログラムです。
  3. プロセスはfork()メソッドを使用して作成されます。
  4. プロセス間のコンテキスト切り替えは時間がかかります。

例:

たとえば、任意のブラウザ(mozilla、Chrome、IE)を開いてください。この時点で、新しいプロセスが実行を開始します。

スレッド:

  1. スレッドは軽量プロセスです。スレッドはプロセス内にバンドルされています。
  2. スレッドは共有メモリ、データ、リソース、ファイルなどを持っています。
  3. スレッドはclone()メソッドを使って作成されます。
  4. スレッド間のコンテキスト切り替えは、プロセスとしてはそれほど時間がかかりません。

例:

ブラウザで複数のタブを開く


  • Windowsの世界では正しいのですが、Linuxではすべての'スレッド'はプロセスであり、同様に重いものです。 (または光)。 - Neil

12

プロセスとスレッドはどちらも独立した実行シーケンスです。一般的な違いは、(同じプロセスの)スレッドは共有メモリ空間で実行されるのに対し、プロセスは別々のメモリ空間で実行されることです。

プロセス

実行中のプログラムです。テキストセクション、つまりプログラムコード、プログラムカウンタの値で表される現在のアクティビティ、プロセッサレジスタの内容。また、一時データ(関数パラメータ、リターンアドレス変数、ローカル変数など)を含むプロセススタック、およびグローバル変数を含むデータセクションも含まれます。プロセスには、プロセス実行時に動的に割り当てられるメモリであるヒープも含まれます。

スレッドはCPU使用率の基本単位です。スレッドID、プログラムカウンタ、レジスタセット、およびスタックで構成されています。それは、同じプロセスに属する他のスレッドと、そのコードセクション、データセクション、およびオープンファイルやシグナルなどの他のオペレーティングシステムリソースと共有していました。

- Galvinによるオペレーティングシステムからの引用


10

スレッドとプロセスはどちらもOSリソース割り当てのアトミック単位です(つまり、CPU時間がそれらの間でどのように分割されるかを記述する並行性モデルと、他のOSリソースを所有するモデルです)。違いがあります:

  • 共有リソース(スレッドは定義によりメモリを共有しています。スタックやローカル変数以外は何も所有していません。プロセスもメモリを共有できますが、そのためにOSによって維持されている別のメカニズムがあります)
  • 割り当てスペース(プロセス用のカーネルスペースとスレッド用のユーザースペース)

上記のGreg Hewgillは、「プロセス」という単語のアーラン語の意味については正しかった。ここにErlangがなぜプロセスを軽量にできるのかという議論があります。


9

Javaの世界に関するこの質問に答えようとしています。

プロセスはプログラムの実行ですが、スレッドはプロセス内の単一の実行シーケンスです。プロセスは複数のスレッドを含むことができます。スレッドは時々呼ばれます軽量プロセス

例えば:

例1 JVMは単一のプロセスで実行され、JVM内のスレッドはそのプロセスに属するヒープを共有します。そのため、複数のスレッドが同じオブジェクトにアクセスすることがあります。スレッドはヒープを共有し、独自のスタックスペースを持ちます。これが、あるスレッドがメソッドとそのローカル変数を呼び出すことを他のスレッドから安全に守る方法です。しかし、ヒープはスレッドセーフではなく、スレッドセーフのために同期させる必要があります。

例2 プログラムはキーストロークを読んで絵を描くことができないかもしれません。プログラムはキーボード入力に十分注意を払う必要があり、一度に複数のイベントを処理する機能が欠けているとトラブルにつながります。この問題に対する理想的な解決策は、プログラムの2つ以上のセクションを同時にシームレスに実行することです。スレッドはこれを可能にします。ここでの描画画像は処理で、キー入力の読み取りはサブ処理(スレッド)です。


  • 良い答え、私はそれがその範囲(Javaの世界)を定義し、いくつかの適用可能な例を提供しているのが好きです - 最初の質問をしなければならないだれでもすぐに関係することができる例(#2)を含みます。 - Smithers

9

スレッドとプロセスの違いは?

プロセスはアプリケーションの実行インスタンスであり、スレッドはプロセス内の実行パスです。また、プロセスには複数のスレッドを含めることができます。スレッドがプロセスでできることなら何でもできることに注意することが重要です。しかし、プロセスは複数のスレッドで構成されることがあるので、スレッドは「軽量」プロセスと見なすことができます。したがって、スレッドとプロセスの本質的な違いは、それぞれが達成するために使用される作業です。スレッドは小さなタスクに使用されますが、プロセスはより重いタスク、基本的にはアプリケーションの実行に使用されます。

スレッドとプロセスのもう1つの違いは、同じプロセス内のスレッドは同じアドレス空間を共有するのに対し、異なるプロセスは共有しないという点です。これにより、スレッドは同じデータ構造および変数から読み書きでき、またスレッド間の通信も容易になります。プロセス間の通信 - IPC、またはプロセス間通信としても知られている - は、非常に困難でリソース集約的です。

スレッドとプロセスの違いの概要は次のとおりです。

  1. スレッドはプロセスよりも作成が簡単です。 別のアドレススペースを必要としないでください。

  2. マルチスレッドはスレッドから慎重なプログラミングを必要とします 1つのスレッドによってのみ変更されるべきデータ構造を共有する 一度に。スレッドとは異なり、プロセスは同じものを共有しません アドレス空間

  3. 彼らは遠くを使用するため、スレッドは軽量と見なされます プロセスより少ないリソース。

  4. プロセスは互いに独立しています。それ以来、スレッド 同じアドレス空間を共有することは相互依存しているので注意してください。 異なるスレッドが互いに踏み込まないようにする必要があります。

    これは、上記の#2を述べる別の方法です。

  5. プロセスは複数のスレッドで構成できます。


7

インタビュアーの観点からすると、プロセスには複数のスレッドが存在する可能性があること以外に、基本的に3つだけ聞きたいことがあります。

  1. スレッドは同じメモリ空間を共有します。つまり、スレッドは他のスレッドメモリからメモリにアクセスできます。プロセスは通常できません。
  2. リソースリソース(メモリ、ハンドル、ソケットなど)はプロセスの終了時に解放され、スレッドの終了時には解放されません。
  3. セキュリティプロセスには固定セキュリティトークンがあります。一方、スレッドはさまざまなユーザー/トークンになりすますことができます。

あなたがもっと欲しいならば、スコットランガムの反応はほとんどすべてをカバーします。 これらはすべてオペレーティングシステムの観点からのものです。タスク、軽量スレッドなど、さまざまな言語でさまざまな概念を実装できますが、それらはスレッド(Windowsではファイバー)を使用するための単なる方法です。 ハードウェアとソフトウェアのスレッドはありません。ハードウェアとソフトウェアがあります例外そして割り込みまたはユーザーモードとカーネルスレッド


  • あなたがセキュリティトークンを言うとき、あなたは例えばLinuxのもののようなユーザー資格情報(username / pass)を意味しますか? - user645579
  • Windowsでは、これは複雑なトピックです。セキュリティトークン(実際にはアクセストークンと呼ばれる)は大きな構造で、アクセスチェックに必要なすべての情報が含まれています。この構造は承認後に作成されます。つまり、ユーザー名/パスワードはありませんが、ユーザー名/パスワードに基づくSIDの一覧が表示されます。詳細はこちら:msdn.microsoft.com/ja-jp/library/windows/desktop/… - AndreiM

7

以下は私が上の記事の一つから得たものですコードプロジェクト。私はそれが必要なすべてを明確に説明していると思います。

スレッドは、ワークロードを別々のものに分割するためのもう1つのメカニズムです。   実行ストリームスレッドはプロセスよりも軽量です。この   つまり、本格的なプロセスよりも柔軟性が劣りますが、   オペレーティングシステムに必要なものが少ないため、より早く開始できます。   セットアップ。プログラムが2つ以上のスレッドで構成されている場合、すべての   スレッドは単一のメモリ空間を共有します。プロセスは別々のアドレス空間を与えられます。   すべてのスレッドが単一のヒープを共有します。しかし、各スレッドはそれ自身のスタックを与えられます。


  • スレッド対プロセスをすでに理解しているという観点から来ていない限り、これが明確かどうかわからない。それらがお互いにどのように関連しているかを加えることは役に立つかもしれません。 - Smithers
  • 明確ではありません。 1つのプロセスとそのスレッドだけを意味しますか?それぞれに多数のスレッドを持つ多数のプロセスがあるとどうなりますか?これらすべてのスレッドは単一のメモリ空間を共有しますか?これらすべてのプロセスのうち? - Green

6

  1. 基本的に、スレッドはプロセススレッドが動作できないはずのないプロセスの一部です。
  2. スレッドは軽量ですが、プロセスはヘビー級です。
  3. プロセス間の通信にはある程度の時間がかかりますが、スレッドでは時間がかかりません。
  4. プロセスは別々に存続しますが、スレッドは同じメモリ領域を共有できます。


6

プロセス:実行中のプログラムはプロセスとして知られています

:スレッドは、「他と1つずつ」という概念に基づいてプログラムの他の部分と一緒に実行される機能なので、スレッドはプロセスの一部です。


  • 悪くないが、質問をする人にとってはおそらく無関係な新しい概念(「他のものとの1つ」)が導入されている。 - Smithers
  • Postはコードとしてフォーマットされていますが、通常のテキストであるべきです。 - Heinrich

6

http://lkml.iu.edu/hypermail/linux/kernel/9608/0191.html

Linus Torvalds(torvalds@cs.helsinki.fi)

1996年8月6日火曜日12:47:31 +0300(夏時間を食べる)

メッセージのソート順:[日付] [スレッド] [件名] [作者]

次のメッセージ:Bernd P. Ziller: "Re:おっとget_hash_tableにおっと"

前のメッセージ:Linus Torvalds: "Re:I / Oリクエストの順序付け"

1996年8月5日月曜日、Peter P. Eiserlohは次のように書いています。

スレッドの概念を明確にしておく必要があります。あまりにも多くの人々     スレッドとプロセスを混同しているようです。以下の議論     Linuxの現状を反映しているのではなく、むしろ     ハイレベルの議論を続けるように努める。

いいえ!

「スレッド」と「プロセス」があると考える理由はありません。   別々のエンティティ。それが伝統的なやり方ですが、私は   個人的にそのように考えるのは大きな間違いだと思います。唯一の   そのように考える理由は歴史的な手荷物です。

スレッドもプロセスも本当に1つのことです。   人工的に異なる事件を区別しようとすることはちょうど   自己制限的です。

COEと呼ばれる「実行の文脈」はまさにコングロマリットです。   そのCOEのすべての状態の。その状態はCPUのようなものを含みます   状態(レジスタなど)、MMU状態(ページマッピング)、許可状態   (uid、gid)とさまざまな「通信状態」(オープンファイル、シグナル   ハンドラなど)伝統的には、 "スレッド"と "スレッド"の違い   「プロセス」は主にスレッドがCPU状態を持っていることです(+おそらく   他の最小限の状態)、その他の文脈はすべて   プロセス。しかし、それだけです1COEの全体的な状態を分割する方法であり、それが正しい方法であると言うことは何もありません。自分を制限する   そのようなイメージには単なるバカです。

Linuxがこれについて考える方法(そして私が物事を動かしたい方法)は   あのです「プロセス」や「スレッド」などはありません。がある   COEの全体のみ(Linuxでは「タスク」と呼ばれています)。異なるCOE   文脈の一部を互いに共有することができます。サブセットの   共有は伝統的な "スレッド" / "プロセス"設定ですが、   実際にはサブセットのみと見なされるべきです(これは重要なサブセットですが、   その重要性はデザインからではなく、標準から来ています。   標準準拠のスレッドプログラムをLinux上で実行したい   も)。

一言で言えば:スレッド/プロセスの考え方を中心に設計しないでください。の   カーネルはCOEの考え方を中心に設計されるべきです。   pthreadsとしょうかん制限付きpthreadインターフェースをユーザーにエクスポートできます   COEの見方をそのまま使いたいのです。

COEを次のように考えたときに可能になることの一例として   スレッド/プロセスとは反対に:

  • あなたは外部の "cd"プログラムを行うことができます。これはUNIXやプロセス/スレッドでは伝統的に不可能なことです(愚かな例ですが   あなたはこれらの種類の "モジュール"に制限されないことができるということです。   伝統的なUNIX / threadsの設定)を実行します。

クローン(CLONE_VM | CLONE_FS);

子:execve( "external-cd");

/ * "execve()"はVMとの関連付けを解除します。   使用されたCLONE_VMはクローン作成の動作をより速くするためでした* /

  • あなたは自然に "vfork()"をすることができます(それは最小限のカーネルサポートを混ぜ合わせますが、そのサポートはCUAの考え方の考え方に完全に合っています):

クローン(CLONE_VM);

子:実行し続け、最終的にexecve()

母親:execveを待つ

  • あなたは外部の "IOデーモン"をすることができます:

クローン(CLONE_FILES);

子:オープンファイルディスクリプタなど

母親:子供が開いたvdのfdを使う。

あなたはスレッド/プロセスに縛られていないので、上記の作業のすべて   考え方。たとえばWebサーバを考えてみましょう。   スクリプトは「実行スレッド」として実行されます。あなたはそれをすることはできません   従来のスレッドは常に共有する必要があるため、従来のスレッド   アドレス空間全体なので、これまでのすべてのものをリンクする必要があります。   Webサーバー自体でやりたかった(「スレッド」は別のスレッドを実行することはできません)   実行可能ファイル)

これを「実行のコンテキスト」問題として考えるのではなく、   タスクは外部プログラムを実行することを選択できるようになりました。   彼らがしたい、または彼らがすることができる場合は、親からのアドレス空間など)   例すべてを親と共有するを除くファイル用   ディスクリプタ(サブ "スレッド"がたくさんのファイルを開くことなく開くことができるように)   親は心配する必要があります。   サブ「スレッド」は終了し、それは親でfdを使い果たしません)。

たとえば、スレッド化された "inetd"を考えてください。あなたは低いオーバーヘッドが欲しい   fork + execなので、Linuxの方法では "fork()"の代わりに使用できます。   各スレッドが作成されるマルチスレッドinetdを書く   CLONE_VM(アドレス空間を共有しますが、ファイル記述子は共有しません)   等)。それから子はそれが外部サービスであるなら実行することができます(rlogind、   例えば)、あるいはそれは内部inetdサービスの1つでした。   (echo、timeofday)その場合それはただそれが事をして終了します。

"thread" / "process"ではそれができません。

ライナス


5

組み込みの世界から来て、私はプロセスの概念が「大きな」プロセッサにのみ存在することを付け加えたいと思います。デスクトップCPU、ARM Cortex A-9MMU(メモリ管理ユニット)、およびMMUの使用をサポートするオペレーティングシステム(Linux)小型/昔のプロセッサやマイクロコントローラと小型RTOSオペレーティングシステム(リアルタイムオペレーティングシステムfreeRTOSのような)、MMUサポートはなく、プロセスもスレッドもありません。

スレッド互いのメモリにアクセスすることができ、それらはOSによってインターリーブ方式でスケジュールされているので、それらは並列に実行されるように見えます(あるいはマルチコアではそれらは実際に並列に実行されます)。

プロセス一方、MMUによって提供および保護されている仮想メモリのプライベートサンドボックスに住んでいます。次のことが可能になるので便利です。

  1. バグの多いプロセスがシステム全体をクラッシュさせないようにする。
  2. 他のプロセスのデータを非表示にしてセキュリティを維持する 手が届きません。 プロセス内部の実際の作業は、1つ以上のスレッドによって処理されます。


5

  1. スレッドは共有メモリ空間で実行されますが、プロセスは別のメモリ空間で実行されます。
  2. スレッドは軽量のプロセスですが、プロセスは重量のあるプロセスです。
  3. スレッドはプロセスのサブタイプです。


  • これは非常に再帰的です。スレッドとプロセスの関係が拡張されていれば、おそらくもっと良い答えになるでしょう。 - Smithers

4

マルチスレッドを組み込んだPython(インタプリタ言語)でアルゴリズムを構築している間、以前に構築したシーケンシャルアルゴリズムと比較した場合、実行時間がそれほど良くないことに驚いた。この結果の理由を理解するために、私はいくつかの読書をしました、そして私が学んだことがマルチスレッドとマルチプロセスの違いをよりよく理解するためにそこから興味深い文脈を提供すると信じます。

マルチコアシステムは複数の実行スレッドを実行することがあるので、Pythonはマルチスレッドをサポートするべきです。しかし、Pythonはコンパイル言語ではなく、インタプリタ言語です。1。つまり、プログラムは実行するために解釈される必要があり、インタプリタはプログラムが実行を開始する前にそのプログラムを認識しません。しかし、それが知っているのはPythonの規則であり、それからそれらの規則を動的に適用します。その場合、Pythonでの最適化は、主にインタプリタ自体の最適化であり、実行されるコードではありません。これはC ++などのコンパイルされた言語とは対照的であり、Pythonでのマルチスレッドに影響します。具体的には、Pythonはマルチスレッドを管理するためにGlobal Interpreter Lockを使用します。

一方、コンパイルされた言語は、よくコンパイルされています。プログラムは「完全に」処理されます。最初に構文定義に従って解釈され、次に言語にとらわれない中間表現にマッピングされ、最後に実行可能コードにリンクされます。このプロセスにより、コンパイル時にすべてのコードが利用可能になるため、コードを高度に最適化することができます。実行可能プログラムが作成された時点でさまざまなプログラムの相互作用および関係が定義され、最適化についての堅固な決定を下すことができます。

現代の環境では、Pythonのインタプリタはマルチスレッドを許可しなければなりません、そしてこれは安全で効率的でなければなりません。これこそが、インタプリタ言語とコンパイル言語との違いが現れているところです。インタプリタは、同時に計算のためにプロセッサの使用を最適化しながら、異なるスレッドからの内部共有データを乱すべきではありません。

前の記事で述べたように、プロセスとスレッドは独立した順次実行です。主な違いは、プロセスの複数のスレッド間でメモリが共有されるのに対し、プロセスはそれらのメモリ空間を分離することです。

Pythonでは、データはGlobal Interpreter Lockによって異なるスレッドによる同時アクセスから保護されています。どのPythonプログラムでも、一度に実行できるスレッドは1つだけである必要があります。一方、各プロセスのメモリは他のプロセスから分離されており、プロセスは複数のコアで実行できるため、複数のプロセスを実行することが可能です。


1Donald Knuthは、「The Art of Computer Programming:基本的なアルゴリズム」の中の解釈ルーチンについてよく説明しています。


4

Linux KernelのOS Viewから答えようとしている

プログラムは、メモリに起動されるとプロセスになります。プロセスには、コンパイル済みコードを格納するための.text segement、初期化されていない静的変数またはグローバル変数を格納するための.bssなど、さまざまなセグメントをメモリ内に持つことを意味する独自のアドレス空間があります。スタック。カーネル内部では、各プロセスは独自のカーネルスタック(セキュリティ問題のためにユーザースペーススタックと分離されています)と、task_structこれは一般的にプロセス制御ブロックとして抽象化されており、プロセスの優先順位、状態などのプロセスに関するすべての情報(およびその他の大量のチャンク)をすべて格納しています。プロセスは複数の実行スレッドを持つことができます。

スレッドになると、それらはプロセス内に存在し、ファイルシステムリソース、保留中のシグナルの共有、データ(変数と命令)の共有などのスレッド作成中に渡すことができる他のリソースと共に親プロセスのアドレス空間を共有します。したがって、より速いコンテキスト切り替えが可能になります。カーネル内部では、各スレッドは独自のカーネルスタックを持っています。task_structスレッドを定義する構造体したがって、カーネルは同じプロセスのスレッドを異なるエンティティと見なし、それ自体でスケジュールを組むことができます。同じプロセス内のスレッドは、スレッドグループIDと呼ばれる共通のIDを共有します。tgid)、プロセスIDと呼ばれる一意のIDもあります。pid


4

視覚化による学習に慣れている人のために、プロセスとスレッドを説明するために私が作成した便利な図を示します。

私はMSDNからの情報を使用しました - プロセスとスレッドについて

Processes and Threads


  • 追加するのが面白いかもしれません別のマルチスレッドがマルチプロセッシングとどのように比較されるかを見るためだけに処理します。 - Bram Vanroy

3

同じプロセス内のスレッドはメモリを共有しますが、各スレッドは独自のスタックとレジスタを持ち、スレッド固有のデータをヒープに格納します。スレッドは独立して実行されることはないので、スレッド間通信はプロセス間通信に比べてはるかに高速です。

プロセスが同じメモリを共有することはありません。子プロセスが作成されると、親プロセスのメモリ位置が複製されます。プロセス通信は、パイプ、共有メモリ、およびメッセージ解析を使用して行われます。スレッド間のコンテキスト切り替えは非常に遅いです。


2

ほとんど同じですが、コンテキストの切り替えや作業負荷などの観点から、スレッドが軽量でプロセスが重いという点が主な違いです。


  • あなたの答えを詳しく教えてください。 - Fiver
  • スレッドはサブプロセスであり、プロセス内のコード、データ、ファイルなどの共通リソースを共有します。2つのプロセスがリソースを共有することはできません(例外は、プロセス(親)が別のプロセス(子)を作成する場合)このコンテキストではスレッドははるかに軽量ですが、シングルスレッドプロセスはI / Oのためにブロックされていると考えます。待機状態ですが、マルチスレッドプロセスがI / Oによってブロックされている場合は、その唯一の1 I / O関連スレッドがブロックされます。 - Nasir Ul Islam Butt

2

私がこれまでに見た中で最高の短い定義は、Michael Kerriskの「The Linux Programming Interface」から来ています。

最近のUNIXの実装では、各プロセスは複数のスレッドを持つことができます。   実行のスレッドを想定する1つの方法は、一連のプロセスとしてです。   同じ仮想メモリを共有している   属性各スレッドは同じプログラムコードと共有を実行しています。   同じデータ域とヒープ。ただし、各スレッドには独自のスタックがあります   ローカル変数と関数呼び出しリンケージ情報を含みます。 [LPI 2.12]


1

例1:JVMは単一プロセス内で実行され、JVM内のスレッドはそのプロセスに属するヒープを共有します。そのため、複数のスレッドが同じオブジェクトにアクセスすることがあります。スレッドはヒープを共有し、独自のスタックスペースを持ちます。これが、あるスレッドがメソッドとそのローカル変数を呼び出すことを他のスレッドから安全に守る方法です。しかし、ヒープはスレッドセーフではなく、スレッドセーフのために同期させる必要があります。


1

所有単位やタスクに必要なリソースなどのプロセスを検討します。プロセスは、メモリ空間、特定の入出力、特定のファイル、優先順位などのリソースを持つことができます。

スレッドとは、ディスパッチ可能な実行単位、つまり簡単な言葉で言えば、一連の命令による進行のことです。

リンクされた質問


関連する質問

最近の質問