プロセッサが多ければいいのか

HTの一般化とPentium Dの登場で、マルチコアや並列処理が普通のパソコンでも使われるようになると、CPUをOS専用とアプリ専用に分ければパソコンが速く動くのではという書き込みを見ましたが、マルチプロセッサの環境下でプロセッサの役割分担を固定すると、アービトレーションhttp://www.nifty.com/webapp/digitalword/word/012/01275.htm)とコヒーレンシ(http://techon.nikkeibp.co.jp/word/data/ID0310.html)のために、実行効率が極端に悪化します。
せっかくスレッド化されているのに、実行ユニット(プロセッサ)が決められてるといろいろな不都合が起こります。
例えば、指定されたプロセッサが他の処理中なら他のプロセッサが空いていても、指定されたプロセッサが空くまで待たなくてはいけません。高速道路の料金所で他のゲートが空いているのに1箇所のゲートだけに集中しているようなものです。
また、スレッドが特定の処理するデータは、キャッシュメモリにあるはずですが、待たされている間に、キャッシュメモリの内容が他のスレッドによって変更され、順番が回ってきたときには、データがキャッシュから消えている可能性も出てきます。これが、コヒーレンシです。なので、キャッシュメモリやリアルメモリの内容が変わらないようロックするという方法もありますが、メモリやバスをロックすると他のスレッドがその影響で止まったり、別なコヒーレンシが起こる可能性があります。さらに、リソースのロックは単純にできるものではなく、OSの深い部分まで影響が及びます。複数のイニシエータが存在する環境でリソースを使うにはアービトレーションをコントロールするマスタが必須です。なので、実行ユニットを固定してスレッドの流れを悪くすると、アービトレーションが多発してマスタに負荷が掛かります。
さらに、最近のプロセッサは、プリフェッチやアウトオブオーダーを多用しているので、スレッドの流れが悪いと、スパースカラーでのペナルティが多発します。
スレッド化されたOS環境下では、いかにスレッドを遅滞無くプロセッサに送り込めるか、そして、スレッドを効率よく分解してパイプラインに放り込むことができれば、処理が遅れることは無くなり、アービトレーションやコヒーレンシが起こることも減ります。
処理すべきスレッドがシングルプロセッサ処理の限界に達したとき、手の空いているプロセッサが溢れたスレッド処理してくれるのがマルチプロセッサの効果です。ただし、プロセッサが増えればアービトレーションやコヒーレンシの問題が起こり、その調停のためにプロセッサのパワーが使われます。PS3のセルは調停用プロセッサを使いアービトレーションやコヒーレンシを解決しています。