
コンピューティングにおいて、タスクとは実行単位または作業単位のことです。この用語は曖昧であり、より正確な代替用語としては、プロセス、軽量プロセス、スレッド(実行用)、ステップ、リクエスト、クエリ(作業用)などがあります。隣の図には、処理すべき入力作業と完了した出力作業のキュー、およびこれらの作業を実行するスレッドのスレッドプールがあります。作業単位自体、または作業を実行するスレッドのいずれも「タスク」と呼ぶことができ、これらはそれぞれリクエスト/レスポンス/スレッド、入力タスク/完了タスク/スレッド(図示されているとおり)、またはリクエスト/レスポンス/タスクと呼ぶことができます。
「実行単位」という意味では、一部のオペレーティングシステムではタスクはプロセスと同義であり、他のシステムではスレッドと同義です。非対話型実行(バッチ処理)では、タスクはジョブ内の実行単位であり、[ 1 ] [ 2 ]タスク自体は通常プロセスです。「マルチタスク」という用語は、主に処理の意味、つまり複数のタスクが同時に実行されることを指しますが、複数のタスクが同時に実行される作業の意味にもニュアンスがあります。
「作業単位」という意味では、ジョブ(「一度限りの作業」)では、タスクは単一のステップ(実行ではなく、ステップ自体)に対応します。一方、バッチ処理では、個々のタスクはバッチ内の単一アイテムを処理する単一のステップ、またはバッチ内のすべてのアイテムを処理する単一のステップに対応します。オンラインシステムでは、タスクは最も一般的には、単一のリクエスト(リクエスト・レスポンスアーキテクチャの場合)またはクエリ(情報検索の場合)に対応し、処理の単一段階、またはシステム全体の処理に対応します。
Javaプログラミング言語では、スレッドを直接扱う場合、これら2つの概念(作業単位と実行単位)は混同されますが、Executorフレームワークでは明確に区別されます。
スレッドを直接扱う場合、タスクは
Thread作業単位と実行メカニズムの両方の役割を果たします。エグゼキュータフレームワークでは、作業単位と実行メカニズムは分離されています。重要な抽象化は作業単位であり、タスクと呼ばれます。[ 3 ]
IBMによるこの用語の使用は影響力があるが、この用語の曖昧さを強調すると、IBMの用語では「タスク」には次のような数十の具体的な意味がある。[ 4 ]
特にz/OSでは、次のように正確に定義されています。[ 5 ]
OS/360からz/OSまでの「タスク」という用語は、おおよそ軽量プロセスに相当します。ジョブステップ内のタスクは、アドレス空間を共有します。しかし、MVS/ESAからz/OSまでの環境では、タスクまたはサービス要求ブロック(SRB)は、アクセスリストを介して他のアドレス空間にアクセスできます。
Linuxカーネルでは、タスクという用語は、システム上の他のタスクとさまざまなシステムリソースを共有する実行単位を指すために使用されています(少なくともv2.6.13 [ 6 ]からv4.8 [ 7 ]まで)。共有レベルに応じて、タスクは従来のスレッドまたはプロセスとみなすことができます。タスクは、システムコール[ 8 ]を使用して作成され、ユーザーは必要なリソース共有レベルを指定できます。clone()
仕事の一部を指す「タスク」という用語は、1960年代初頭のマルチプログラミングに由来し、1961年の以下の例に見られる。
シリアルモデルは、IBM 709の動作と同様に、1 つのジョブのタスクを独立して処理する能力を備えています。[ 9 ]
この用語は、固定タスク数マルチプログラミング(MFT)と可変タスク数マルチプログラミング(MVT)を特徴とするOS/360 (1964年発表)の導入によって普及しました。この場合、タスクは軽量プロセスで識別され、ジョブは複数のタスクで構成され、後にタスクはサブタスク(現代の用語では子プロセス)を持つことができるようになりました。
今日では「タスク」という用語は非常に曖昧に使われています。例えば、Windowsタスクマネージャーは(実行中の)プロセスを管理しますが、Windowsタスクスケジューラは将来実行するプログラムをスケジュールします。これは従来ジョブスケジューラとして知られており、拡張子を使用しています。対照的に、「タスクキュー.job」という用語は一般的に「作業単位」という意味で使われます。
include/linux/sched.hinclude/linux/sched.h