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

  • ---

    LINEで送る
  • -

    ブックマーク
  • -

    pocket
  • -

    rss
Windows image

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

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

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

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

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

経過、進行、手順

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

プログラムは、

  • メモリがHDD・SDDのプログラムファイルを読み込む。
  • CPUが、処理するのに必要なメモリ情報を読み込む。
  • CPUが処理する。
  • 終わったら、次の処理に必要なメモリを読み込んで処理をつづけるか、処理が終わりならメモリを開放する。

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

プロセスとは?
プロセスとは?

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

マルチプロセスってなに?

マルチプロセスということばを聞いたことがあると思います。

これは、同じ資源(ファイル)を使ってメモリを別々に展開し、それぞれちがうプロセスで処理をすることです。

マルチプロセスとは?
マルチプロセスとは?

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

同じアイコン(実行ファイル)をクリックしているのに、複数個のエディタウィンドウが開きますよね?

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

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

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

マルチプロセスはお互いに干渉しない。

(プロセスの独立)

スレッド - 子プロセス -

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

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

スレッドとは?
スレッドとは?

threadは英単語では

糸、筋道、一脈

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

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

マルチスレッドってなに?

スレッドにもマルチスレッドがあります。

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

もちろん、それぞれのスレッドは独立しています。

マルチスレッドとは?
マルチスレッドとは?

ほんとうは、スレッドは親プロセスのコピーです。

(メモリーのコピーをつくって新しいプロセスをつくります。)

ただ、

スレッド親プロセスのコピーから別プログラムを起動
親プロセススレッド作成だけ行なって別プログラム起動はしない

という使い方をすることが多いので、イメージしやすいように細かいことは省略しました。

共有メモリってなに?

プロセスやスレッドは、共有メモリを使ってデータ共有ができます。

共有メモリはOSのシステムで管理しているメモリ領域で、まったく独立したプロセス間でも、親子のプロセスでも共有できます。

共有メモリとは?
共有メモリとは?

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

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

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

スレッドの細かいプログラミングができるので、

メッセージキュー

共有メモリ

セマフォ

といった共有メモリまわりの処理もプログラミングできます。

JavaにはThreadクラスがあります。名前そのままでスレッド処理をします。マルチスレッドも実装できます。

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

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

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

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

シングルプロセスともいいます。)

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

共有メモリはOSで管理するメモリ領域なので、サイズが大きいものには向いていません。

(サイズ変更のカスタマイズはできます。)

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

(パラメータはスレッドで別プログラムを起動するときに渡すデータのこと。)

プロセスとスレッドのおまけ

プロセスには

orphan process

(孤児プロセス)

zombie process

(ゾンビプロセス)

があります。プロセス・スレッドのはなしで、Unix, Linuxでは、これを外して語れないほどよく出てきます。

孤児プロセスってなに?

プロセスとスレッドの親子関係は説明しました。ここで大事なことをいい忘れています。

親が死んでも子は生きる

です。

親と子はとても関係が深いですが、あくまでそれぞれ独立しています。

親が亡くなったら悲しいですが、ほとんどの人は自分の人生を頑張って生きるでしょう。

人間と同じですね?

親プロセスが終了しても子プロセスには関係ありません。

しかしプロセスは人とちがって、かならず生きている親をもつことになっています。

プロセスには、親をなくした孤児を預かる孤児院のシスターみたいな、すべてを包み込んでくれるプロセスがいます。

initプロセス

です。initプロセスは、すべてのプロセスのご先祖様でもあります。

孤児プロセスとは?
孤児プロセスとは?

initプロセスが死ぬときは、OSがおかしくなっているかシャットダウンするときなので、すべてのプロセスにはかならず親がいます。

ゾンビプロセスってなに?

ゾンビプロセスは、プロセスの処理が終わって親プロセスに終了ステータスを読まれるのを待っている状態です。

このとき、プロセスは処理が終わっているので使っていたメモリはいらないです。

しかし、プロセスの状態を管理するプロセステーブルに情報が残っているので、別のプロセスが使いたいメモリに割りあてることができません。

プロセステーブルは、プロセスが使うメモリの量も管理しているので、プロセスがメモリを使わなくても、領域だけは確保しています。

また、プロセスには実行できる数の上限が決まっているので、ゾンビプロセスがふえすぎると新しいプロセスがつくれなくなることもあります。

ゾンビプロセスは死んでいるが死亡届が出されていない。

死んでるのに死んでないことになっている = ゾンビ

ゾンビプロセスはふだんは害はないが、CPUやメモリの負荷が大きくなるとトラブルの原因になる。

親プロセスが子プロセスの終了ステータスを読んだら、プロセステーブルがクリアされます。

具体的には親プロセスがwaitpid()wait()を使います。

ゾンビプロセスの生まれる原因

ゾンビプロセスが生まれる原因は

親の育児放棄

です。さっき、『子プロセスの処理が終わったら終了ステータスが読まれるのを待っている』といいました。

その終了ステータスを読むのが親プロセスの仕事です。

プロセスでは

子の尻ぬぐいは親がする

ことになっています。

プロセスって独立心はあるのに最後のシメは親に投げちゃんですね?

プロセスは超ド級のわがまま甘ちゃんです。親がケツを拭いてくれなかったらゾンビになるんですから。

ゾンビプロセスとは?
ゾンビプロセスとは?

ゾンビプロセスが出る原因はこれだけです。親がしっかりしてればゾンビになりません。

親プロセスには、waitの仕事をしっかりさせましょう。

ゾンビが生まれるのは親プロセスの処理のバグのせいです。

ゾンビプロセスを退治する方法

ゾンビプロセスを片づける方法は

ゾンビプロセスを孤児プロセスにしてあげる

です。親が育児放棄しているので保護してあげるんですね?

その方法は

親を殺す

です。サスペンスです。

親をなくしてしまえば、initプロセスが保護して親になってくれます。

initプロセスは甘えん坊のプロセスの面倒をよくみるので、ケツを拭いてパウダーでポンポンしてくれます。ゾンビになることはありません。

ゾンビプロセスを退治する方法
ゾンビプロセスを退治する方法

initプロセスは定期的にwaitを実行しています。

ゾンビプロセスはすでに死んでいるのでコマンド(kill)で殺せません。

タスクとジョブ

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

task, jobは英単語では

仕事

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

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

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

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

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

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

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

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

まとめ

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

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

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

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

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

(もちろん微妙にタスクとジョブの定義はちがいました。プロセス・スレッドの呼び方も若干ちがいました。)

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

前のページ
ICTとは何か?ITという言葉はやめた方がいいかもしれない。
ユーザーCPU時間とシステムCPU時間って何がちがう?
次のページ
SNSでも記事を配信しています。
コメントを残す

*

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

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