共有メモリとは? わかりやすく解説

共有メモリ

読み方きょうゆうメモリ
【英】shared memory

共有メモリとは、マルチタスクを行う際、ユーザー複数メモリアクセスするが、そのそれぞれ衝突することのない技術のことである。

半導体メモリのほかの用語一覧
メモリ:  揮発性メモリ  キャッシュメモリ  記憶領域  共有メモリ  コヒーレンシ  メモリスイッチ  メモリ

セマフォ・共有メモリおよび IPC 関数(semaphore)

導入

このモジュールは、System V IPC 関連の関数へのラッパーを提供します。 セマフォ・共有メモリおよびプロセス間通信(IPC)がその中に含まれます。
セマフォは、マシーン上のリソースへの排他的アクセス機能や、 同時にあるリソースを使用することができるプロセスの数を制限するために 使用することができます。
このモジュールは、System V 共有メモリを使用した共有メモリ関数も 提供します。共有メモリは、グローバル変数へのアクセス手段を提供するために 使用することが可能です。別の httpd デーモンおよび (Perl, C, ... のような)他のプログラムさえ、グローバルデータ交換を 提供するこのデータにアクセスすることが可能です。 共有メモリは、同時アクセスに関して安全ではないということを覚えておいて ください。 同期をとるには、セマフォを使用してください。 表 263. Unix OS による共有メモリの制限
SHMMAX共有メモリの最大サイズ。通常は 131072 バイト
SHMMIN共有メモリの最小サイズ。通常は 1 バイト
SHMMNI共有メモリセグメントの最大数。通常は 100
SHMSEGプロセス毎の共有メモリの最大数。通常は 6


メッセージング関数は、他のプロセスと相互にメッセージを送受信する ために使用することができます。 これにより簡単で効率的なプロセス間のデータ交換が可能であり、 Unix ドメインソケットを用いる場合のような設定は不要です。
注意: この拡張モジュールは Windows 環境では利用できません。

要件

外部ライブラリを必要としません。

インストール手順

この関数はデフォルトでは有効になってはいません。System V セマフォの サポートを有効にするには、オプション --enable-sysvsem を指定して PHP を コンパイルする必要があります。System V 共有メモリのサポートを有効にするには、 オプション --enable-sysvshm を 指定して PHP をコンパイルする必要があります。System V メッセージを有効に するには、オプション --enable-sysvmsg を指定して PHP をコンパイル します。

実行時設定

php.ini の設定により動作が変化します。
表 264. セマフォ設定オプション
名前デフォルト変更の可否変更履歴
sysvmsg.value"42"PHP_INI_ALL 
sysvmsg.string"foobar"PHP_INI_ALL 

PHP_INI_* 定数の詳細および定義については 付録 G. php.ini ディレクティブ を参照してください。

リソース型


定義済み定数

以下の定数が定義されています。 この関数の拡張モジュールが PHP 組み込みでコンパイルされているか、 実行時に動的にロードされている場合のみ使用可能です。
表 265. System V メッセージ定数
定数変更履歴
MSG_IPC_NOWAITinteger 
MSG_EAGAINinteger5.2.0 以降
MSG_ENOMSGinteger5.2.0 以降
MSG_NOERRORinteger 
MSG_EXCEPTinteger 


目次

ftok — パス名とプロジェクト ID を、System V IPC キーに変換する
msg_get_queue — メッセージキューを作成またはそれにアタッチする
msg_receive — メッセージキューからメッセージを受信する
msg_remove_queue — メッセージキューを破棄する
msg_send — メッセージキューにメッセージを送信する
msg_set_queue — メッセージキューデータ構造体の情報を設定する
msg_stat_queue — メッセージキューデータ構造体の情報を返す
sem_acquire — セマフォを得る
sem_get — セマフォ ID を得る
sem_release — セマフォを解放する
sem_remove — セマフォを削除する
shm_attach — 共有メモリセグメントを作成またはオープンする
shm_detach — 共有メモリセグメントへの接続を閉じる
shm_get_var — 共有メモリから変数を返す
shm_put_var — 共有メモリの変数を挿入または更新する
shm_remove_var — 共有メモリから変数を削除する
shm_remove — Unix システムから共有メモリを削除する

