第15回 GCCにおけるマルチスレッドへの対応

岸 哲夫

 昨年12月にリリースされたLinuxのカーネル2.6は従来までのカーネルと比較して,大きく進化した.中でもカーネル・レベル・プリエンプションによる割り込み応答性能の向上については,とくに期待が大きい.マルチスレッドに関する機能の強化とともに,Linuxを利用していくうえで嬉しい進化だ.

 今回はGCCにおけるマルチスレッド対応について検証してみる. (筆者)

space

 最近のPentium4は,ほとんどWillametteコアです.つまり疑似的にマルチプロセッサとして使用できます.そしてLinuxも,昨年12月にリリースされたカーネル2.6ではマルチプロセッシングに関する機能がより強化されています.

 とくにカーネル・レベル・プリエンプションの強化によって,大きく機能が進化しました.スケジューラは,プロセスとスレッドをまったく区別せずに扱います.従来のカーネルでは,待ち状態になっているプロセス(スレッド)を活性化したことでコンテキスト切り替えが発生したとき,システム・コールの出口でコンテキスト切り替えを行っていました.

 つまり,割り込み処理の際に,実行中のプロセスより優先度の高い待ちになっているプロセスを割り込みハンドラから活性化しても,それにともなうスケジューリング処理は割り込み発生前に実行していたシステム・コールが終了するまで遅延されてしまいました.

 カーネル2.6では,割り込みに対する応答性能を改善する目的で,即時にスケジューリングを行います.これをカーネル・レベル・プリエンプションと呼びます.スケジューラによって各プロセスには動作可能な時間が与えられていますが,この時間が過ぎると強制的に別のプロセスに切り替えられます.そのような動作を「プリエンプション」と呼びます.

  従来,多くのUNIX系のOSでは,プリエンプションが発生するのはユーザ・プログラムを実行しているときだけでした.カーネル内部の処理を行っているときは,明示的にカーネル内で指定しない限り,プロセスのスケジューリングは発生しないようにプログラムが作られていました.

 しかし,昨今のCPUの高性能化によって,動画のエンコード処理もPCで楽にできるようになりました.これをリアルタイムで行うためには,1秒間で30フレームの画像を処理しなければなりません.しかもディスク・アクセスを行い,音声処理を行いながらです.そんなときに,場合によっては数十ms程度の遅延時間がかかるシステム・コールを処理してしまうと,その処理時間にCPUが引きずられてしまいます.そうなると,その間に取り込まなければならない映像を逃してしまうでしょう.

 そこで,カーネル内部の処理を行っている最中でも,プリエンプションを許可することで,そのようなリアルタイム性を高めることができます.ただし,カーネルは内部でプリエンプションが発生することを考慮してプログラムされてはいません.

 そこでカーネルはマルチプロセッサを使用するときに必須の「スピンロック」と呼ばれるしくみに目を付け,スピンロックを実行している間以外はカーネル内部でもプリエンプション可能とすることに成功したのです.

 よってカーネル2.6はマルチプロセッサまたは疑似マルチプロセッサであるHT(Hyper Threading)テクノロジ対応CPUのもとで使用することで,すばらしい性能を引き出すことが可能になります.その際にはマルチスレッド処理が必須になります.

 以上のような理由で,今回はGCCにおけるマルチスレッド処理の基本を説明していきます.


NEW記事内インデックス    連載インデックスはこちら   Interfaceのトップ
◆GCCにおけるマルチスレッドへの対応
Linuxカーネル2.6の概要
HTテクノロジの概要
GCCを使ったマルチスレッド・プログラミングの基本
リスト
図2 test200.log

Copyright 2004 岸 哲夫

Copyright 1997-2004 CQ Publishing Co.,Ltd.