12

「i」がグローバル変数であるこの関数でライブラリを共有しているとします。

int foo() {
return i++;
}

複数のプロセスからこの関数を呼び出すと、各プロセスの「i」の値は他のプロセスから独立しています。

この動作は当然のことです。

通常、この動作はリンカーによってどのように実装されるのだろうかと思っていました。私の理解では、コードはプロセス間で共有されるため、変数は、このライブラリを使用するすべてのプログラムのすべてのアドレス空間で同じ仮想アドレスを持つ必要があります。その条件を達成するのは非常に難しいと思われるので、ここで何かが欠けていると思います。

この件に関する詳細情報を入手できますか?

4

3 に答える 3

2

コードはプロセス間で共有されるため、変数は、このライブラリを使用するすべてのプログラムのすべてのアドレス空間で同じ仮想アドレスを持つ必要があります

コードはあなたが思うように共有されていません。はい、動的共有オブジェクトは一度だけロードされますが、コードがso使用するメモリ参照またはスタックまたはヒープは共有されません。コードを含むセクションのみが共有されます。

于 2013-06-15T20:21:58.457 に答える
0

各プロセスには独自のアドレス空間があるため、プロセスが変数にアクセスすると、他のプロセスとは異なる値を持つことができます。プロセスが同じメモリを共有する必要がある場合は、これを具体的に設定する必要があります。共有ライブラリはそれには十分ではありません。

于 2013-06-15T18:02:39.870 に答える