スレッドとプロセスに関するいくつかの質問

スレッドとプロセスに関するいくつかの質問

面接(C++ 面接)でこれらの質問を受けました。答えに自信がないので、もっと知りたいです。

  1. スレッドは別のスレッドを作成できますか?
  2. プロセスは別のプロセスを作成できますか?
  3. スレッドはプロセスを作成できますか?
  4. プロセスはスレッドを作成できますか?

答え1

  1. はい、スレッドは別のスレッドを作成できます。UNIX では、これは (低レベルでは) コマンドを通じて行われclone()、高レベルでは C コーディングのpthreadライブラリを通じて行われます。

  2. はい、プロセスは別のプロセスを起動できます。これは常に発生します。最も一般的なタイプのプロセス -> プロセスは、経由ですfork()

  3. これについてはよくわかりません。ここで、スレッドにはカーネル レベルのスレッドとユーザー レベルのスレッドという 2 つの主要な種類があることを述べておきたいと思います。カーネル レベルのスレッドは (一般に) 主要なプロセスに関連付けられていますが、ユーザー レベルのスレッドはこれらのプロセスによって (つまりカーネル レベルのスレッドによって) 生成されます。例外もあるおそらく誰かがスレッド -> プロセスに対してもっと良い答えを出せるでしょう。

  4. はい。3のコメントを参照してください。

答え2

実行されるコードは何でも実行できます。

とはいえ、プロセスはコードではありません。スレッドは実際に実行されるものであり、プロセスはそれを囲む環境です。したがって、(1) と (3) は真ですが、残りは偽です。

答え3

すべてにそうです。

Windows ではプロセスは実際には「実行」されないことを理解すると役立つかもしれません。実行されるのはスレッドです。すべてのプロセスには少なくとも 1 つのスレッドがあります。したがって、実際の質問は次のとおりです。

  • コードを実行すると別のスレッドが作成されますか? はい。

Windowsでは、CreateThread APIまたはその類似のAPIでこれを実行します。長いバージョンは「スレッドのコンテキストで実行されているコードは別のスレッドを作成できますか?」となります。確かにそうですが、全てコードは何らかのスレッドのコンテキストで実行されるため、余分な説明は必要ありません。CreateThread は、新しいスレッドのトップレベル関数 (基本的には新しいスレッドの「メイン」) となる関数のアドレスを引数として受け取ります。

  • コードを実行すると別のプロセスが作成されますか? はい。

前回と同様、スレッドのコンテキストで実行しているときは、スレッドを所有するプロセスのコンテキストでも実行しています。つまり、CreateProcess API があり、これを使用して別のプロセスを作成できます。

また、新しいプロセスに自動的に、さらに手間をかけずにスレッドが作成されます。これは、(プロセスが実行されないため) スレッドのないプロセスは何もできないためです。新しいプロセスの最初のスレッドは、プログラムの「メイン」関数 (main() または WinMain() など) の実行を開始します。

関連情報