共有メモリ

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2025/07/22 23:49 UTC 版)

情報処理において共有メモリ(きょうゆうメモリ)とは、複数のプログラムが同時並行的にアクセスするメモリである。

概要

3つのプロセッサによる共有メモリシステムの図。

複数のプログラム間の通信手段として使う場合と、単に複製を用意する冗長さを防ぐ目的の場合などがある。共有メモリはプログラム間でデータをやりとりする効率的手段である。文脈によって、それらプログラムが単一のプロセッサ上で動作する場合と複数の異なるプロセッサ群上で動作する場合がある。単一のプログラムの内部でメモリを使って通信する場合もあり、例えばマルチスレッドが典型的だが、仮想空間をもともと共有している場合は「共有メモリ」とは呼ばない。

ハードウェアによる共有メモリ

コンピュータのハードウェアによる共有メモリは、マルチプロセッサシステムにおける複数のCPUがアクセスできるRAMの(通常)大きなブロックを意味する。

共有メモリシステムでは、全プロセッサがデータを共有しているためプログラミングが比較的容易で、同じメモリ位置へのアクセスによって高速なプロセッサ間通信が可能である。問題は、CPUはなるべく高速なメモリアクセスを必要とするため、それぞれにキャッシュメモリを持っていることが多い点である。そのため、以下の2つの問題が生じる。

  • CPU-メモリ間がボトルネックになりやすい。共有メモリ型コンピュータはあまりプロセッサ数を増やせない(CPUを増やしてもCPU数に比例して性能が強化されなくなる)。多くの場合、10個かそれ以下のプロセッサ数である。
  • キャッシュコヒーレンシ問題。あるキャッシュ上であるメモリ位置の情報が更新され、それを他のプロセッサが必要とする場合、その更新を他のプロセッサにも反映させなければならない。さもないとそれぞれのプロセッサが一貫していないデータを使って動作することになる。そのためのプロトコルをコヒーレンシプロトコルと呼び、それがうまく機能すれば複数のプロセッサが高速に共有メモリ(上の情報)にアクセスできるようになる。しかし一方で、コヒーレンシプロトコルがオーバーヘッドとなり、性能のボトルネックになることもある。

ボトルネック問題を和らげる技術として、クロスバースイッチオメガネットワーク英語版HyperTransportCPUバスの分離(フロントサイドバスとバックサイドバス、等)などがある。

共有メモリ以外の方式として分散メモリ英語版分散共有メモリがあるが、どちらにも似たような問題がある。また、NUMAも参照。

GPU内の共有メモリ

GPGPUに対応したモダンなGPUは、GPUのスレッドブロック(ワークグループ、スレッドグループ)内でのみアクセス可能な共有メモリ(ローカルメモリ、グループ共有メモリ)を有している。この共有メモリは、VRAM上に確保されるグローバルメモリと比べると小容量だが高速であり、アプリケーションコードから操作可能なキャッシュメモリの役割を果たす[1]CUDAOpenCLDirectComputeのようなAPIは、それぞれ名称は異なるものの、このGPU共有メモリを利用する機能を持ち、グローバルメモリから読み出したデータをGPUのスレッドブロック内で共有したり、計算結果を交換したりする用途に活用することで、高速化を図ることができる。

ソフトウェアによる共有メモリ

ソフトウェアにおける共有メモリは、以下のいずれかを意味する。

  • プロセス間通信 (IPC) の技法の一つ。同時に動作しているプログラム間でデータを交換する方法である。1つのプロセスがメモリ上に他のプロセスからもアクセスできる領域を作成する。
  • 通常、アクセスする主体ごとにコピーを用意するようなデータがあるとき、仮想記憶機構や何らかの明示的プログラム機構を使ってそれらが同じ実体(物理メモリ)をアクセスするようマッピングすること。共有ライブラリXIP (Execute in Place) でよく使われる。
  • スレッド実装の一方式

