ホームページ  >  記事  >  システムチュートリアル  >  Linux プロセス間でメモリを共有する方法

Linux プロセス間でメモリを共有する方法

WBOY
WBOYオリジナル
2024-06-02 09:18:08577ブラウズ
共有メモリ IPC 原理

共有メモリのプロセス間通信メカニズムは、主にプロセス間で大量のデータを転送するために使用されます。次の図は、共有メモリを使用してプロセス間で大量のデータを転送する概略図を示しています。

Linux プロセス間でメモリを共有する方法

共有メモリは、メモリ内に個別に開かれたメモリ空間であり、アクセス許可、サイズ、最近のアクセス時刻などの独自のデータ構造を持ちます。データ構造は次のように定義されます:

リーリー

2 つのプロセスがこの共有メモリ空間を使用する前に、プロセスのアドレス空間と共有メモリ空間の間の接続を確立する必要があります。つまり、共有メモリ空間をプロセスにマウントします。

システムは共有メモリに次の制限を課します:

リーリー

Linux 共有メモリ管理
1. 共有メモリを作成します リーリー
/*

* 最初のパラメータはキー値で、通常は ftok() 関数によって生成されます
* 2 番目のパラメータは、作成される共有メモリセグメントのサイズ (バイト単位) です
* 3番目のパラメータは、共有メモリセグメントの作成識別子を識別するために使用されます
*/
リーリー

2. 共有メモリ制御 リーリー
/*

※第一引数は操作対象の共有メモリ識別子です
* 2番目のパラメータは実行される操作です
※第3引数はshmid_ds構造体の一時共有メモリ変数情報です
*/
リーリー

3. 共有メモリオブジェクトのマッピング
システムコール shmat() 関数は、共有メモリ セグメントを呼び出しプロセスのデータ セグメントにマップし、メモリ空間の最初のアドレスを返します。その関数は次のように宣言されます。 リーリー

/*

※第一引数は操作対象の共有メモリ識別子です

* 2 番目のパラメータは、共有メモリのマップされたアドレスを指定するために使用されます。0 でない場合、このパラメータはシステムによって割り当てられます
。 ※第3パラメータは共有メモリセグメントのアクセス権限とマッピング条件を指定します
*/
リーリー

4. 共有メモリオブジェクトを切り離す 共有メモリ空間を使用した後、shmdt() 関数呼び出しを使用して、共有メモリ空間を現在のプロセスから分離する必要があります。関数の宣言は次のとおりです:
リーリー

/*

※パラメータは割り当てられた共有メモリの先頭アドレスです

*/
リーリー

親プロセスと子プロセス間の共有メモリに従う規則
1. fork() 関数を使用して子プロセスを作成した後、プロセスは親プロセスによってマウントされた共有メモリを継承します。

2. 新しいプログラムを実行するために exec() が呼び出される場合、マウントされているすべての共有メモリは自動的にアンマウントされます。

3. exit() 関数がプロセス内で呼び出された場合、マウントされているすべての共有メモリが現在のプロセスから切断されます。

プログラム例
共有メモリを申請し、親プロセスが先頭アドレスに整数を格納し、子プロセスがそれを読み出します。
リーリー

/* 共有メモリを申請 */

リーリー

/* 共有メモリをプロセスのアドレス空間にマップする */

リーリー

/* マップ解除 */

リーリー

/* 共有メモリを削除 */

リーリー

出力結果:

以上がLinux プロセス間でメモリを共有する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。