共有メモリのプロセス間通信の下でのLinux

コンセプト:このメカニズムは、それらにアクセスする共有メモリ領域に共通のデータ構造により、二つ以上のプロセスを可能にします。プロセスは、このデータ構造は、それ自身のアドレス空間、この共有メモリ領域に関連した新しい線形ゾーンマップページフレームに新しい線形領域を追加する必要がある共有メモリ領域にアクセスする場合。このようなページフレームは、カーネルのページング要求により、簡単な処理で行うことができます。

利点:共有メモリ(共有メモリ)、Linuxのプロセスの最も簡単な最大の自由度との間の通信の手段の一つです。共有メモリを使用して、異なるプロセスが読み込まれ、同じメモリに書き込むことができます。すべてのプロセスが追加のオペレーティングシステムやカーネルの呼び出しを必要とせずに、独自のメモリ空間と同じ共有メモリへのアクセスを、アクセスするには、だけでなく、メモリの冗長コピーを避けるために、そうするので、この方法では、最も効率的かつ最速でありますプロセス間通信。

欠点:カーネルは、データの書き込み動作の前に同じアドレスに同時に共有メモリなどの共有メモリへのアクセスを同期するための任意のメカニズムを、提供していない、書き込みデータが上書きされます。したがって、典型的には共有メモリの使用は、同期と相互排他を読み書き(例えばセマフォのような)他のIPCメカニズムを使用する必要があります。

基本的な

Linuxのメモリ管理メカニズムを学び、共有メモリの原理を理解するのは簡単です。我々はすべて知っているように、それはページサイズが4kのある一般的にLinuxで、ユニットのカーネルメモリ管理ページ(ページ)です。プログラム自体は線形仮想アドレス空間で、カーネルから該当ページにマッピングされた仮想アドレス空間からのプロセスを管理します。あなたが共有メモリ空間を作成した後、カーネル仮想アドレスマップと同じページに異なるプロセス:だから、異なるプロセスでは、最終的には同じページにマッピングされる共有メモリのメモリアドレスへのアクセス。次の図は、共有メモリの作用機構を示します。

 

使用

共有メモリの使用量は、作成に分けることができます - >接続 - >使用 - >分離 - >これらのステップを破壊します。

たshmgetは、次のように(共有メモリGET)機能を使用する共有メモリ機能を使用して作成しました:

たshmget segment_idに= INT(shm_key、はgetpagesize()、IPC_CREAT | S_IRUSR | S_IWUSER);
たshmget 3パラメータを作成するための一連のパラメータであり、サイズPAGE_SIZE係るshm_keyの共有メモリ空間を作成します。shm_keyが作成されている場合、shm_key戻り、共有メモリIDを作成するには、それに接続することができます。
一度作成、共有メモリを作るために順番に操作に接続しなければならない現在のプロセスで使用することができます。(共有メモリアタッチ)関数にshmatを使用して、共有メモリIDを経由して渡されたパラメータがたshmgetに戻します:

= SHARED_MEMORY(チャー*)にshmat(segment_idに、0、0)
にshmatは、プロセスなどのプロセスの仮想アドレス空間にマッピングされたアドレス・ポインタは共有メモリへのアクセスのような一般的なメモリ・バッファにアクセスすることができる返します。例の後に我々はすべて、デフォルトの接続を二つのパラメータ0を通過しました。実際には、2番目のパラメータが0の場合、アドレス空間の仮想アドレスの接続処理という希望で、Linuxは、彼らは、適切なアドレスを選択します。3番目のパラメータは、接続オプションがあることもある。
SHM_RND:第二パラメータ点次のパラメータは、あなたが言及二番目のパラメータ自身のメモリ空間のサイズを制御する必要がある場合は、自動的にページサイズの整数倍に昇格メモリ空間は、私は知りません。

SHM_RDONLY:共有メモリは読み取り専用で、書き込み不可。

接続デ関数にshmdt(共有メモリDETACH)を使用して、共有メモリの使用を終了します。パラメータとしてメモリアドレスを返すためにshmat機能。共有メモリを使用した最後のプロセスのそれぞれは、共有メモリを取り外した後、カーネルが自動的に共有メモリを破壊します。もちろん、最高の我々は、明示的にメモリを共有リソースの無駄な浪費を避けるために破壊することができます。関数shmctl(共有メモリ制御)など、情報共有メモリとその制御を返すことができます

shmctl(segment_idに、IPC_STAT、&shmbuffer );
共有メモリについての情報を返すことができ、情報はshmid_ds構造体に格納されている第三のパラメータによって指されます。
着信IPC_RMIDが二番目の引数に、共有メモリは、共有メモリ共有メモリの分離のプロセスの共有メモリを使用するときに最後に破壊されます。

他の多くの使用があるshmctl、それらを繰り返しません。

サンプルプログラム

次のプログラム例では、プロセスAは共有メモリへのすべての第2の乱数、共有メモリすべての読み出し工程Bから1秒の数を書き込まれます。

/ *
* AC
* 1秒毎SHMに0と999の間の乱数を書き込む
* /
の#include <stdio.hに>
する#include <unistd.h>
は<sys / shm.h>する#include
する#include <STDLIB.H >
の#include <error.h>
int型のmain(){
int型shm_id。
int型*シェア。
int型NUM;
srand関数(時間(NULL));
shm_id =たshmget(1234はgetpagesize()、IPC_CREAT)。
IF(shm_id == -1){
perrorは( "たshmget()")。
}
シェア=(INT *)にshmat(shm_id、0、0);
一方、(1){
NUM =ランダム()%1000;
*シェア= NUM;
printf(NUM "乱数%d個の\ nを書き込みます")。
睡眠(1)。
}
0を返します。
}

/ *
* BC
* SHMから1秒ごとに読み取る
* /
の#include <stdio.hに>
する#include <unistd.h>
の#include <SYS / shm.h>
の#include <STDLIB.H>
する#include <error.h >
int型のmain(){
int型shm_id。
int型*シェア。
shm_id =たshmget(1234はgetpagesize()、IPC_CREAT)。
IF(shm_id == -1){
perrorは( "たshmget()")。
}
シェア=(INT *)にshmat(shm_id、0、0);
一方、(1){
睡眠(1)。
printf( "%d個の\ n"は、*シェア)。
}
0を返します。
}

 

おすすめ

転載: www.cnblogs.com/best-farmer/p/10985387.html