プロセスAは、shmgetを使用して共有メモリ '1234'を作成しました。この後、プロセスAはshmatを使用してメモリを自身に接続します。Linuxの共有メモリはどのようにシーンの背後で動作しますか?
プロセスBはまたにshmatを使用して、自身に「1234」に対応する共有メモリを取り付けます。
「添付」は正確に何を意味していますか?同じメモリが2つコピーされていますか?もしそうでなければ、正確にこのメモリはどこに存在しますか?
プロセスAは、shmgetを使用して共有メモリ '1234'を作成しました。この後、プロセスAはshmatを使用してメモリを自身に接続します。Linuxの共有メモリはどのようにシーンの背後で動作しますか?
プロセスBはまたにshmatを使用して、自身に「1234」に対応する共有メモリを取り付けます。
「添付」は正確に何を意味していますか?同じメモリが2つコピーされていますか?もしそうでなければ、正確にこのメモリはどこに存在しますか?
すべてのプロセスには、独自の仮想メモリ空間があります。少し単純化するために、あるプロセスに可能性のあるすべてのメモリアドレス0x00000000..0xffffffffがあると想像することができます。その結果、プロセスが他のプロセスに割り当てられたメモリを使用することができなくなります。これは、安定性とセキュリティの両方にとって不可欠です。舞台裏
、カーネルは、すべてのプロセスの割り当てを管理し、それらが重複していないことを確認すること、物理メモリにマップします。もちろん、実際にはすべてのアドレスがマップされているわけではなく、使用されているアドレスのみがマップされています。これはページとCPUハードウェアのメモリマッピングユニットの助けを借りて行われます。共有メモリ(shmget
)の作成
は、任意の特定のプロセスに属していないメモリのチャンクを割り当てます。それだけでそこに座っている。カーネルの観点からは、誰がそれを使用するかは関係ありません。したがって、プロセスはそのプロセスへのアクセスを要求する必要があります。それはshmat
の役割です。これを行うことで、カーネルは共有メモリをプロセスの仮想メモリ空間にマッピングします。このようにして、プロセスはそれを読み書きすることができます。同じメモリなので、「添付」されたすべてのプロセスは同じ内容を参照します。プロセスによって行われる変更は、他のプロセスにも表示されます。