0

以下のプログラムでは、両方のプロセスの仮想アドレスは同じです。グローバル変数の理由は理解できましたが、ローカル変数の理由は理解できませんでした。

実行前にローカル変数に仮想アドレスがどのように割り当てられますか?

int main()
{
  int a;
  if (fork() == 0)
  { 
     a = a + 5; 
    printf(“%d,%d\n”, a, &a); 
  }
  else 
  { 
     a = a –5;
    printf(“%d, %d\n”, a, &a); 
   } 
}
4

3 に答える 3

3

仮想アドレスは... 仮想です。つまり、2 つの異なるプロセス (親プロセスとその子プロセスなど) からの同じ仮想アドレスが、2 つの異なる物理アドレスを指しています。

于 2012-07-14T10:06:18.587 に答える
2

コンパイル中に、コンパイラはローカル変数にスタックまたはレジスタのいずれかを使用することを決定します。この場合、スタック。

また、スタックを配置する (仮想) アドレス空間の場所も決定します。

したがって、両方のプロセスで、スタックは同じ (仮想) アドレスで開始されます。また、この特定のプログラムのフローはどちらかというと決定論的であるため、スタック フレームは両方のプロセスでまったく同じように見え、'a' のスタック内のオフセットは同じになります。

于 2012-07-14T10:22:37.790 に答える
0

フォークの前のアドレスが何であれ、aフォークの後は必ず同じである必要があります。したがって、のアドレスaは両方とも同じものであるため、2つのプロセスで必ず同じになります。ほとんどの実装では、のアドレスはa、スタックポインタのコンテンツにオフセット(コンパイラによって決定される)を追加することによって導出されます。スタックポインタの内容はforkによって複製されます。

于 2012-07-14T10:52:39.463 に答える