Linux共有メモリ実現メカニズムの詳細解


Linux共有メモリ実現メカニズムの詳細解
メモリ共有:2つの異なるプロセスA、Bがメモリを共有するという意味は、同じ物理メモリがプロセスA、Bそれぞれのプロセスアドレス空間にマッピングされるということです。プロセスAは、プロセスBが共有メモリにおけるデータの更新を即時に見ることができ、その逆もまた然りである。複数のプロセスが同じブロックのメモリ領域を共有するためには、何らかの同期機構が必要です。
这里写图片描述
効率:共有メモリ通信を採用する利点の一つは、プロセスが直接メモリを読み書きすることができるので、データのコピーは不要です。パイプやメッセージ・キューなどの通信方式には、カーネルとユーザ空間で4回のデータコピーが必要であり、共有メモリは2回のデータ[1]:一回は入力ファイルから共有メモリエリアに、もう一回は共有メモリエリアから出力ファイルにコピーする。実際には、プロセス間でメモリを共有する場合、常に少量のデータを読んだり書いたりしてマップを解除するのではなく、新しい通信がある場合、共有メモリ領域を再構築します。共有領域を維持し、通信が完了するまでデータの内容を共有メモリに保存し、ファイルに書き換えていません。共有メモリの内容は、往々にしてマッピングを解除する時にファイルに書き込まれます。したがって、共有メモリを用いた通信方式の効率は非常に高い。
共有メモリ実現機構
共有メモリは、同じブロックのメモリをそれぞれ異なるプロセス空間にマッピングすることにより、プロセス間通信を実現する。共有メモリ自体にはいかなる相互反発と同期機構がありませんが、複数のプロセスが同時に同じメモリを読み書き操作するとメモリの内容が破壊されます。したがって、実際には、同期と相互反発のメカニズムはユーザーによって達成される必要があります。
いくつかのシステムの呼び出し関数を参照してください。
(1)共有メモリの作成
这里写图片描述
パラメータ:keyは出力型パラメータです。
size:sizeのサイズは1024整数倍であるべきです。(4 k配置)
shmflag:パーミッションフラグ
(2)共有メモリを自分のメモリ空間にマッピングする:shmat
shmatは空間マッピングであり、共有メモリを作成することにより、プロセスにアクセスできる前に、このセグメントメモリをユーザープロセス空間にマッピングする必要があります。shmaddrは共有メモリを指定して現在のプロセスのアドレス位置にマッピングします。設定を変更するには有用です。shmflaGはSHM_に設定しなければなりません。RNDマーク多くの場合、空のポインタ(void*)0に設定して、システムに自動的にアドレスを選択させ、プログラムのハードウェアへの依存性を低減させる。shmflagsは上の設定のほか、SHM_に設定することができます。RDONLYは、マッピングされたアドレスが読み取り専用となります。
リターン値:呼び出しが成功したらマッピングアドレスの最初のバイトに戻り、失敗したら-1に戻ります。
(3)解除マッピング:shmdt
这里写图片描述
パラメータは解除するアドレス空間です。
(4)共有メモリの制御
这里写图片描述
まず第三のパラメータの構造体を見てください。
这里写图片描述
这里写图片描述
第二パラメータcmdのオプション:IPC_STAT:共有メモリの状態を取得し、共有メモリのshmid_ds構造体をbufにコピーする
IPC_SET:共有メモリの状態を変えて、bufが指す構造体の中のuid、gid、modeを共有メモリのshmid_にコピーします。DS構造体内
IPC_RMID:この共有メモリを削除します。
BUF:このメモリを共有して構造体を管理します。
コードの実装:
这里写图片描述
这里写图片描述
这里写图片描述
共有メモリの特徴:
(1)共有メモリとは、閉じたくない二つのプロセスが同じメモリにアクセスできるようにすることです。
(2)共有メモリは、実行中の二つのプロセスの間でデータを共有し、転送する最も効果的な方法である。
(3)異なるプロセス間で共有されるメモリは、通常同じ物理メモリに配置される。
(4)共有メモリは、一般的に信号量で臨界リソースを保護する任意の相互反発と同期機構を提供しない。
(5)インターフェースは簡単です
プロセス間通信の特徴:
(1)配管
パイプは名前付きパイプと匿名パイプに分けられている。匿名のパイプは一方向の通信しかできません。親縁関係のあるプロセスでしか使えません。親子プロセスでよく使われています。プロセスがパイプを作成し、forkを呼び出して子プロセスを作成した後、親プロセスは読み取りを停止し、子プロセスは書き込みを停止し、一方通行の通信を実現します。パイプラインはバイトフローに向かっており、相互反発と同期機構を備えており、ライフサイクルはプロセスに従う。
名前付きパイプと匿名パイプ:名前付きパイプは無関係な二つのプロセスの間で許可されます。
(2)信号量
信号量はカウンタであり、複数のスレッドの共有リソースへのアクセスを制御することができます。これは大量のデータを交換するのではなく、マルチスレッド間の同期に用いられ、あるプロセスがリソースにアクセスする時に他のプロセスがアクセスすることを防ぐための一つのロック機構としてよく用いられます。
(3)メッセージキュー
メッセージ・キューはメッセージのチェーンテーブルであり、カーネルに格納され、メッセージ・キュー識別子によって識別され、メッセージ・キューは信号伝達情報の少ないことを克服し、パイプラインはフォーマットなしのバイト・ストリーム及びバッファ領域制限などの特徴を運ぶしかない。メッセージ・キューは、UNIXの異なるプロセスの間でリソース共有が可能な仕組みであり、UNIXは、フォーマットされたデータ・ストリームをメッセージ・キュー形式で任意のプロセスに送信することができ、メッセージ・キューに対して操作権限があるプロセスは、msggetを使ってメッセージ・列の操作制御を完了することができ、メッセージ・タイプを使用することにより、プロセスは順次情報を読むことができます。メッセージの優先順位を設定します。
(4)共有メモリ
共有メモリは、他のプロセスによってアクセスできるメモリをマッピングします。この共有メモリは一つのプロセスで作成されますが、複数のプロセスがアクセスできます。共有メモリは最速のIPC方式です。他のIPC方式に対して動作効率が低く、専門的に設計されています。
    以上はLinux共有メモリ実現メカニズムの内容を詳しく紹介しました。ご参考にして、疑問があれば、当駅にメッセージを残して議論してください。読んでくれてありがとうございます。みなさんのご協力をお願いします。ありがとうございます。