プロセス群は共有メモリ領域に通常のメモリ領域と同じようにアクセスできるので、他のプロセス間通信(名前付きパイプソケットCORBAなど)と比較して通信手段としては非常に高速である。しかし、プロセス群が同じマシン上で動作しなければならないという制約があり(他のIPC手段はネットワーク上でも機能する)、プロセスが別々のCPU上で動作する場合はハードウェアによる共有メモリを使っていることになり、キャッシュコヒーレンシなどに注意が必要となる。プロセス間の通信がFIFOストリーム型の場合は、名前付きパイプも通信手段として検討すべきである。一般に共有メモリ自体は保護機能をもたないので動作は高速である。しかし共有されるメモリは不定のタイミングで複数のプロセスからアクセスされる可能性がある。競合を避ける為にはセマフォやロックなどで競合を回避しなければならない。

共有メモリによるIPCは、例えばUNIX上のXサーバとアプリケーションの間で画像を転送する場合や、WindowsCOMライブラリで CoMarshalInterThreadInterfaceInStream() 関数が返す IStream オブジェクトの内部で使われている。一般的に共有メモリが使われるアプリケーションとしてOracleなどのデータベースがある。Unix版OracleではSGAと呼ばれる共有メモリ空間にデータベースバッファキャッシュがおかれて複数のプロセスからアクセスさせて性能の向上を図っている。

動的ライブラリは一度メモリ上に置かれると、それが複数のプロセスにマッピングされ、プロセスごとにカスタマイズされるページ群(シンボル解決に違いが生じる部分)だけが複製され、通常コピーオンライトという機構で、そのページに書き込もうとしたときにコピーが行われる。

UNIXでのサポート

POSIX には共有メモリの標準化APIとして POSIX Shared Memory がある。これは、sys/mman.h にある shm_open という関数を使う[2]。POSIXのプロセス間通信(POSIX:XSI拡張の一部)には共有メモリ関数として shmatshmctlshmdt が含まれている[3][4]

shm_open で生成された共有メモリは永続的であり、プロセスが明示的に削除しない限りシステム内に存在し続ける。ただしこれには欠点もあり、共有メモリを削除すべきプロセスがその前に異常終了したとき、その共有メモリがシステムのシャットダウンまで残存し続けることになる。そのような問題を避けるには、mmapを使って共有メモリを作成すればよい[5]。2つの通信しあうプロセスが同じ名前の一時ファイルをオープンし、それに対してmmapすることでファイルをメモリにマッピングする。結果として、メモリマップされたファイル(メモリマップトファイル)への変更はもう一方のプロセスからも同時に観測できる。この技法の利点は、両方のプロセスが終了したとき、OSが自動的にファイルをクローズし、共有メモリを削除する点である。

Linuxカーネル 2.6 では、RAMディスク形式の共有メモリとして /dev/shm が導入された。より正確に言えば、誰でも書き込めるメモリ内のディレクトリであり、その容量の上限は /etc/default/tmpfs で指定できる。/dev/shm 機能サポートはカーネルの設定ファイルで指定でき、デフォルトでは無効となっている。なお、RedHatDebian ベースのディストリビューションではデフォルトで有効になっている。

Androidでのサポート

Android では Linux カーネルを使用しているが、IPC 関係が一部無効になっており、独自に開発した(現在はLinuxカーネルに入っている)ashmem (anonymous shared memory) を使用している。メモリが不足したときにカーネルが解放する仕組みがあり、解放されないようにするには、ashmem_pin_region() を使い指定する。

Windowsでのサポート

