そうですか?基本的にプログラムはハードドライブのコードにすぎず、RAMにある場合はプロセスと呼ばれますか?
答え1
やや這うかもしれませんが、そう言えます。プロセスを作成するには、次の2つのステップが必要です。
- 割り当てるあなたの地域(デフォルトではカーネルにアクセスできるプロセスに関する情報)、プロセステーブルにエントリを入力し、関連するすべてのコンポーネントを初期化します。デフォルトでは、カーネルが管理する別のプロセスを作成するだけです。これは
fork
システムコールを介して行われます。 実行可能ファイルをメモリにロードします。これは
exec
(現在)システムコールを介してexecve
行われます。この呼び出し中に3つのメインメモリ領域が呼び出されます。エリア満ちる:- これテキストプロセスが従うべき一連のガイドラインで構成される領域(デフォルトではプログラム)。実行可能ファイルに含まれています(コンパイラはソースコードに基づいて作成されます)。
- これデータ初期化されたデータ(値のある変数など
int myvar = 1
)を含む領域と初期化されていないデータを保持するのに十分なスペース(と呼ばれる)BSS)、たとえば配列(たとえばchar buffer[256]
)。 - これ山エリア。この部分は私がコメントで述べたように説明するのがちょっと面倒です。Maurice J. Bachは私よりも優れていました。(第2章、セクション2.2.2)。デフォルトでは、スタックは関数が呼び出されたときに大きくなり、関数が返されたときに縮小するメモリの動的領域です。プログラムが実行されると、
main
その関数に対応するフレームがスタックにプッシュされます。プログラムが終了すると、これらのフレームが表示されます。
今、これはプログラムを実行するのに十分に見えるかもしれませんが、そうではありません。これでプロセスが実行されているので、カーネルはまだプロセスを維持する必要があります。引用:
第2章で説明したように、プロセスのライフサイクルは、概念的にプロセスを説明する一連の状態に分けることができます。(UNIXオペレーティングシステムの設計、Maurice J. Bach、第6章:プロセス構造)。
これは、プロセスが常に「実行中」ではなく、常にプライマリストア(「RAM」と呼ばれる)にないことを意味します。たとえば、
- プロセスが省電力モードに移行した場合(プロセスはそのプロセスによって駆動されるため)テキスト、または何かを待っているため、カーネルはそれをセカンダリストレージ(通常はスワップ領域)に置き換えることを決定できます。これが発生すると、プロセスはメインストア(「メモリ/ RAM」)になくなります。カーネルはそれを保存し、メインリポジトリにリロードするとスケジュールを変更できます。
- プロセスが十分な時間実行され、カーネルが決定した場合捕まえる(そしてしばらくの間他のプロセスが実行されるようにしておいて)メモリに保存できない場合は、もう一度交換できます。
プロセスの一般的な寿命は次のとおりです。
- 作成:
fork
システムコールが使用されました。 - 実行準備完了(メモリ内):指示とデータがロードされました。
- 実行(ユーザーモードとカーネルモードの切り替え可能、複数回可能)
- 寝て、起きて、寝て、起きて、…
- 終了(最終的にカーネルモードに切り替え、ゾンビ状態、消えます)。
ステップ3と4は実際にはもつれている可能性があります。
気づくプロセスUNIXシステムの2つの主な概念の1つです。文書)。そのため、Q&A形式ですべての内容を扱うことはできません。私が答えから引用し続けている本は、UNIXシステムの優れた参考資料です。 * NIXes / UNIXシリーズシステムはある点で異なる場合がありますが、まだ同じ概念を使用しています。