プログラムのパフォーマンス解析

基本概念

マルチスレッドモデルにおいて、 プロセスは共通のアドレス空間およびその他のプロセス資源のほとんどを共有する 1 つまたは複数の制御のスレッドから構成されます。スレッドは、共有するデータに関連したロックを獲得し、解放しなければなりません。 こうした操作を行わないと、 データの競合が起こる可能性があります (こうした状況では、同じ入力を基に実行を繰り返したとしても、プログラムは異なる結果を生み出す可能性があります)。

データ競合は比較的起こりやすい問題の 1 つです。最初に適切なロックを獲得せずに、変数を利用しようとすると、簡単に起こります。その一方で、データ競合はその発見が困難です。一般的には、適切に保護されていないデータに対して、2 つのスレッドがほぼ同じタイミングでアクセスしようとしたときにのみ、その兆候は現れます。したがって、データ競合が問題の兆候を見せることなく、数カ月に渡って正常に動作することもあるのです。どんなに単純なマルチスレッドプログラムであっても、プログラムのすべての並列動作状況を徹底的にテストすることは困難であるため、従来のテストおよびデバッグ方法ではデータ競合を十分に防ぐことはできませんでした。

ほとんどのプロセスは複数の資源を共有しています。アプリケーション内での動作は、複数の資源の利用を必要とします。これはつまり、プロセスの実行前には、各資源に対するロックを取得しておく必要があるということです。異なる操作が共通の一連の資源を利用し、ロックを取得する順番に整合性がない場合、デッドロックの可能性が生じます。たとえば、2 つのスレッドが異なる資源のロックを獲得した後、各スレッドがもう一方のスレッドが所有する資源のロックを獲得しようとする際に、最も単純な デッドロックが起こります。