教科書「運営体制概念問題9」によると。プロセスのメモリはいくつかの部分に分けられます。そのうちの1つがデータセクションです。この本では、次のように言います。
非公式に前述したように、プロセスは実行プログラムです。プロセスは単なるプログラムコード以上で、時にはテキスト部分とも呼ばれます。また、プログラムカウンタ値とプロセッサレジスタの内容で表される現在のアクティビティも含まれます。
「現在の活動」とは正確にはどういう意味ですか?これは、プロセスのプログラムカウンタとプロセッサレジスタの内容がテキストセクションに格納されることを意味しますか?
答え1
実行コード(テキスト部分)は読み取り専用なので、「現在アクティブ」(プロセス)の変数値を保存することはできません。
このステートメントは、プロセス状態にプログラムカウンタとレジスタが含まれていることを示します。プロセスがアクティブの場合、これらはメモリ内にあるのではなくCPUにあります。プロセスが非アクティブのときにメモリに保存されます。
Linuxでコンパイルされたプログラムはバイナリ形式で保存されます。非常に低い周波数。状況を報告できるユーティリティがあります。バイナリを実行して、これに対する感覚を得ることができますnm -n -g
。readelf -l
プログラムの内容は保護と初期化の要件に基づいてグループ化されるため、カーネルは読み取り専用ページを強制的に適用し、読み込み時の初期化を防ぐことができます。メモリレイアウトの説明は以下にあります。Wikipediaの「データセグメント」記事; 歴史的に Unix ではコードとともにテキスト形式で保存される rodata (読み取り専用データ) を省略します。
「現在のアクティビティ」の保存は、CPUアーキテクチャによって異なります。 Linuxにはプリエンプティブスケジューリング機能があります。 CPUはプロセスを実行し、割り込みを受け取り、次の周期で他のタスクを実行できます。 CPU自体は、割り込み中にプログラムカウンタ、プロセッサフラグ、エラーコードなどの最小限のコンテキストをスタックにプッシュします。次に、割り込み記述子テーブルに事前設定されたカーネルのアドレスにジャンプします。
その後、カーネルは残りのCPUレジスタと他のコンテキストを保存する必要があります。なぜなら、割り込みコマンドで戻りを使用して最終的に再開した場合は、中断されたプロセスの正確な状態を再設定する必要があるからです。もっと読むことができますLinuxの割り込み処理はここにあります。。