付録 A タイムスライスのコスト

付録 A タイムスライスのコスト#

タイムスライスにより、物理スレッドよりも多くの論理スレッドが可能になります。各論理スレッドは、物理スレッドによってタイムスライス単位で処理されます。。ほとんどの場合、スレッドがタイムスライスよりも長い時間実行されると、次の順番が回ってくるまで物理スレッドは放棄されます。この付録では、タイムスライスによって発生するコストについて説明します。

最も明らかなコストは、論理スレッド間のコンテキスト・スイッチにかかる時間です。コンテキスト・スイッチでは、プロセッサーで実行中の論理スレッドのすべてのレジスターを退避し、次に実行する論理スレッドの情報を含むレジスターをロードする必要があります。

それよりもコストがかかるのは、キャッシュの冷却と呼ばれる現象です。プロセッサーは、最近アクセスされたデータをキャッシュに保持します。キャッシュはメインメモリーに比べると、非常に高速ですが、容量は小さいものです。プロセッサーは、キャッシュを使い果たすと、キャッシュからデータを排出し、メインメモリーに戻します。これには、通常はキャッシュの中で最も古いデータが選ばれます(実際のセット・アソシエーティブ・キャッシュ (連想方式キャッシュ) ではもう少し複雑です)。論理スレッドがタイムスライスを取得し、データを初めて参照すると、数百サイクルを費やしてデータはメモリーからキャッシュに読み込まれます。データが頻繁に参照され、退避されない場合、後続の参照はキャッシュ中のデータを利用できるため、数サイクルを要するだけで済みます。そのようなデータは、「キャッシュでホット」であると呼ばれます。タイムスライスでは、スレッド A がそのタイムスライスを終了し、後続のスレッド B が同じ物理スレッドで実行されると、両方のスレッドでそのデータが必要でない限り、B は A が利用したキャッシュでホットであったデータを排出する傾向があります。スレッド A が次のタイムスライスを取得すると、それぞれのキャッシュミスに数百サイクルを費やして、排出によって退避されたデータを再びロードします。さらに、スレッド A の次のタイムスライスは、異なるキャッシュを持つ異なる物理スレッド上にある可能性もあります。

もう 1 つのコストはロックのプリエンプションです。これは、スレッドがロックを取得し、そのタイムスライスが、ロックを解放する前に時間切れになったときに発生する現象です。スレッドがロックを保持する時間が短かったとしても、少なくともタイムスライスで次の順番が来るまでの間、ロックを保持することになります。ロック上で待機している別のスレッドは、無駄にビジーウェイトになったり、あるいは、残りのタイムスライスを失うことになります。これは、前のプリエンプトされたスレッドの実行が再開されるのをコンボイ (数珠つなぎ)に待機するため、コンボイと呼ばれます。