アプリケーションをコンパイルせず,プリエンプティブモードのプロセスやワーカーを活用しなかった場合,すべてのメソッドは原則的にメインアプリケーションのコオペラティブスレッドで実行されます。つまり,複数のスレッドで同時に複数のプロセスが実行されるのではなく,メインアプリケーションのコオペラティブスレッドで少しずつ順番に実行されることになります。
コオペラティブモードでは,特定のプロセスが長時間にわたってCPUを独占するようなことを避け,プロセス同士でCPUを譲り合うことが重要です。たとえば,ループ処理中にDELAY PROCESS
を呼び出すことができます。DELAY PROCESS
が呼び出されると,一旦,スケジューラーに制御が返され,順番を待っている他のプロセスにメソッドを実行する機会が与えられます。プロセスを遅延することは望まず,単純に「息継ぎ」をしたい場合には,遅延時間に0
を指定します。遅延時間に0
を指定した場合であっても,必ずスケジューラーに制御返されるからです。
最近,新しいデータベースパラメーターUncooperative process threshold (132)
が追加されました。このパラメーターはメインアプリケーションのコオペラティブスレッドを「独占」しているプロセスを特定するのに役立ちます。閾値(デフォルトは500
㍉秒)を超えてプロセスがCPUを独占した場合,
Cooperative process doesn't yield enough
という警告が診断ログに出力されます。閾値はカスタマイズすることができます。また,このメッセージはエラーではなく警告なので,データベースパラメーターDiagnostic log level (86)
でログレベルを「エラー」に設定することにより,抑制することができます。