プログラマyasuhoの隠れ家

某ソフトウェア企業に勤務するおじさんプログラマyasuhoです

タスクとプロセスとスレッド


タスク・プロセス・スレッドなど、複数の作業を一つ(もしくは複数)のコンピュータ上で実行させるための仕組みには様々な用語がつけられていますが、これらには明確な定義がないようです。一部では明確な定義があるのですが、同じ用語を別の場所では違う説明がされていることもあります。これらは何か抽象的な概念であるように思われます。


ここでは私の考える「タスク・プロセス・スレッド」について書いてみたいと思います。前述の通り明確な定義は出来ませんが、参考にでもなれば幸いです。なお、この他にWindows OSにはスレッドよりさらに小さな単位であるファイバーというものもありますが、使われているプログラムを見たことがないので省略させていただきます。


間違いや意見等ありましたら、指摘いただけると嬉しいです。

概論


OSの配下で動くプログラムの多くは、タスクやプロセスといった単位でまとめられています。Windowsで言えば、IEやOutlook,WordやExcelなどがプロセスです。何かまとまった仕事を行う単位であると考えてよいでしょう。


これらは「見かけ上」同時に動いているように見えますが、実はOSがプロセスを一定時間動かし、別のプロセスを動かす、ということを行っています。ある一瞬で見れば、一つのCPUが実行しているプロセスは一つだけです。


タスク(プロセス)は、主に以下の要素から構成されます。

  • プログラムの実行命令部分
  • データ領域
  • スタック領域
  • 各種CPUレジスタ


これ以外にOSカーネルがタスク制御用データブロックや仮想空間のページテーブル(仮想記憶をサポートしている場合)などをタスク(プロセス)単位で持っています。

タスク


一般的にタスクは文字通り「まとまった一つの仕事の単位」です。Webブラウザやメールソフト、ワープロソフトというように、ある程度の機能を持つプログラムの実行単位であると考えられます。多くのOSでは「プロセス」と同義ですが、ITRON OSのように、どちらかと言えば「スレッド」に近い使われ方をする場合もあります。


タスクは必ずしもOSの実行単位とは限りません。大型コンピュータの世界ではコンピュータに仕事を依頼する単位としてジョブがあり、ジョブ内の仕事の単位をタスクと呼んでいました。


このように多くの定義があるのは、プログラムの実行単位をあらわすのに、このタスクという言葉が非常に便利であったのではないかと思います。ともあれ、タスクはコンピュータ業界において最も多く使われている単語の一つです。

プロセス


プロセスという言葉を最初に聞いたのはUNIXシステムでした。UNIXでは一つのプログラムを実行するOSの単位がプロセスです。WindowsなどのOSに同じ概念でプロセスが使われています。


タスクとの違いはほとんどありません。OSの設計者が新しい名前をつけたがるのはよくある話なので、そういった背景からわざわざ違う名前にしてあるのかもしれません。OSの実行単位としてのタスクと同義ととらえてよいと思います。

スレッド


スレッドはプロセス内でさらに複数の実行単位を実現するものです。スタックやCPUレジスタは各スレッド固有ですが、プログラムの実行部分やデータ領域はプロセス内の各スレッドが共有します。


スレッドが必要とされた理由の一つに、タスク(プロセス)切り替えコストの低減があります。OSは各タスク(プロセス)の実行状態を保存・回復する必要がありますが、これにはレジスタなどの保存に加え、仮想記憶をサポートするOSでは仮想空間の切り替えと命令&データキャッシュのクリアなど、なかなか大掛かりな処理になります。さらにキャッシュのクリアは場合によっては性能をかなり低下させます。仮想空間を共有するスレッドならば、CPUレジスタの切り替え+α程度で済むので、処理効率は大幅にアップします。


もう一つのスレッドの有用性としては、タスク(プロセス)内で複数の仕事を行うのに適しているということです。同様の処理を複数タスク(プロセス)で実現することは可能ですが、データの受け渡しにタスク(プロセス)間通信機能を使う必要があり、やや処理が煩雑になります。スレッドであればデータが使えるので、楽です。もちろん排他制御は行う必要がありますが。

なぜこんな記事を書いたのか


いかがだったでしょうか。コンピュータに詳しい方には退屈な内容だったと思います。もっといい説明がWebや本などに載っていることでしょう。結論からいえばこれらは「OSや環境によって定義が変わる」ということになるかもしれません。


にもかかわらず、なぜ今さらこのような解説を書こうと思ったかといえば、それは自分自身のためです(笑)タスクやプロセスなどの概念って、何となく分かっているつもりで漠然と考えていたので、いつかこういったまとめをしたいと思っていました。ご笑覧いただけたなら幸いです。