2011-02-02 12 views
5

ためのメモリの割り当てが、特定の上で私は1台の端末iは異なる入力を与えることにより、2台の端末にプログラムをデバッグしたポインタ

ins (ptr=0x0, key=1, upKey=0xbffff308, newnode=0xbffff30c) 

および他の端末

ins (ptr=0x0, key=1, upKey=0xbffff308, newnode=0xbffff30c) 

でこれを見関数は、同じメモリ位置をどのようにしてポインタに割り当てることができますか?

ins(struct node *ptr, int key, int *upKey,struct node **newnode) 

2つの異なる端末で同じプログラムを実行しています...異なる入力で

+2

これはすばらしい質問です。 – sharptooth

答えて

5

仮想メモリでは、システム上で実行されているすべてのプログラムは、コンピュータ自身のアドレス空間を持つように機能します。しかし、ポインタが逆参照されるたびに、ハードウェアの特別な部分は、ポインタの目的のアドレス(仮想アドレス)から、実際にデータが存在するメモリ内の他の場所(物理アドレス)に変換されます。オペレーティングシステムは、仮想アドレスがマップされているメモリの領域を管理および移動するために構築されているため、あるプログラムがいくつかのアドレスを逆参照した場合、Aは、参照先アドレスAよりも物理メモリの別の場所にマップしますを別のプロセスで実行します。事実、これらの仮想アドレスはすべてシステム上の異なる物理アドレスに解決されるため、任意の数のプログラムがすべてアドレスを使用すると主張できます。

+1

これが当てはまらない場合、 'fork'関数は不可能であることに注意してください。 –

9

あなたが見ているメモリアドレスは仮想アドレスです。これらのアドレスはプロセッサによって物理アドレスに変換されます。これはすべての最新のオペレーティングシステムの基礎です。各プロセスは、アドレス空間全体(32ビットマシンの場合は4GB、64ビットマシンの場合はさらに多く)を所有していると考えています。プロセスがまだ割り当てられていないメモリにアクセスすると、CPUによってページフォルトが生成されます。 OSは、その無効なメモリアクセスをいくつかの方法の1つで処理できます。 1つの一般的な方法はセグメンテーション違反です。

1

各プロセスに仮想的で「プライベート」なものに加えて、物理メモリが実際にプロセス間で共有できることを忘れないでください。たとえば、fork()プロセスでは、すぐに完全にコピーされません。コードは共有されたままであり、データページは変更しようとするとコピーされます(「コピー時にコピー」)ので、2つのプログラムは物理メモリを共有できます彼らへ)。

関連する問題