共有メモリの私の理解によると、これは複数のプロセス間で共有されるメモリセグメントです。共有メモリは、以下をshmget()
使用して実装できます。ただし、どのプロセスもアドレス空間に含まれていないメモリセグメントにアクセスできないため、この共有メモリをプロセスのアドレス空間に接続する必要があります。私が理解した接続ワードによると、接続とは、生成されたメモリセグメントを両方のプロセスのアドレス空間に含めることを意味します。ただし、この共有メモリの開始アドレス(関数shmat()
)を印刷すると、すべてのアドレスがプロセスごとに異なります。これは私を混乱させます。共有メモリが2つのプロセス間で共有されるメモリの単一の「コンテナ」であり、2つの異なる開始アドレスがある場合はどうなりますか?これは、最初のプロセスの共有メモリの内容が別のプロセスの新しいメモリセグメントにコピーされることを意味しますか?
答え1
返されるアドレスは、shmat()
ポインタとして直接使用できるすべてのアドレスと同様に仮想アドレスです。仮想アドレスは間接的です。つまり、アドレス変換テーブルを効果的に指します(ページテーブル)そのメモリが実際にマッピングされているかどうか、および物理メモリ内で見つかった場所をCPUに伝えます。プロセスが互いに保護するほとんどのUnixスタイルのマルチタスクシステムでは、各プロセスには独自の仮想アドレススペースがあります。
共有メモリは、複数のプロセスの仮想アドレス空間にマッピングされた物理ページのセットです。各プロセスは仮想アドレス空間を異なる方法で使用できるため、同じ共有メモリがそれらを共有する各プロセス内の他の仮想アドレスに表示される可能性が高くなります。そうしないと、必要なアドレスにすでに何かを割り当てているプロセスがその共有メモリにアクセスできなくなります。
(一部のシステムには、プロセス間に同じ仮想アドレス空間があります。単一アドレス空間オペレーティングシステムもっと学ぶ。 )