Microsoft Windowsでは、Win32 APICreateFileMapping()関数を使って共有メモリ(メモリマップトファイル)を作成することができる[6]。クライアント側プロセスはOpenFileMapping()関数を使って、ホスト側プロセスにて作成済みの共有メモリのハンドルを取得することができる。共有メモリを各プロセスのアドレス空間にマッピングするにはMapViewOfFile()関数を使う。

なおWindows APIには、CreateSharedMemory() [7][8]など “-SharedMemory” の名前を持つ関数があるが、これはセキュリティ関連のAPIであり、メモリ共有のためのAPIではない。これをメモリ共有のために使用すれば、リソースを大量に消費しシステムリソースを使い果たす可能性がある。

プログラミング言語ごとのサポート

一部のC++ライブラリは、共有メモリ機能への移植性の高いオブジェクト指向的なアクセスを提供している。例えば、Boost C++ライブラリには Boost.Interprocess があり[9]POCO C++ Libraries には Poco::SharedMemory、Qt には QSharedMemory クラスがある[10]

PHP では POSIX で定義している関数群とよく似た共有メモリ用APIが存在する[11]

.NET Frameworkはバージョン4でSystem.IO.MemoryMappedFiles.MemoryMappedFileクラス[12]を標準化した。.NETあるいはXamarin (Mono) を通じて、Windows以外の他のプラットフォームでも利用できる。

脚注

  1. ^ CUDAプログラミングの基本 / パート II - カーネル | NVIDIA
  2. ^ Documentation of shm_open from the Single UNIX Specification
  3. ^ Robbins, Kay A.; Steven Robbins (2003). UNIX systems programming: communication, concurrency, and threads (2 ed.). Prentice Hall PTR. p. 512. ISBN 978-0-13-042411-2. https://books.google.co.jp/books?id=tdsZHyH9bQEC&redir_esc=y&hl=ja 2011年5月13日閲覧. "The POSIX interprocess communication (IPC) is part of the POSIX:XSI Extension and has its origin in UNIX System V interprocess communication." 
  4. ^ Shared memory facility from the Single UNIX Specification.
  5. ^ Stevens, Richard (1999). UNIX Network Programming, Volume 2, Second Edition: Interprocess Communications. (2 ed.). Prentice Hall PTR. p. 311. ISBN 0-13-081081-9 
  6. ^ Creating Named Shared Memory - Windows applications | Microsoft Docs
  7. ^ CreateSharedMemory function (Windows), Internet Archive
  8. ^ LSA_CREATE_SHARED_MEMORY (ntsecpkg.h) - Win32 apps | Microsoft Learn
  9. ^ Chapter 16. Boost.Interprocess - 1.80.0
  10. ^ QSharedMemory Class Reference
  11. ^ PHP 共有メモリ関数
  12. ^ MemoryMappedFile Class (System.IO.MemoryMappedFiles) | Microsoft Docs

関連項目

学習参考書

外部リンク


共有メモリ

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2022/03/18 09:34 UTC 版)

GPGPU」の記事における「共有メモリ」の解説

