MySQL は、使用されるスレッドパッケージによって大きく左右されます。そのため、MySQL に適したプラットフォームを選択する場合、スレッドパッケージは極めて重要です。
スレッドパッケージには、少なくとも以下の 3 種類があります。
単一プロセス内のユーザスレッド。スレッドの切り替えはアラームによって管理され、スレッドライブラリがすべての非スレッドセーフ関数をロックによって管理する。実行中のスレッドがデータを待機しなければならない場合、読み取り、書き込み、選択などの操作は通常、別のスレッドに切り替えるスレッド固有の select で管理される。ユーザスレッドパッケージが標準ライブラリ(古いバージョンの FreeBSD および BSDI スレッド)に統合されている場合、そのパッケージに必要なオーバーヘッドは、すべての安全でない呼び出し(MIT-pthread、FSU Pthread、RTS thread)にマッピングしなければならないスレッドパッケージよりも少なくて済む。一部の環境(たとえば SCO)では、すべてのシステムコールがスレッドセーフなので、マッピングは非常に容易である(SCO における FSU Pthread)。欠点:マッピングされたすべての呼び出しに必要な時間はごくわずかであり、あらゆる状況に対処するのが極めて難しい。通常、スレッドパッケージによって処理されないシステムコールもいくつか存在する(MIT-pthread、ソケットなど)。スレッドのスケジュールは常に最適とは限らない。
個別プロセス内のユーザスレッド。スレッド切り替えはカーネルによって行われ、すべてのデータはスレッド間で共有される。スレッドパッケージは、スレッド間でデータが共有されるように標準スレッド呼び出しを管理する。この方法は LinuxThread で使用されている。欠点:プロセスが大量。スレッド作成が遅い。1 つのスレッドがクラッシュした場合、通常は残りのスレッドがハングしているので、それらをすべて強制終了した後に再起動しなければならない。スレッド切り替えには若干のコストがかかる。
カーネルスレッド。スレッド切り替えは、スレッドライブラリまたはカーネルによって行われ、極めて高速である。すべて
1
つのプロセスで処理されるが、一部のシステムでは
ps
によって異なったスレッドが表示されることがある。1
つのスレッドが中止されると、プロセス全体が中止される。多くのシステムはスレッドセーフであり、必要とされるオーバーヘッドはごくわずかである。Solaris、HP-UX、AIX、OSF/1
にはカーネルスレッドがある。
一部のシステムでは、システムライブラリ内のユーザレベルスレッドによってカーネルスレッドが管理される。そのような場合、スレッド切り替えはスレッドライブラリによってのみ可能であり、カーネルは実際には ``スレッド対応'' ではない。
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.