プログラムが実行されるベスト: プロセス (1/7)

実行可能ファイルがメモリにロードされて実行されると、メモリ空間内でのその分布は次の図のようになります。

ここに画像の説明を挿入します
メモリには特別なスタック領域があります。関数のローカル変数はスタックに格納されます。malloc を使用するために適用される動的メモリはヒープ領域に割り当てられます。プログラムの実行時には、これらは 2 つの特別なメモリ領域になります。システムにより割り当てられ、メンテナンス、ブロックの申請、解除はユーザー自身が行います。

プログラムがどれほど単純であっても複雑であっても、通常はプロセスの形式でカプセル化され、オペレーティング システムによって管理、スケジュール、および実行されます。シェル対話型環境でアプリケーションを実行すると、bash はコマンドとパラメーターを解析し、fork を呼び出して子プロセスを作成し、次に exec() 関数を呼び出して hello 実行可能ファイルのコード セグメントとデータ セグメントをメモリにロードします。 、置換 子プロセスのコードセグメントとデータセグメントを削除します。次に、bash は対話型環境で入力したパラメータを解析し、解析されたパラメータ リスト argv を main に渡し、最後に実行のために main() 関数にジャンプします。

Linux システムでは、各プロセスは task_struct 構造体で表されます。各 task_struct はリンクされたリストを形成し、オペレーティング システムのスケジューラによって管理および維持されます。各プロセスはオペレーティング システムのタスク スケジューリングを受け入れ、順番に CPU を占有します。走る。

プログラムはディスク上の特定のパスにインストールされるバイナリ ファイルであり、プロセスは実行中のプログラムのインスタンスです。オペレーティング システムはプログラムをディスクからメモリにロードし、対応するリソースを割り当て、関連する環境を初期化します。実行をスケジュールします。プログラムとプロセスの関係は、タクシーとタクシーに乗る顧客の関係に似ています。タクシーは道路脇に駐車される単なる交通手段ですが、顧客のタクシーはタクシーを運行するインスタンスであり、運行をスケジュールし、ドライバー、ガソリン、道路などの関連リソースを割り当てるソフトウェアが必要です。そうすれば、タクシーはタスクを完了できます。プロセス インスタンスには、アセンブリ命令コードとデータだけでなく、プロセス コンテキスト、CPU レジスタ ステータス、オープン ファイル記述子、信号、割り当てられた物理メモリ、およびその他の関連リソースも含まれます。

プロセスのアドレス空間では、コード セグメント、データ セグメント、および BSS セグメントのアドレスは、プログラムがロードされて実行された後に固定され、プログラムの実行中は変更されません。メモリのこの部分は一般に静的とも呼ばれます。メモリ。プログラム内で malloc を使用するために適用されるメモリと関数呼び出し時のスタックは、プログラムの実行中に常に変化します。この部分のメモリは一般に動的メモリとも呼ばれます。malloc を使用してユーザーが適用するメモリは一般にヒープ メモリ (リープ) と呼ばれ、関数呼び出し中に使用されるメモリは一般にスタック メモリ (スタック) と呼ばれます。

おすすめ

転載: blog.csdn.net/weixin_39541632/article/details/132273993