4D Summit 2016のPreemptive Multi-threadingに関するBreak Out Sessionで、エンジニアリング担当副社長のLaurent Esnault氏が、協調処理とプリエンプティブ処理の違いについて解説しています。プリエンプティブ・マルチスレッディングのおかげで、より多くの並列プロセスを持つことができ、デスクトップまたはWebアプリケーションのいずれでも、より多くのユーザーを追加することができます。
4D Summit 2016でのLaurentのセッションを見逃した方は、このビデオを見て、プリエンプティブ・マルチスレッディングのマスターによるパーソナルトレーニングを楽しんでください!
協調型とプリエンプティブの違い
では、協調型とは何か、プリエンプティブとは何か。
現在、皆さんが4Dプロセスで使っているのは、一般的に協調モードです。協調型とは、4Dプロセスが協調して 1つのCPUを共有することを意味します。IDLEコマンドを使用したときのように明示的に協力することもあれば、他のほとんどの4D言語コマンドを使用したときのように、暗黙的に協力することもあります。これは、4Dが内部的にIDLEコマンドを使用して、CPUを他のプロセスに譲るためです。その結果、一度に使用できるCPUコアは1つだけです。
もちろん、みなさんは今使っている4Dプロセスをご存知でしょう。そして、それらのプロセスを使ってユーザーインターフェイスにアクセスするのは自然なことだと思います。ウィンドウを開いたり、ダイアログやフォームを表示したり、などです。しかし実は、オペレーティング・システムにとっては全く自然なことではありません。ほとんどのOSでは、メインスレッド以外のスレッドからユーザーインターフェイスにアクセスすることを禁じています。しかし、協調プロセスでは、4Dは内部でユーザーインターフェイスへのアクセスを管理します…セカンダリスレッドでもです。
プリエンプティブモードでは、4DプロセスがCPUを共有するために協力する必要がないため、IDLEコマンドを呼び出す必要はありません:それは、オペレーティングシステムによって行われます。オペレーティングシステムは、CPUを1つのスレッドまたは別のスレッドにプリエンプティブに渡します。つまり、マシンに複数のCPUがあれば、複数のスレッドを同時に実行することができるのです。したがって、マシンのコアをすべて使えるという利点があります。しかし、プリエンプティブなスレッドからは、ユーザーインターフェイスにアクセスすることはできません。
協調モードでは、プロセスが順次実行され、1つのCPUだけを使うのに対し、プリエンプティブモードでは、OSが2つのプロセスをすべてのCPU(図の例では、CPU1とCPU2の両方)にディスパッチしているのがわかると思います。
そのメリットは明らかです。CPUが2つある場合、プリエンプティブモードの方がグローバルな実行時間が短くなるのです。個々のプロセスの実行時間は同じであってもです。プリエンプティブ・スケジューリングでは、プロセスの実行時間が性能向上するわけではありません。短縮されるのは、複数のプロセスで実行される、複数のタスクの グローバルな実行時間 なのです。
デモ
ここでは、非常に簡単なデモを行います。各ボタンは4つの個別プロセスを作成します。
最初のボタンは、ナンセンスな計算をするために4つの 協調 プロセスを作成しています(厳密にはデモのためです)。グローバルな実行時間は643ティック、各個別プロセスの実行時間は150ティック程度です。つまり、基本的にグローバルな実行時間は4つの個別実行時間の足し算に過ぎないのです。
全く同じ計算を4つのプリエンプティブなスレッドで行うと、個々のプロセスの実行時間はほぼ同じ(150ティック)ですが、グローバルな実行時間は 4 倍も短くなることがわかります。
このデモに使用したデータベースの例と、プリエンプティブプロセスに関するVanessaの投稿で補足説明をしています。