GNU/Linux >> Linux の 問題 >  >> Linux

Linux プロセス、スレッド、軽量プロセス、およびプロセス状態とは

Linux は誕生以来、多くの進化を遂げてきました。サーバーやミッション クリティカルな作業に関しては、最も広く使用されているオペレーティング システムになっています。 Linux の全体像を理解するのは簡単ではありませんが、Linux の基本であり理解する価値のある側面があります。

この記事では、Linux プロセス、スレッド、および軽量プロセスについて説明し、それらの違いを理解します。最後に、Linux プロセスのさまざまな状態についても説明します。

Linux プロセス

非常に基本的な形で、Linux プロセスは実行中のプログラムのインスタンスとして視覚化できます。たとえば、Linux ボックスでテキスト エディターを開くだけで、テキスト エディター プロセスが生まれます。

これは、自分のマシンで gedit を開いたときの例です:

$ gedit &
[1] 5560

$ ps -aef | grep gedit
1000      5560  2684  9 17:34 pts/0    00:00:00 gedit

最初のコマンド (gedit &) は gedit ウィンドウを開き、2 番目の ps コマンド (ps -aef | grep gedit) は関連するプロセスがあるかどうかを確認します。結果には、gedit に関連するプロセスがあることがわかります。

プロセスは Linux の基本です。OS によって行われるすべての作業は、プロセスによって、プロセスによって行われます。何かを考えてみれば、それがプロセスであることがわかるでしょう。これは、実行する予定の作業にはシステム リソース (カーネルによって提供される) が必要であり、システム リソースを提供できるエンティティとしてカーネルによって見なされるプロセスであるためです。

プロセスには、どのカーネル コンテキストがプロセスを切り替えるかに基づいて優先度があります。優先度の高いプロセスの実行準備ができている場合、プロセスを横取りできます。

たとえば、プロセスがディスクに保持されているテキスト ファイルのテキストなどのシステム リソースを待機している場合、カーネルは優先度の高いプロセスをスケジュールし、データが利用可能になったときに待機中のプロセスに戻ることができます。これにより、オペレーティング システム全体の動きがスムーズになり、タスクが並行して実行されているような感覚をユーザーに与えることができます。

プロセスは、プロセス間通信方法を使用して他のプロセスと通信でき、共有メモリなどの手法を使用してデータを共有できます。

Linux では、fork() を使用して新しいプロセスを作成します。これらの新しいプロセスは子プロセスとして呼び出され、子プロセスがスタックまたはヒープに変更を加えようとするまで、各子プロセスは最初にテキスト、スタック、ヒープなどのすべてのセグメントを共有します。何らかの変更があった場合、変更が子固有のままであるように、スタックおよびヒープ セグメントの個別のコピーが子用に準備されます。テキスト セグメントは読み取り専用であるため、親と子の両方が同じテキスト セグメントを共有します。 fork() の詳細については、C fork 関数の記事で説明しています。

Linux スレッド vs 軽量プロセス

Linux におけるスレッドは、プロセスの実行の流れに他なりません。複数の実行フローを含むプロセスは、マルチスレッド プロセスと呼ばれます。

非マルチスレッド プロセスの場合、メインの実行フローである実行フローのみが存在するため、シングル スレッド プロセスとも呼ばれます。 Linux カーネルの場合、スレッドの概念はありません。各スレッドは、カーネルによって個別のプロセスと見なされますが、これらのプロセスは他の通常のプロセスとは多少異なります。次の段落で違いを説明します。

スレッドは、軽量プロセスまたは LWP という用語と混同されることがよくあります。その理由は、Linux がユーザー レベルでのみスレッドをサポートしていた時代にさかのぼります。これは、マルチスレッド アプリケーションでさえ、カーネルによって単一のプロセスとしてのみ見られたことを意味します。これは、これらのユーザー レベル スレッドを管理するライブラリに大きな課題をもたらしました。これは、他のスレッドがブロッキング呼び出しを発行した場合に、スレッドの実行が妨げられないケースに対処する必要があったためです。

