Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> Linuxチュートリアル >> Linuxプロセスの基礎の要約

Linuxプロセスの基礎の要約

  
プロセスは、プログラムの実行中のインスタンスを表します。これは、割り当てられたリソースの最小単位です。
プロセスは非常に重要なことです。N個のプロセスを同時に実行しているシステムを実行します。これらのプロセスは静かに動作しています。作成したコードは、コンパイル後、実行してもプロセスを生成します。このプロセスは、プログラムコード、データ、変数(システムメモリを占有する)、オープンファイル(ファイル記述子)、および環境で構成されています。一般に、Linuxシステムの場合、システムはプロセス間でプログラムコードとシステム関数ライブラリを共有するため、メモリ内には常にコードのコピーが1つだけ存在します。
このプロセスはとても重要なので、この記事ではLinuxでのプロセスの基本的な概要を説明します。
プロセスを作成する
ストーリーはプロセスを作成することから始まります。; stdio.hの>の#include< unistd.h>の#include< STDLIB.H> int型のmain(){pid_tのPID;チャー*のMSG; INT N;のprintf(
の#include<:次のコードを検討"フォークプログラム起動用\\ N"); PID =フォーク(); //親と子は、このランスイッチ(PID){ケース-1から取られた後//作成したプロセスの作成:perrorは("と、フォーク。);失敗"出口(EXIT_FAILURE);場合0://フォークは0の値を返す場合、これがあることを示している子プロセスMSG ="ブレーク;これは子供"; N = 2であるデフォルト://場合用};ブレーク;これは親"; N = 3である;(;、N> 0; - N){のprintf("%Sフォークはない0、-1であり、これは親プロセスMSG ="であることを示し\\ n" MSG);睡眠(1);}出口(EXIT_SUCCESS);以下のように}我々は子プロセスを作成するフォーク関数を使用し、フォーク関数の宣言は、次のとおり
の#include< unistd.h> pid_tフォーク(ボイド);フォーク機能値の種類Pid_t、pid_t型はint型です。 fork作成プロセスが成功した後、子プロセスと親プロセスの両方がfork関数の後のコードから実行を開始します。それで、それらはすべて同じ場所から始まるので、子プロセスと親プロセスをどのように区別しますか。
Linuxは、forkの戻り値を使用して区別します。その方法は次のとおりです。
  • forkがpid_t値の-1を返す場合、作成プロセスにエラーがあることを意味します。
  • 0の場合フォークpid_tの戻り値は、サブプロセスを表す。
  • pid_tフォーク戻り値は0、-1でない場合、それは親プロセスを示しています。

    上記のコードでは、forkの戻り値に基づいて子プロセスまたは親プロセスを判断しています。あなたはどのように奇妙に感じますか?
    プロセスの構造
    プロセスは非常に重要です。理解する必要があります。次にプロセスの構造について説明する必要があります。それでは、forkを使用してプロセスを作成した後、メモリ内のプロセスの構造はどうなりますか?見てみましょう。
    は、


    上記のように、我々は、数値は実際のコーディングでこれらを述べ考慮に入れるが、何のショー上の図が、それは親と子の両方のプロセスを理解する鍵ではありませんでしたプロセスの問題の多くについては、上の図から始めることも考えています。後で、プロセスメモリイメージがなぜそれほど重要なのかを分析するために、いくつか質問をします。
    プロセスのスケジューリング
    単一プロセッサでは、一度に1つのプロセスしか実行できず、他のプロセスは実行を待機しています。しかし、実際には、複数のプロセスが同時に実行されていると感じていますが、これはなぜですか?
    オペレーティングシステム
    は、各プロセスにタイムスライスと呼ばれる特定の実行時間を与えます。 「タイムスライス」は非常に短いので、プロセスはこの「タイムスライス」で実行され、それは複数のプログラムが同時に実行されているという錯覚を与える。 オペレーティングシステムはどのようにプロセスをスケジュールしますか。優先順位に基づくスケジューリングアルゴリズム、FIFOスケジューリングアルゴリズムなど、プロセススケジューリングには多くの規則があります。
    Linuxカーネルプロセススケジューラは、プロセスの優先順位に基づいてプロセスをスケジュールします。優先度の高いプロセスはより頻繁に実行されます。
    プロセスステータス
    Linuxには5つの状態があります。

  • 実行中(実行中または実行キューで待機中)
  • 割り込み(スリープ、ブロック中、待機中) )の条件を形成するか、信号を受信
  • 無停電(受信信号が目を覚ますしないと実行できない割り込みが発生するまで、プロセスが待機しなければならない)
  • 死んだ(プロセスが終了したが、プロセスの記述親がリリース後に()システムコール)
  • SIGSTOP、SIGSTP、SIGTIN、SIGTOUは、信号停止を受けた後に停止(プロセス)

    私たちがコマンドを使用するときにPS -aux wait4を呼び出すまで存在しますプロセスの状態を見たときに、プロセスを識別する文字はどういう意味ですか?以下の表に示す特定の文字識別処理状態:状態は
    無停電RのD T停止動作を説明
    ログイン

    状態フラグS Zは死ん割り込みしかし
    ときには、他の識別子も表示されます。

    状態フラグ
    状態の説明
    Wゾンビ<高優先度プロセスN低優先度レベルプロセスLメモリロックページ
    上記を参照してください中断され、中断することはできません、ゾンビ、直接めまい、その後、これらの概念を理解する方法? Linuxオペレーティング状態で

  • は、唯一のCPU時間を待っているプロセスは、それらが実行キューに入れられ、準備工程と呼ばれ、プロセス・レディ状態フラグがTASK_RUNNINGされます。実行中のプロセスのタイムスライスが使い果たされると、LinuxカーネルのスケジューラはCPUの制御プロセスを奪い、実行キューから適切なプロセスを選択して稼働させます。
  • のLinux睡眠睡眠過程で、二つがあります:



  • 一つは、割り込みスリープ状態、その状態フラグTASK_INTERRUPTIBLEである。
  • もう1つは、ステータスフラグがTASK_UNINTERRUPTIBLEの割り込み不可能なスリープ状態です。プロセスは、睡眠は条件が真になるまで、例えば、ハードウェア割り込みが生成され、プロセスは、システムリソースの解放を待っている、またはウェイクアップ信号を送信するためには、プロセスの条件とすることができますスリープします中断することができます。無停電スリープ状態とスリープのような状態を中断することができますが、一つの例外を除いて、それはそれはウェイクアップするための信号を応答しない意味し、そのステータスを変更することはできません。このスリープ状態のプロセスにシグナルを送信することです。割り込み不可能なスリープ状態は一般的にはあまり一般的ではありませんが、プロセスが待機しなければならず、特定のイベントが発生するまで中断できないなど、特定の状況では便利です。 (信号自体に応答せず、プロセスはTASK_UNINTERRUPTIBLE状態である場合を除く)

    SIGSTOPプロセスに信号を送信する場合、それが原因の信号に応答するであろうがTASK_STOPPED状態となります。 (必須であるとしてSIGSTOPとSIGKILL信号。システムコールに対応する信号の系列により、ユーザプロセスは、信号処理機能を再設定することはできません。)SIGCONTは、プロセスに信号を送信し、状態にTASK_STOPPED TASK_RUNNING状態から回復させることができます。で

  • 撤退、TASK_DEADにおける状態の過程でゾンビ状態のプロセス。この出口プロセスの間、task_struct構造体(およびいくつかのリソース)を除いて、プロセスによって所有されているすべてのリソースが再利用されます。そのため、プロセスにはtask_structのスケルトンだけが残り、ゾンビと呼ばれます。 task_structを保持する理由は、task_structがプロセスの終了コードといくつかの統計を格納するためです。そしてその親プロセスはこの情報を気にする可能性があります。たとえば、シェルでは、$?変数は最後に終了したフォアグラウンドプロセスの終了コードを保存し、この終了コードはifステートメントの条件としてよく使用されます。もちろん、カーネルはこの情報をどこか別の場所に保存し、task_struct構造体を解放してスペースを節約することもできます。ただし、task_struct構造を使用する方が便利です。pidとtask_structのルックアップ関係、およびプロセス間の親子関係がカーネル内で確立されているためです。 task_structを解放するには、親プロセスがその子プロセスの終了情報を見つけることができるように、新しいデータ構造を作成する必要があります。


    親プロセスは、一連のwaitのシステムコール(wait4、waitidなど)を介して1つ以上の子プロセスの終了を待機し、その終了情報を取得できます。その後、一連のwaitのシステムコールは、子プロセスの本体(task_struct)を解放します。

    子プロセスを終了する過程で、カーネルは親プロセスに "本体を集める"ように通知するために親プロセスにシグナルを送ります。このシグナルのデフォルトはSIGCHLDですが、このシグナルは、クローンシステムコールを介して子プロセスが作成されたときに設定できます。

    コード次状態EXIT_ZOMBIEプロセスによって製造することができる。
    場合(フォーク())(1)睡眠(100)、一方、

    PS -auxは剛性を用いて、以下の表示されますプロセス情報

    親プロセスが終了しない限り、このゾンビ状態の子プロセスは常に存在します。その後、親プロセスが終了した場合、誰が子プロセスにアクセスしますか?< '>

    プロセスが終了すると、そのすべての子プロセスを他のプロセスにホストします(別のプロセスの子になります)。誰のため?プロセスが終了しているプロセスグループの次のプロセス(存在する場合)、またはプロセス番号1です。そのため、あらゆるプロセス、あらゆる瞬間に、親プロセスがあります。 1番工程でない限り。


    zh-CN"],null,[1],zh-TW"]]]

  • Copyright © Windowsの知識 All Rights Reserved