共有メモリ
コンピュータのハードウェアによる共有メモリは、マルチプロセッサシステムにおける複数のCPUがアクセスできるRAMの(通常)大きなブロックを意味する。
共有メモリシステムでは、全プロセッサがデータを共有しているためプログラミングが比較的容易で、同じメモリ位置へのアクセスによって高速なプロセッサ間通信が可能である。問題は、CPUはなるべく高速なメモリアクセスを必要とするため、それぞれにキャッシュメモリを持っていることが多い点である。そのため、以下の2つの問題が生じる。
CPU-メモリ間がボトルネックになりやすい。共有メモリ型コンピュータはあまりプロセッサ数を増やせない(CPUを増やしてもCPU数に比例して性能が強化されなくなる)。多くの場合、10個かそれ以下のプロセッサ数である。
キャッシュコヒーレンシ問題。あるキャッシュ上であるメモリ位置の情報が更新され、それを他のプロセッサが必要とする場合、その更新を他のプロセッサにも反映させなければならない。さもないとそれぞれのプロセッサが一貫していないデータを使って動作することになる。そのためのプロトコルをコヒーレンシプロトコルと呼び、それがうまく機能すれば複数のプロセッサが高速に共有メモリ(上の情報)にアクセスできるようになる。しかし一方で、コヒーレンシプロトコルがオーバーヘッドとなり、性能のボトルネックになることもある。
ボトルネック問題を和らげる技術として、クロスバースイッチ、オメガネットワーク(英語版)、HyperTransport、CPUバスの分離(フロントサイドバスとバックサイドバス、等)などがある。
共有メモリ以外の方式として分散メモリ(英語版)や分散共有メモリがあるが、どちらにも似たような問題がある。また、NUMAも参照。
一般に共有メモリ自体は保護機能をもたないので動作は高速である。しかし共有されるメモリは不定のタイミングで複数のプロセスからアクセスされる可能性がある。競合を避ける為にはセマフォやロックなどで競合を回避しなければならない。
共有メモリによるIPCは、例えばUNIX上のXサーバとアプリケーションの間で画像を転送する場合や、WindowsのCOMライブラリで CoMarshalInterThreadInterfaceInStream() 関数が返す IStream オブジェクトの内部で使われている。一般的に共有メモリが使われるアプリケーションとしてOracleなどのデータベースがある。Unix版OracleではSGAと呼ばれる共有メモリ空間にデータベースバッファキャッシュがおかれて複数のプロセスからアクセスさせて性能の向上を図っている。
動的ライブラリは一度メモリ上に置かれると、それが複数のプロセスにマッピングされ、プロセスごとにカスタマイズされるページ群(シンボル解決に違いが生じる部分)だけが複製され、通常コピーオンライトという機構で、そのページに書き込もうとしたときにコピーが行われる。