プロセスは、実際にはOS内で複数のスレッドを実行する独立したプログラムです。一般に、オペレーティングシステムのポリシーによれば、すべてのプロセスは互いにメモリが分離されています。
コードセグメント:[SHARED NOT]
BSSと静的フィールド:[SHARED NOT]
理由は非常に簡単です、なぜオペレーティングシステムは、アクセス処理Bのバイナリに、プロセスAを許可しますか?それはセキュリティとメモリ保護の違反です。プロセスAは、プロセスBのメモリを破壊する可能性があります(書き込みアクセスが与えられている場合)。
約外部定義?
ここで興味深い部分があります。外部定義は静的または動的にリンクできます。
静的にリンクされたライブラリは、定義がコンパイル時およびプログラムでリンクされていることを意味します。バイナリはマシンコードです。
動的にリンクされた定義は、メモリ内のプログラムをロードするユーザーコマンドの直後にリンクされます。 OSは、共有オブジェクトのパスを提供することによって、プログラムの外部依存関係を解決するために動的ライブラリローダーを呼び出します。
この共有オブジェクトは、オペレーティングシステムによって別のページフレームにキャッシュされ、プログラムがこのライブラリを要求するたびに、そのページフレームをプロセスの仮想メモリにコピーするだけです。動的リンクが必要です。この方法では、複数のプロセスが単一のライブラリと同じバイナリを持ちます。
ディスクからライブラリをロードする際にRAMメモリと時間が節約されます。また、ダイナミックリンクはプログラムのバイナリサイズを縮小します。
OSがディスクから再度ライブラリをロードすることを選択し、同じライブラリの2つのコピーを作成することも可能です。これは動的リンク操作の一部です。私はもっと深くはないが、もしあなたが本当に興味があるのであれば、https://en.wikipedia.org/wiki/Dynamic_linkerか、コメント欄にpingしてください。
しかし、BSSと静的フィールドに関しては、再び共有されません。そのような領域(共有されている)に対して書込み操作が実行されるときはいつでも。オペレーティングシステムは、他のプロセスのためにその領域の新しいコピーを作成します。これにより、両方のプロセスが独自のBSSおよび静的フィールドのコピーを持つことが保証されます。