オーバーヘッドのほとんどはプロセスの作成によってすでに達成されているため、スレッドは「軽量」です。
私はこれをチュートリアルの1つで見つけました。
誰かがそれが正確に何を意味するのか詳しく説明できますか?
スレッドが「軽量」であるという主張は、プラットフォームによっては、必ずしも信頼できるとは限りません。
オペレーティングシステムスレッドは、ネイティブコードの実行をサポートする必要があります。 Cで書かれています。したがって、通常はメガバイト単位で測定される、適切なサイズのスタックを提供する必要があります。したがって、1000スレッドを開始した場合(おそらくサーバーへの1000の同時接続をサポートしようとして)、実際の作業を開始する前に、プロセスで1GBのメモリ要件が必要になります。
これは、拡張性の高いサーバーでは実際の問題であるため、軽量であるかのようにスレッドを使用しません。彼らはそれらを重い資源として扱います。代わりに、プール内に限られた数のスレッドを作成し、キューから作業項目を取得できるようにする場合があります。
これは、スレッドの寿命が長く、数が少ないことを意味するため、代わりにプロセスを使用する方がよい場合があります。そうすれば、アドレススペースを分離でき、リソースが不足しても問題は発生しません。
要約すると、スレッドに代わって行われる「マーケティング」の主張には注意してください。並列処理は素晴らしいですが(ますます不可欠になるでしょう)、スレッドはそれを実現する1つの方法にすぎません。
プロセスの作成は、独自のアドレス空間を使用してプロセス用に完全に新しい仮想メモリ空間を設定する必要があるため、「高価」です。 「高価」とは、CPU時間がかかることを意味します。
スレッドはこれを行う必要はなく、いくつかのポインターを変更するだけなので、プロセスを作成するよりもはるかに「安価」です。スレッドがこれを必要としない理由は、スレッドがアドレス空間と親プロセスの仮想メモリで実行されるためです。
すべてのプロセスには、少なくとも1つのスレッドが必要です。したがって、考えてみれば、プロセスを作成するということは、プロセスを作成し、スレッドを作成することを意味します。明らかに、スレッドのみを作成すると、時間とコンピューターによる作業が少なくなります。
さらに、スレッドはプロセス間通信を必要とせずに相互作用できるため、スレッドは「軽量」です。スレッド間の切り替えは、プロセス間の切り替えよりも「安価」です(ここでも、いくつかのポインターを移動するだけです)。また、プロセス間通信には、スレッドよりも高価な通信が必要です。
プロセス内のスレッドは同じ仮想メモリ空間を共有しますが、それぞれに個別のスタックがあり、実装されている場合は「スレッドローカルストレージ」になる可能性があります。 lightweightコンテキストスイッチは単にスタックポインタとプログラムカウンタを切り替えて他のレジスタを復元する場合であるため、processコンテキストスイッチにはMMUコンテキストも。
さらに、プロセス内のスレッド間の通信は、アドレス空間を共有するため、軽量です。
処理する:
糸:
スレッド共通のメモリ空間を共有するという理由だけで。メインスレッドに割り当てられたメモリは、他のすべての子スレッドによって共有されます。一方、プロセスの場合、子プロセスは個別のメモリスペースを割り当てる必要があります。
プロセスには1つ以上のスレッドが含まれており、スレッドはプロセスが実行できることをすべて実行できます。また、プロセス内のスレッドは同じアドレススペースを共有します。これは、同じコードセクション、データセクション、およびOSリソースを使用しているため、スレッド間の通信コストが低いため、スレッドのこれらすべての機能により、「軽量プロセス」になります。