後で実装が変更され、カーネルが処理できるようにプロセスが各スレッドに接続されました。しかし、前述のように、Linux カーネルはそれらをスレッドとして認識せず、各スレッドはカーネル内のプロセスとして認識されます。これらのプロセスは軽量プロセスとして知られています。

軽量プロセス (LWP) と通常のプロセスの主な違いは、LWP が同じアドレス空間と、開いているファイルなどの他のリソースを共有することです。一部のリソースは共有されるため、これらのプロセスは他の通常のプロセスと比較して軽量であると見なされます。そのため、軽量プロセスと呼ばれています。

したがって、事実上、スレッドと軽量プロセスは同じであると言えます。スレッドはユーザー レベルで使用される用語であり、軽量プロセスはカーネル レベルで使用される用語です。

実装の観点から、スレッドは、Linux の POSIX 準拠の pthread ライブラリによって公開された関数を使用して作成されます。内部的には、clone() 関数を使用して、通常のウェイト プロセスと軽量プロセスを作成します。これは、通常のプロセスを作成するには fork() が使用され、適切な引数を指定してさらに clone() を呼び出す一方で、スレッドまたは LWP を作成するには、pthread ライブラリーの関数が関連するフラグを指定して clone() を呼び出すことを意味します。したがって、主な違いは、clone() 関数に渡すことができるさまざまなフラグを使用することによって生成されます。

fork() と clone() の詳細については、それぞれのマニュアル ページを参照してください。

スレッドの詳細については、Linux でスレッドを作成する方法をご覧ください。

Linux プロセスの状態

通常の Linux プロセスのライフサイクルは、実際の生活とほぼ同じように見えます。プロセスが生まれ、リソースをしばらくの間親と共有し、変更の準備ができたときにリソースの独自のコピーを取得し、優先度に応じてさまざまな状態を経て、最後に終了します。このセクションでは、Linux プロセスのさまざまな状態について説明します:

  • RUNNING – この状態は、プロセスが実行中または実行待ちであることを示します。
  • INTERRUPTIBLE – この状態は、プロセスがスリープ モードであるため中断されるのを待っており、このプロセスを起動できる何らかのアクションが発生するのを待っていることを示します。アクションは、ハードウェア割り込み、シグナルなどです。
  • UN-INTERRUPTIBLE – INTERRUPTIBLE 状態と同じですが、この状態のプロセスはシグナルを送信しても起動できないという点だけが異なります。
  • STOPPED – この状態は、プロセスが停止したことを示します。これは、SIGSTOP、SIGTTIN などのシグナルがプロセスに配信された場合に発生する可能性があります。
  • TRACED – この状態は、プロセスがデバッグ中であることを示します。プロセスがデバッガーによって停止されると (ユーザーがコードをデバッグできるようにするため)、プロセスは常にこの状態になります。
  • ZOMBIE – この状態は、このプロセスの親がまだこのプロセスの終了ステータスをフェッチしていないため、プロセスが終了しているが、カーネル プロセス テーブルに残っていることを示します。親は、関数の wait() ファミリを使用して、終了ステータスを取得します。
  • DEAD – この状態は、プロセスが終了し、エントリがプロセス テーブルから削除されたことを示します。この状態は、ZOMBIE 状態で説明されているように、親が終了ステータスを正常に取得したときに達成されます。

Linux
  1. Linux:ゾンビ プロセスを見つけて強制終了する

  2. Windows、Mac OS X、Linux はどの言語で書かれていますか?

  3. Windows および Linux のディレクトリ名で禁止されている文字は何ですか?

  1. ゾンビプロセスとは何ですか?ゾンビプロセスを見つけて殺す方法は?

  2. Linux 上のこれらの Windows プロセスとは何ですか?

  3. Linux カーネル スレッドは本当にカーネル プロセスですか?

  1. Linux – Linuxのハイメモリとローメモリとは何ですか?

  2. Linux –現在閉じられている過去のスレッドのログ?

  3. Linux スレッドの紹介 – パート I