GPUによるVRAMへのアクセスは、複数プロセッサ群によって並列的に発生するため、連続したメモリ領域対するコアレスアクセス(coalesce access、≒シーケンシャルアクセス)を行なうことで効率化高速化できる。NVIDIA GPUでは32のハードウェアスレッドを束ねるバッチ単位Warp呼びAMD GPUでは64のハードウェアスレッドを束ねるバッチ単位Wavefront呼んでいるが、これらのユニット内ではプロセッサが完全に同期し動作するため、バッチ単位ごとにまとめて連続領域アクセス(コアレスアクセス)することで効率良くなる逆に言えばバッチ単位内のスレッドそれぞれ遠く離れたばらばらのアドレスアクセスするような非コアレスアクセス(≒ランダムアクセス)は効率悪くなるGPGPU本質は、大量演算器によって実現されるハードウェアマルチスレッド集合用いたデータ並列演算により性能を稼ぐ点にある。例えNVIDIA GPUのFermi/Keplerマイクロアーキテクチャでは、演算器の最小単位CUDAコア (SP, streaming processor) と呼び、また複数CUDAコア束ねる単位SMX (SM, streaming multiprocessor) と呼んでいるが、GPUでの演算は、複数SMXに対して同一命令発行していき、各々のハードウェアスレッドに割り当てられデータに対して並列的に演算行なうスタイルとなる。またWarp単位内における各スレッドはすべて同一命令実行するSIMT英語版))。基本概念としてはAMDVLIWGraphics Core NextといったGPUアーキテクチャにおいても同様である。 しかし、このGPGPUプログラミングが特に従来型CPUプログラミング異なる点は、共有メモリ(shared memory、シェアードメモリ)の存在である。共有メモリは小容量だが高速で、ユーザープログラマーが明示的に管理できるキャッシュメモリ(≒L1キャッシュ)の仕組み果たし複数コアデータ共有交換する目的使用できる。なお各APIにおいてはCUDAは共有メモリ、OpenCLはローカルメモリ、DirectComputeグループ共有メモリ、そしてC++ AMPタイル静的メモリという名称で、それぞれ同等機能備えている。 例えばFermi/Keplerマイクロアーキテクチャでは、1SMXあたり最大48KBの共有メモリを使用できるが、外部にあるDRAMキャッシュなしでアクセスする場合比べて、共有メモリのレイテンシは(スレッド間のバンクコンフリクトがないかぎり)100倍小さくなる。そのため、複数スレッドから参照されるデータ一時書き込み場所として共有メモリを活用することにより、高速並列アルゴリズム(たとえば高速総和求め並列リダクションなど)や、GPUプログラミングにおける高速化必要なコアレスアクセス(≒シーケンシャルアクセス)を実現することができるとNVIDIA説明している。しかしながら最大でも48KBしかない共有メモリというハードウェア制約アルゴリズムの幅に制限をかけるため、共有メモリの存在GPUプログラミング難しさにもつながってしまう。また、共有メモリに読み書きする際、スレッド間の同期をとるための処理もプログラマー明示的に記述する必要がある。 なお、インテルCPUL2キャッシュメモリはL1キャッシュメモリ比べて容量大きく、またプロセッサコア側に直結されているが、NVIDIA GPUL2キャッシュメモリはL1キャッシュメモリ比べて容量がほとんど変わらず、またメモリ側に直結されているなど、データアクセス傾向違いハードウェア設計思想違いにも反映されており、単純にキャッシュメモリ容量だけを比較して性能優劣決めることはできない

※この「共有メモリ」の解説は、「GPGPU」の解説の一部です。
「共有メモリ」を含む「GPGPU」の記事については、「GPGPU」の概要を参照ください。

ウィキペディア小見出し辞書の「共有メモリ」の項目はプログラムで機械的に意味や本文を生成しているため、不適切な項目が含まれていることもあります。ご了承くださいませ。 お問い合わせ



固有名詞の分類


英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  

辞書ショートカット

すべての辞書の索引

「共有メモリ」の関連用語

共有メモリのお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



共有メモリのページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

   
IT用語辞典バイナリIT用語辞典バイナリ
Copyright © 2005-2025 Weblio 辞書 IT用語辞典バイナリさくいん。 この記事は、IT用語辞典バイナリの【共有メモリ】の記事を利用しております。
PHP Documentation GroupPHP Documentation Group
Copyright © 1997 - 2025 by the PHP Documentation Group.
ウィキペディアウィキペディア
All text is available under the terms of the GNU Free Documentation License.
この記事は、ウィキペディアの共有メモリ (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。 Weblio辞書に掲載されているウィキペディアの記事も、全てGNU Free Documentation Licenseの元に提供されております。
ウィキペディアウィキペディア
Text is available under GNU Free Documentation License (GFDL).
Weblio辞書に掲載されている「ウィキペディア小見出し辞書」の記事は、WikipediaのGPGPU (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。

©2025 GRAS Group, Inc.RSS