Linuxプロセスの理解

  
一般に、プロセスは実行されているプログラムまたはコードです。プログラム自体は、最初は静的で無生物のときにディスクに格納されたコードの束であることを知っています;プログラムのコードがメモリにロードされたときのみ、コードは寿命を持ち、CPUによって動的に移動されます。実行問題は、現在のオペレーティングシステムでは、複数のプログラム、つまり複数のプログラムを同時にメモリに格納するコードを並列に実行できることであり、管理を容易にするためには、それらを合理的に編成する必要があります。その方法は、オペレーティングシステムによって各コードにメタデータを追加することです(このメタデータはPCBであり、タスク制御ブロックです)。各プログラムのコードが実際には2つの部分、つまり命令のデータに分割できることを理解するのは難しくありません。命令はプログラムコードで指定されたさまざまな操作であり、データはこれらの操作の目的です。プログラムは、異なるファイルを編集するために2つのvimを同時に開くなど、複数のプロセスでメモリに複数回ロードすることができます。それから質問です:それは同時にメモリにプログラムの命令の複数のコピーを保存する必要がありますか?答えは必要ありません。命令部分は読み取り専用に設定されており、システム内で実行されている2つ以上のプロセス間でこのコードを共有できるようにします;データ部分は各プロセス専用で共有できません。ファイルそれで、PCBに何があるのでしょうか?プロセスIDシステム内の各プロセスは一意のIDを持ちます。これはCのpid_t型で表されます。これは実際には負ではない整数です。プロセスの状態、実行中、一時停止中、停止中、ゾンビなどプロセスが切り替わったときに保存および復元する必要があるCPUレジスタ。仮想アドレス空間の情報を記述してください。端末を制御する情報を説明してください。現在の作業ディレクトリマスクをマスクします。ファイル構造へのいくつかのポインターを含むファイル記述子テーブル。信号関連情報ユーザーIDとグループID端末、セッション、およびプロセスグループを制御します。プロセスが使用できるリソース制限。プロセスを制御するために、PCBの構造が非常に複雑であることが分かる。プロセスの作成はしばしば「プロセスを作成する」ということを聞きます、何が起こっていますか?考えることができる最初の事はプロセスが孫娘の猿ではないということですあなた自身がそれを見つけることは不可能ですそれは他の誰かの「人生」でなければなりません。正確には、親プロセス内のコードの命令部分が関数fork()を使用してプロセスを作成し、その後子プロセスが「合成」されます。 fork関数はどのように機能しますか?各プロセスはPCBを持っているので、まずオペレーティングシステムでPCBを申請し(PCBは制限されています)、それから新しいプロセスメモリを割り当て、そして次に親プロセスのコードをコピーします。実際、forkは親プロセスをコピーするのに非常に怠惰です。つまり、fork関数呼び出しの間に、当然プロセス番号を除いて、メモリー内に2つのほぼ同一のプロセスがあります(それは一意です)。プロセスの複製が完了すると、両方のプロセスが戻るのを待つfork関数を持ちます(注:fork関数自体もコードの一部であるため、前の部分はコピー機能を完了し、子プロセスが表示された後に戻ります)親プロセス内のforkは子プロセスのpidを返し、子プロセス内のforkは0を返し、フォークが失敗すると結果は-1になります。 。 Forkは2つのほぼ同じプロセスを作成しました。それらは同じコードを実行します。これは最初に述べたものとは異なります。新しいプロセスを作成するのは主に新しいコードを実行するためです。このときexecクラス関数が必要で、プロセスがexec関数を呼び出すと、新しいプログラムの起動ルーチンからプロセスのプログラムコードが新しいプログラムに完全に置き換えられます。 execを呼び出しても新しいプロセスは作成されないため、execが呼び出される前後でプロセスのIDは変わりません。呼び出しが成功した場合は新しいコードが起動コードからロードされ、返されなくなります呼び出しが失敗した場合は-1が返されるため、exec関数はエラーの戻り値のみを返し、成功した戻り値はありません。 execシステムコールは、新しいプログラムを実行するときに、コマンドライン引数と環境変数テーブルをメイン関数に渡します。環境変数テーブルは、プロセスが置かれているシステム環境の記述であり、コードを正常に実行するには、さまざまなシステムリソースを使用する必要があります。ただし、execクラス関数は明示的に呼び出す必要があり、子プロセスは新しいプログラムコードをアクティブにロードしません。したがって、親プロセスのコードでは、forkの戻り値に従ってブランチが記述され、子プロセスのブランチでexecが明示的に呼び出されます。プロセスの終了は、終了時にすべてのファイルディスクリプタを終了させ、ユーザ空間に割り当てられたメモリを解放しますが、そのPCBは残り、オペレーティングシステムはそこに情報を保存します。正常終了の場合は終了ステータスを保存します。異常終了した場合は、プロセスを終了させたシグナルを保持します。このプロセスの親は、waitまたはwaitpidを呼び出してこの情報を取得してから、プロセスを完全にクリーンアップできます。シェルはその親プロセスであるため、プロセスの終了ステータスは特殊変数$?を使用してシェルで表示できることがわかっています終了すると、シェルはwaitまたはwaitpidを呼び出して終了ステータスを取得し、プロセスを完全にクリーンアップします。プロセスが終了したが、その親プロセスがまだクリーンアップのためにwaitまたはwaitpidを呼び出していない場合、そのプロセスの状態はゾンビプロセスと呼ばれます。終了したばかりのプロセスはゾンビプロセスであり、通常はゾンビプロセスは親プロセスによってただちにクリーンアップされます。親プロセスが終了し、その子プロセスがまだ存在する(これらの子プロセスがまだ実行中、またはすでにゾンビプロセスである)場合、これらの子プロセスの親プロセスはinitプロセスに変更されます。 initはシステム内の特別なプロセスで、通常はプログラムファイルは/sbin /initで、プロセスIDは1ですシステムの起動時にさまざまなシステムサービスを開始し、その後、子プロセスをクリーンアップします。クリーンアップするためにwait関数を呼び出します。 killコマンドはプロセスの終了にのみ使用され、ゾンビプロセスは終了しているため、killコマンドでゾンビプロセスをクリーンアップすることはできません。したがって実行可能な選択肢は、その親プロセスを強制終了することです。 wait関数とwaitpid関数のプロトタイプは以下のとおりです。 Id。呼び出しにエラーがある場合は-1を返します。親プロセスがwaitまたはwaitpidを呼び出すと、次のようになります。+ブロックされます(そのすべての子プロセスがまだ実行中の場合)。子プロセスとの終了情報がただちに返されます(子プロセスが終了した場合は、親プロセスがその終了情報を読み取るのを待ちます)。 +エラーはすぐに返されます(子プロセスがない場合)。
zh-CN"],null,[1],zh-TW"]]]
Copyright © Windowsの知識 All Rights Reserved