プロセスに関するノート

3139 ワード

プロセスとは


プロセスは単なるプログラムの実体である.プログラムは、マシン言語の命令といくつかのデータのセットを含むようなイメージです.コマンドpsを使ってマシン上のプロセスをチェックできます.これはUbuntu 20.04のWSL上で実行されている“ps”コマンドの例です.
$ ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 17:23 ?        00:00:00 /init
root         5     1  0 17:23 tty1     00:00:00 /init
watson       6     5  0 17:23 tty1     00:00:00 -bash
watson     111     6  0 19:23 tty1     00:00:00 ps -ef
ご覧のように、“ps”コマンドもプロセスです.
すべてのLinuxディストリビューションには、プロセスIDが1のinitプロセスがあります.initプロセスは、プロセス0がカーネルにすでに実行されているが、マシン上で実行する最初のプロセスである.すべてのプロセスがinitプロセスから始まるので、それはすべてのプロセスの親であると言われています.
プロセスはPIDだけでなくPPIDプロセスIDを意味します.この場合の構造は以下の通りである.

WSLを使用しているので、2つのinitプロセスがあります.WSLはLinuxとは異なる独自のinitプロセスを使います.このタスクは同じinitバイナリですが、異なるプロセスとして動作します.それがWSLを使用するときにいくつかのinitプロセスがある理由です.

メモリアーキテクチャ


これは、仮想メモリと実行可能なイメージの概要です.異なったUnixシステムはプロセスのために異なるレイアウトを使用します、しかし、大部分のために、大部分の現代のシステムは実行可能でlinkableなフォーマット(ELF)として知られている形式に付属します.

カーネルスペース


プロセス構造


カーネルはプロセスごとにプロセス構造を保持する.この構造体は、カーネルがプロセスを管理するために必要な情報を含んでいます.Linuxのディストリビューションやバージョンでは設定情報が異なりますが、ほとんどのディストリビューションには以下の情報があります.
・プロセスID
・親プロセスID (親プロセスのプロセス構造へのポインタ)
・プロセスの子要素のリストへのポインタ
・スケジューリングの優先度、CPU使用率と最後の優先度に関する統計
・プロセス状態
・シグナル情報(保留中シグナル、シグナルマスクなど)
・機械状態
・タイマ

ユーザ構造


ユーザ構造はカーネル構造よりはるかに少ない情報を保持する.Linuxでは、メモリマップとプロセス制御ブロックが含まれます.メモリマップは一般に、テキスト、データ、およびスタックセグメントの開始アドレスおよび終了アドレス、アドレス空間の残りの部分のための様々なベースおよび制限レジスタなどを含む.プロセス制御ブロックは、CPU状態と仮想メモリ状態を含む.

カーネルスタック


それぞれのプロセスは独自のカーネルスタックを持っている.再帰的関数が多くのスタック空間を使用するため、カーネル空間内のすべての関数は慎重に設計されています.スタックの最大サイズは、関数チェーンをトレースすることによって決定できます.したがって、カーネルスタックは固定サイズで割り当てられます.

ユーザ空間


テキストセグメント


テキストセグメントはプログラムの実行可能なコードです.このセグメントは読み取り専用であり、処理された任意のものと共有される.

スタックセグメント


関数の戻りアドレス、関数の引数などのスタックセグメントストレージ.スタックがヒープの先頭にある場合は、例外が発生します.

データセグメント


データセグメントは初期化されたデータと初期化されていないデータを保持します.初期化されたデータは、シンボルテーブルから始まる値とその名前を持ちます.初期化されていないデータには値がないので、データセグメントのオフセットだけを持ちます.データセグメントは、brk ()システムコールなどの明示的なメモリリクエストによって成長または縮小します.malloc ()はcのbrk ()関連関数です.

ELF型


ELFの3種類があります.我々はコンパイルのプロセスでそれを得ることができます.

1 -オブジェクトファイル(*. o )
これは、実行可能ファイルを作成するための他のオブジェクトファイルとリンクするためのバイナリ保持コードとデータです.これは実行可能な部分のようです.
2 -実行可能
これは実行できるバイナリです.プログラムを実行するために必要なすべてのオブジェクトファイルがリンクされ実行可能です.ファイルはいくつかのオブジェクトファイルのアーカイブである静的ライブラリです.プログラムが静的ライブラリを必要とするとき、コンパイル時にリンカがリンクします.出力実行可能名の名前を定義しない場合、名前はa . outとなります.
3 -共有オブジェクトファイル(*. so )
これはダイナミックリンクライブラリとして知られています.プログラムがそれを必要とするとき、実行するとき、それはリンクされます.