HTTPサーバーとWeb開発

5. マルチスレッド・サーバーとは?

iSeries400 で PCOMM や ClientAccess を使用すると、最初の接続でしばらく待たされてから接続されて JOB が開始される。
PCOMM や ClienAccess そして Chicago も同じであるが、クライアント・サーバー型のアプリでは iSeries400 の中ではサーバー・デーモンと呼ばれるJOBが待機していて、クライアントからの要求に対して新たなJOBを生成してクライアントとの処理を開始する。これは Windows でも同じことが行われており、iSeries400 での JOB は Windows ではプロセスと呼ばれるJOBとして新規発生する。
プロセスや JOB を新規派生させることはクライアントからの要求に応えてその都度、銀行の支店を開設しているようなもので、仕事に必要な電話やコピー機などをすべて揃えてから客を迎えるのと同じである。しかも窓口対応の人間は一人しかいない。
しかし現実には客が来てから支店を開設するような銀行はない。複数の来客に備えて複数の窓口対応の係員を用意しておくのが普通である。これと同じ処理をするのがマルチスレッド・サーバーである。
つまりたった1つのJOBまたはプロセスでありながら複数のクライアントの処理を同時並行して実行する。窓口係員はつねに複数が配置されているので客を待たせることもない。複数のプログラムが1つのJOBの中で同時並行して実行されるのである。

なぜマルチスレッド・サーバーが必要なのであろうか?
インターネットとしてのWebサーバーは多くのクライアントから同時アクセスを受ける。このときアクセスの都度JOBやプロセスを派生させてクライアントを待たせるようなことをしてはならない。インターネットの世界にあってはパフォーマンスこそが重要なのだ。それ故、世界のすべての HTTPサーバーはすべてマルチスレッド・サーバーでできている。
iSeries400 では V3R2M0 から V4R4M0 までが仮想的な、そして古典的な POSIX スレッドと呼ばれるマルチスレッドをサポートしており、読者がマルチスレッドの開発をしようと思えば、ライブラリー QCPA を入手が必要であり、CRTPTHPGM コマンドによってマルチスレッド・サーバーを作成することができる。
V4R4M0 以降では POSIX よりさらに低階層で動作するカーネル・スレッドがサポートされた。カーネル・スレッドは最終的なマルチスレッドの姿であり、いっそう速く動作するようにできている。カーネル・スレッドを作成するのは CRTPGM でできるが、実行にはマルチスレッド・サポートを *YES にした専用のサブシステムが必要である。
またカーネル・スレッド内では OVRDBF コマンドは使用できない。使用のためには別途工夫が必要となる。

マルチスレッドが単にサーバーとしてだけではなく、複数の処理を同時並行して実行できて CPUの性能を大幅に向上させる夢のような技術でもある。
大量のバッチ処理に時間がかかっているようであれば是非マルチスレッドの導入を検討して欲しい。Chicago XP ではクライアントでも iSeries400 側でもマルチスレッドを採用している。日本国内で iSeries400上で POSIX/カーネル・スレッドを製品として採用しているのは Chicago XP だけであると自負している。