共有メモリ オブジェクト (shm_open を使用して作成) と共有メモリ セグメント (shmget) の違いは何ですか?
共有メモリの shmmax と shmall の場合のように、調整できない制限はありますか?
これら 2 つの間にパフォーマンスの違いはありますか? また、どのような IPC シナリオでこれらを使用する必要がありますか?
共有メモリ オブジェクト (shm_open を使用して作成) と共有メモリ セグメント (shmget) の違いは何ですか?
共有メモリの shmmax と shmall の場合のように、調整できない制限はありますか?
これら 2 つの間にパフォーマンスの違いはありますか? また、どのような IPC シナリオでこれらを使用する必要がありますか?
テストで、経由でアクセスしたメモリは、経由でアクセスshm_open
したメモリよりも高速であることがわかりましたshmget
。それ以外は、機能の点でかなり似ています。この 2 つの間には、キャッシュまたは TLB に微妙な違いがあるはずですが、内部の詳細についてはよくわかりません。
shm_open
このパフォーマンスを向上させるには、POPULATE オプションを使用する必要があったことに注意してください。
「shmget」は、Linux カーネルに実装されている共有メモリを割り当てる Linux 固有の方法です。
「shm_open」は、mmap を使用してファイルをマッピングすることにより、共有メモリをエミュレートするライブラリ関数です。ファイルは「共有」フラグを使用してマップされるため、メモリはプロセス間で共有されます。
Linux 1.x では、「/dev/shm」ディレクトリ (ファイルを含む) は単なる通常のディレクトリであったため、「shm_open」を使用する共有メモリは実際にはディスク ファイルでした。Linux 3.x では、"/dev/shm" は、共有メモリを実際にディスクに書き込まなければならないことを避けるための特別なディレクトリです。
2つの方法の両方を他の方法に置き換えることができると思います。共有メモリを作成するために 2 つの異なる方法があるのは、歴史的な理由によるものです。