31

プログラムが同時に 2 つのスレッドを実行できるかどうかを知りたいです (それは基本的に正しいために使用されるものですか?)。しかし、スレッド A で実行される 1 つの関数でシステム コールを実行し、スレッド B で実行される別の関数で他のタスクを実行する場合、それらは両方同時に実行できるでしょうか。関数はシステムコールが終了するまで待ちますか?

元の質問への追加: システム コールが実行されている間、このプロセスは中断できないプロセスでしょうか? UNIX/LINUX でシステム コールを使用することについて話しています。

4

7 に答える 7

63

マルチスレッドと並列処理は 2 つのまったく異なるトピックであり、それぞれ独自の会話に値しますが、紹介のために...

スレッド化:
実行可能ファイルを起動すると、プロセス内のスレッドで実行されます。別のスレッドを起動すると、それをスレッド 2 と呼びます。同じプロセス内で 2 つの実行チェーン (スレッド) が別々に実行されます。シングル コア マイクロプロセッサ (uP)では、複数のスレッドを実行できますが、並行して実行することはできません。概念的には、スレッドは同時に実行されるとよく​​言われますが、、実際には、オペレーティング システムによって割り当てられ、制御されるタイム スライスで連続して実行されます。これらのスライスは互いにインターリーブされます。そのため、スレッド 1 の実行ステップは、実際にはスレッド 2 の実行ステップと同時には発生しません。これらの動作は、通常、作成した数のスレッドに拡張されます。つまり、実行チェーンのパケットはすべて同じプロセス内で動作し、時間を共有します。オペレーティングシステムによって提供されるスライス。

したがって、システムコールの例では、他のスレッドの実行ステップを続行できるようにする前に終了するかどうかは、システムコールが何であるかによって異なります。何が起こるかについては、いくつかの要因が関係しています: ブロッキング コールですか? 1 つのスレッドが他のスレッドよりも優先度が高いか。タイム スライスの期間は?

C のスレッド化に関連するリンク:
SO Example
POSIX
ANSI C

並列処理:
マルチスレッド プログラムの実行が複数のコア システム (複数の uP、または複数のマルチコア uP) で発生する場合、スレッドは同時に実行することも、ワークロードを共有するために異なるスレッドが別々のコアに分割される可能性があるため、並列で実行することもできます。これは並列処理の一例です。

繰り返しになりますが、概念的には、並列処理とスレッド化は、物事を同時に実行できるという点で似ていると考えられています。しかし、それは概念のみであり、対象となるアプリケーションと技術の両方において、実際には非常に異なっています。スレッド化は、プロセス内のタスク全体を識別して分割する方法として役立ちます (たとえば、TCP/IP サーバーは、新しい接続が要求されたときにワーカー スレッドを起動し、接続して、その接続が残っている限り維持します)。 )、並列処理は通常、同じタスクの小さなコンポーネントを送信するために使用されます(例: 別々の場所で独立して実行できる複雑な計算セット) 別々のリソース (コア、または uP) にオフにして、同時に完了します。これは、複数のコアプロセッサが実際に違いを生む場所です. しかし、並列処理は、遺伝学MMORPGゲームなどの分野で人気のある複数のシステムも利用します。

C での並列処理に関連するリンク:
OpenMP
その他の OpenMP (例)
Gribble Labs - Introduction to OpenMP
CUDA Tookit from NVIDIA

スレッドとアーキテクチャの一般的なトピックに関する追加の読み物:

このスレッディングとアーキテクチャの概要は、ほんの表面をなぞっただけです。トピックには多くの部分があります。それらに対処するための本は小さな図書館を埋め尽くすだろうし、何千ものリンクがある。当然のことながら、より広いトピックの中で、いくつかの概念は理屈に従わないようです。たとえば、単にコア数を増やすだけでマルチスレッド プログラムが高速になるとは限りません

于 2013-10-11T18:16:36.413 に答える
7

はい、少なくとも潜在的には「同時に」実行されます。それがまさにスレッドの目的です。もちろん、多くの詳細があります。たとえば、次のとおりです。

  • 両方のスレッドが、たとえば同じファイル記述子に書き込むシステム コールを実行すると、一時的に相互にブロックされる可能性があります。

  • ミューテックスなどのスレッド同期プリミティブが使用されている場合、並列実行はブロックされます。

  • 2 つのスレッドを実際に同時に実行するには、少なくとも 2 つのコアを備えたプロセッサが必要です。

それは非常に大きく、非常に複雑な主題です。

于 2013-10-11T17:55:12.793 に答える
2

基本はシンプルですが、細部はすぐに複雑になります。

プログラムを複数のスレッドに分割することができ (そうするのが理にかなっている場合)、各スレッドは「独自のペースで」実行されます。たとえば、遅延しないファイル I/O を待機する必要がある場合などです。他のダウン。

単一のプロセッサでは、複数のスレッドは、何らかの方法でプロセッサを「タイム スライス」することで対応します。つまり、単純なクロック ベースで、または 1 つのスレッドを (I/O などで) 待機する必要があるまで実行させてから、次のスレッドに「切り替え」ます。スレッド。最大限の効率を得るためにこれを行うには、芸術/科学全体があります。

マルチプロセッサ (2 ~ 8 個の "コア" を持つ最新の PC など) では、各スレッドが個別のプロセッサに割り当てられ、十分な数のプロセッサがない場合は、シングル プロセッサの場合と同様に共有されます。

単一のスレッドによる操作の「原子性」を保証し、スレッドが相互に干渉しないことを保証する全体の領域は、信じられないほど複雑です。一般に、別のスレッドによって中断されないシステム コールの「カーネル」または「核」カテゴリがありますが、それはすべてのシステム コールの小さなサブセットに過ぎず、OS のドキュメントを参照して、どのカテゴリが特定のシステム コールが該当します。

于 2013-10-11T19:21:55.517 に答える
1

システムコールを実行しても、1 つのスレッドが別のスレッドから独立しているため、それらは同時に実行されます。

ただし、テストするのは非常に簡単です。コンソール出力に何かを出力する 1 つのスレッドを作成し、別のスレッドでシステム コールを実行することができます。これにはある程度の時間がかかることがわかっています。メッセージが他のスレッドによって引き続き出力されることに気付くでしょう。

于 2013-10-11T17:53:20.800 に答える
1

はい、プログラムはthreads同時に 2 つ実行できます。

それは マルチスレッドと呼ばれます。

両方を同時に実行できますか、それとも 2 番目の関数はシステム コールが終了するまで待機しますか?

どちらも同時に実行できます。


必要に応じて、スレッド A が完了するか逆になるまでスレッド B を待機させることができます

于 2013-10-11T17:56:11.133 に答える
0

2 つのスレッドは、複数のコア プロセッサ システムで実行されている場合にのみ同時に実行できますが、コア プロセッサが 1 つしかない場合は、2 つのスレッドを同時に実行することはできません。そのため、一度に 1 つのスレッドのみが実行され、そのジョブが終了すると、キューにある次のスレッドに時間がかかります。

于 2014-07-15T10:23:17.747 に答える