2010/08/11

真のマルチスレッド

NILScriptでは、HTTPDの応答処理やキー・マウスのフックなど、様々な処理がマルチスレッドで並列実行されるようになっています。
また、Thread.create()というメソッドを使用すれば、任意の関数を新規スレッドで実行させられます。
これにより、HTTPの通信など時間のかかる処理を行っている間に、その処理の完了を待つ必要がない他の処理を進めたりできます。

スクリプト実行環境のマルチスレッドというと、スクリプトエンジンが独自に複数の処理を切り替えながら少しずつ実行することで並列実行されているように見せる疑似マルチスレッドと、OSのスレッドの仕組みを利用して並列実行を行う真のマルチスレッドなど、いくつかの方式がありますが、NILScriptでは真のマルチスレッドが使用されています。
これは、NILScriptで利用しているJavaScriptエンジンのSpiderMonkeyが、いくつかの点に注意するだけで簡単に真のマルチスレッドでの利用が出来るようになっているおかげです。

NILScriptでは、多くの処理を外部のDLLが提供する関数を利用して実現していますが、そんな関数の中には処理に時間のかかる物も少なくありません。もし疑似マルチスレッドしか用意されていなかったら、データの読み込みなどを行っている間にキーボードフックの応答処理が実行できずに操作不能になるなど、様々な問題に見舞われることでしょう。
こうした問題に悩まされることなく様々な機能を実現するためには、真のマルチスレッドで実行できることが非常に重要なのです。

真のマルチスレッドには、マルチコアCPUなどの性能を引き出せるという利点もあります。実際のスレッドが一つしかない疑似マルチスレッドでは、一度に使われるコアは一つだけになっていまうので、デュアルコアCPUであれば50%までの性能しか引き出せませんが、各スレッドを別のコアで並列実行できる真のマルチスレッドでは、100%の性能を引き出せる場合もあるのです。
SpiderMonkeyでは、使われなくなったデータを解放するGCの際に他のスレッドを一時停止してしまうので、スクリプト部分での処理が多いとあまり高速化できない場合がありますが、外部DLLに画像処理などの時間がかかる処理をさせる場合は、CPUのコアの数だけスレッドを生成して並列実行させることで、CPUの性能の限界まで高速実行させられるでしょう。

0 件のコメント:

コメントを投稿