協調型マルチタスク(非プリエンプティブ型マルチタスクとも呼ばれる)は、オペレーティングシステムが実行中のプロセスから別のプロセスへのコンテキストスイッチを開始しないコンピュータのマルチタスク手法です。代わりに、複数のアプリケーションを同時に実行するために、プロセスは定期的に、またはアイドル状態や論理的にブロックされたときに、自発的に制御を譲ります。このタイプのマルチタスクは、スケジューリング方式が機能するためにすべてのプログラムが協力する必要があるため、協調型と呼ばれます。
この方式では、オペレーティングシステムのプロセススケジューラは協調スケジューラと呼ばれ、その役割はプロセスを開始し、プロセスが自発的に制御をスケジューラに戻すことに限られます。[ 1 ] [ 2 ]
これは非同期プログラミングの手法に関連しています。
協調マルチタスクは、現代のオペレーティングシステムでは主要なスケジューリングメカニズムとして使用されることはまれですが、メモリ制約のある組み込みシステムや、 CICSやJES2サブシステムなどの特定のアプリケーションでは広く使用されています。協調マルチタスクは、Windows 95およびWindows NT以前のMicrosoft Windowsや、従来の Mac OSで採用されていた 16 ビットアプリケーションの主要なスケジューリング方式でした。Windows 9x は16 ビットのレガシーアプリケーションに非プリエンプティブマルチタスクを使用し、 Leopard以前のMac OS X のPowerPCバージョンは、従来のアプリケーションにこれを使用していました。[ 1 ]ネットワーク指向のオペレーティングシステムであるNetWare は、NetWare 6.5 まで協調マルチタスクを使用していました。協調マルチタスクは、 RISC OSシステムで今でも使用されています。[ 3 ]
協調型マルチタスクは、JavaScriptやPythonなど、実行時にシングルスレッドのイベントループを特徴とする言語のasync/awaitに似ています。これは、await を非非同期関数から呼び出すことはできず、一種のコルーチンである非同期関数からのみ呼び出すことができるという点で、協調型マルチタスクとは対照的です。[ 4 ] [ 5 ]
協調型マルチタスクでは、プロセススケジューラによって実行が予期せず中断されることがないため、アプリケーションの実装がはるかに簡単になります。たとえば、アプリケーション内のさまざまな関数は再入可能である必要はありません。[ 2 ]
協調型マルチタスクシステムは、各プロセスが定期的にシステム上の他のプロセスに時間を譲ることに依存しているため、設計の悪いプログラムが、大規模な計算を実行したり、ビジーウェイトしたりすることで、CPU 時間を全て消費してしまう可能性があります。どちらの場合も、システム全体がハングアップします。サーバー環境では、これは環境全体を許容できないほど脆弱にする危険性としてよく考えられていますが、[ 1 ]上記のように、協調型マルチタスクは NetWare や CICS を含むサーバー環境で頻繁に使用されています。
それに対し、プリエンプティブマルチタスクはアプリケーションを中断し、アプリケーションの制御外にある他のプロセスに制御を委ねる。
システムのハングアップの可能性は、多くの場合ハードウェアで実装されるウォッチドッグタイマーを使用することで軽減できます。これは通常、ハードウェアリセットを呼び出します。