プロセスとスレッドの違い - ついでにタスクとジョブ -

  • ---

    LINEで送る
  • -

    ブックマーク
  • -

    pocket
  • -

    rss
他言語サイト
翻訳はみつかりませんでした
Windows image

プロセスとスレッド、タスク、ジョブの違いを説明できる人は意外と少ないと思います。

ぼくの経験では、『人と場所』によって微妙に違いました。しかも間違いじゃないので困りものです。

ということで、プロセスとスレッドの違いを(ついでにタスクとジョブも)、『正解』ではなく『間違っていない』ところで説明します。

プロセス - プログラムの実行手順 -

processは英語の授業風に言うと

経過、進行、手順

です。ここでは『プログラムの実行の手順』になります。

プログラムは、

  • HDD・SDDのファイルをメモリに展開する
  • CPUが処理するのに必要なメモリ情報を読み込む
  • CPUが処理する
  • 終わったら同じメモリを使ってくり返し次の処理を開始するか、最後ならメモリを開放する。

の『手順』で処理をします。これが『プロセス』です。

プログラムを実行するためにメモリ上にアップされてから解放されるまでが1プロセスです。

マルチプロセスという言葉がありますね? これは、同じ資源(ファイル)を使ってメモリを別々に展開しそれぞれ違うプロセスで処理をすることです。

たとえばメモ帳などのテキストエディタはマルチプロセスです。

同じ実行ファイルをクリックしているのに複数個のエディタウィンドウが起動できますよね?

そして、エディタに書き込んだ内容はほかのエディタウィンドウに影響しません。

このようにプロセスを同時に実行(並列処理)することをマルチプロセスといいます。

プロセスはメモリに展開して解放されるまでの処理の流れ

スレッド - 子プロセス -

プロセスはメモリに展開してCPUに処理をさせますが、その処理の中で新しくプロセスを作ることができます。

これを子プロセスと呼びスレッドともいいます。スレッドを起動するプロセスを親プロセスといいます。

threadは英単語では

糸、筋道、一脈

です。何かから派生するイメージですね?プロセスから派生したプロセスだからスレッドです。

スレッドもプロセスなので独自のメモリ展開を行います。そして処理が終わるとメモリを開放します(スレッド終了)。

スレッドにもマルチスレッドという言葉があります。

意味はマルチプロセスと同じように複数のスレッドを作って並行処理をします。

マルチスレッドはプロセスから起動するので、スレッド同士で親プロセスがもっているメモリの情報を共有できます。これを共有メモリといいます。

C系言語(C, C++など)を使ったことのある人はスレッドのことを、『フォーク(fork)する』といった表現をします。

fork()関数をコールしてスレッドを作るからです。

マルチスレッドのプログラミングが一番理解しやすいのはC系言語です。

スレッドの細かいプログラミングができるので、『メッセージキュー』『共有メモリ』『セマフォ』といった共有メモリまわりの処理もプログラミングできます。

JavaにはThreadクラスがあります。名前そのままでマルチスレッドの処理を行うクラスです。

Javaではスレッドを作っているところまではイメージできますが、C系言語ほど細かいプログラミングはしません。

細かいところはThreadクラスに任せてしまうのでスレッドの意味をイメージするのはむずかしいです。

ひとつのスレッドで処理をするプログラムのことをシングルスレッドといいます。JavaScriptやPHPはその代表格です。

ただし、いまのJavaScriptやPHPはマルチスレッドの処理を実装することができるので垣根はなくなっています。

(シングルプロセスという言い方もあります。)

  • スレッドはプロセスが作るプロセス
  • 子プロセス

スレッドのことをプロセスと呼ぶこともあります。一応プロセスなので間違いじゃないですが混乱することもあります。

『マルチプロセスの共有メモリ』という言い方をしているときはマルチスレッドのことです。

『本当』のマルチプロセスは、ファイルからメモリにそれぞれ展開するのでふつうは共有メモリはありません。

マルチプロセスでも共有メモリが作れるのかもしれませんが、そのようなことをしているのを見たことがありません。

ぼくの経験では、キャッシュ(ファイル)やデータベースを使ってプロセス間の共有をしたり、パラメータでデータを渡すことが多いです。

タスクとジョブ

最後にタスクとジョブです。これがプロセス・スレッドまわりの混乱の原因です。

task, jobは英単語では

仕事

です。タスクは仕事をさらに区切った『作業』というニュアンスです。でもコンピュータでは同じような使い方をします。

タスクやジョブの意味はそれぞれのシステムやアプリケーションで違います。

  • 1プロセスをタスク or ジョブ
  • プロセスの集合体をタスク or ジョブ
  • 1スレッドをタスク or ジョブ
  • スレッドの集合体をタスク or ジョブ
  • プロセスやスレッド内の特定の処理をタスク or ジョブ

と呼んだりします。はっきりいってタスクとジョブに決まった定義はありません。

人間でも『仕事』の定義はあいまいですよね?国によっても違いますし業界や会社によっても違います。個人でも仕事の考え方は違うでしょう。

Windowsにはタスクマネージャーがあります。その最初のタブは『プロセス』です。

Windowsではタスクの中に『サービス』や『プロセス』があるイメージです。

タスクとジョブは深く考えない。意味はケースバイケース

まとめ

プロセスとスレッドの違いはありません。スレッドもひとつのプロセスです。

プロセスとスレッドは『違う』というよりも『親子』といったほうが分かりやすいです。

父親も母親も人間、自分も人間ですよね? ですけど、親と自分はぜんぶ同じではありません。クローンじゃないんだから。そんな感じです。

タスクとジョブは『そんなくくりがある』程度でいいです。これ以上考えると逆に混乱します。

ぼくが経験した中では『タスク管理』『ジョブ管理』という、ど直球ど真ん中に名づけられたサブシステムを見たことがあります。しかもまったく違う業界の別のシステム開発で。

(もちろん微妙にタスクとジョブの定義は違いました。プロセス・スレッドとの関係性も違いました。)

大きなシステム開発では、機能や役割ごとにサブシステムというものを作って、サブシステムを結合してシステムを作ります。

Webセッションとは何か?ついでにクッキーとは何か?
次のページ
SNSでも記事を配信しています。
コメントを残す

*

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

top
この記事を気に入ったらぜひシェアも!!