共有メモリ
POSIX には共有メモリの標準化APIとして POSIX Shared Memory がある。これは、sys/mman.h にある shm_open という関数を使う。POSIXのプロセス間通信(POSIX:XSI拡張の一部)には共有メモリ関数として shmat、shmctl、shmdt が含まれている。
shm_open で生成された共有メモリは永続的であり、プロセスが明示的に削除しない限りシステム内に存在し続ける。ただしこれには欠点もあり、共有メモリを削除すべきプロセスがその前に異常終了したとき、その共有メモリがシステムのシャットダウンまで残存し続けることになる。そのような問題を避けるには、mmapを使って共有メモリを作成すればよい。2つの通信しあうプロセスが同じ名前の一時ファイルをオープンし、それに対してmmapすることでファイルをメモリにマッピングする。結果として、メモリマップされたファイル(メモリマップトファイル)への変更はもう一方のプロセスからも同時に観測できる。この技法の利点は、両方のプロセスが終了したとき、OSが自動的にファイルをクローズし、共有メモリを削除する点である。
Linuxカーネル 2.6 では、RAMディスク形式の共有メモリとして /dev/shm が導入された。より正確に言えば、誰でも書き込めるメモリ内のディレクトリであり、その容量の上限は /etc/default/tmpfs で指定できる。/dev/shm 機能サポートはカーネルの設定ファイルで指定でき、デフォルトでは無効となっている。なお、RedHat や Debian ベースのディストリビューションではデフォルトで有効になっている。
ソフトウェアにおける共有メモリは、以下のいずれかを意味する。
プロセス間通信 (IPC) の技法の一つ。同時に動作しているプログラム間でデータを交換する方法である。1つのプロセスがメモリ上に他のプロセスからもアクセスできる領域を作成する。
通常、アクセスする主体ごとにコピーを用意するようなデータがあるとき、仮想記憶機構や何らかの明示的プログラム機構を使ってそれらが同じ実体(物理メモリ)をアクセスするようマッピングすること。共有ライブラリやXIP(英語版) (Execute in Place) でよく使われる。
スレッド実装の一方式
プロセス群は共有メモリ領域に通常のメモリ領域と同じようにアクセスできるので、他のプロセス間通信(名前付きパイプ、ソケット、CORBAなど)と比較して通信手段としては非常に高速である。しかし、プロセス群が同じマシン上で動作しなければならないという制約があり(他のIPC手段はネットワーク上でも機能する)、プロセスが別々のCPU上で動作する場合はハードウェアによる共有メモリを使っていることになり、キャッシュコヒーレンシなどに注意が必要となる。プロセス間の通信がFIFOなストリーム型の場合は、名前付きパイプも通信手段として検討すべきである。