Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> Linuxチュートリアル >> プロセス間通信の研究の概要

プロセス間通信の研究の概要

  
 

、共有メモリを使用するには、以下のステップを有するべきである:1共有メモリたshmgetを開く()2 3書き込み/本プロセスはこれを使用して4を禁止読み取る)本発明の方法は、(共通の共有メモリブロックにshmatを使用することを可能にします。共有メモリブロックにshmdtは()5.この共有メモリshmctl()またはコマンドのipcrm

を削除し、共有メモリは、ラインの下のIPCの最速の形態で最も有用なプロセス間通信モデルの一つであると言うことができます。 Aは、Bに共有メモリ手段2つの異なるプロセスが同じ物理メモリは、プロセスA、B自身のプロセスのアドレス空間にマッピングされています。プロセスは、瞬時にその逆のプロセスBに共有メモリデータを更新し、見ることができます。複数のプロセスが同じメモリ領域を共有しているため、必然的な必要性は、同期メカニズム、ミューテックスロックやセマフォのいくつかの種類をすることができます。

A:高効率の共有メモリ通信を使用しての概念

明白な利点は、処理は直接、任意のデータのコピーを必要とせず、メモリを読み書きすることができるからです。二回の通信およびメッセージキューのための導管のような、データのコピーは、4つのカーネルとユーザ空間において必要とされる、共有メモリデータの唯一のコピー[1]:共有メモリ領域への入力ファイルからの時間、から共有別の出力ファイルにメモリ領域。実際には、プロセス間共有メモリに常に少量のデータではないマップされていない、新しいコミュニケーションがあった場合、再構築の共有メモリ領域の後に読み書きします。通信が完了するまで、コンテンツデータを共有メモリに格納されていて、ファイルを書いていないように、しかし、アップ、共有領域を保ちます。あなたがマップを持ち上げるためにファイルを書き込むときにのみコンテンツの共有メモリがしばしばあります。このように、共有メモリを用いた通信の効率が非常に高いです。 Linux 2.2.xカーネルは、このようなのmmap()システムコール、Posixの共有メモリー、およびSystem Vの共有メモリとして、共有メモリのさまざまなをサポートしています。 LinuxディストリビューションなどのRedhat 8.0のサポートのmmap()システムコールとSystem V共有メモリが、Posixの共有メモリを実現していなかった、この論文は、原則とSystem V共有メモリAPIのアプリケーションを記述しています。

System V共有メモリは共有メモリ領域(IPC共有メモリ領域)内のすべての共有データを参照し、データにアクセスしたい任意のプロセスは、このプロセスのアドレス空間内のメモリのブロックを追加する必要があります物理メモリページを共有地図データを格納します。

システムVファイルSHM共有メモリプロセス間通信をマッピングすることによって、特別なファイルシステムです。すなわち、(shmid_kernel構造によって連結された)ファイルシステムSHMにおける特殊ファイルに対応する共有メモリ領域は、後述されます。

プロセスが行わ呼ばれる共有データIPC共有メモリ領域に配置する必要の間、全てのプロセスの共有領域にアクセスする必要が
が移動するには、このプロセスのアドレス空間を共有する地域をマップする必要があります。共有メモリシステムV IPCを得るまたは共有メモリ領域を作成し、そしてたshmgetによって対応する識別子を返します。取得または保証でカーネルは、共有メモリ領域を作成しても、特殊なファイルシステムSHMで、同時にshmid_kernel構造を対応する共有メモリ領域を初期化し、同じ名前のファイルを作成して開き、メモリ内の適切なファイルを確立するたshmget dentryとinode構造体は、新しくオープンしたファイルは、(任意のプロセスは、共有メモリ領域にアクセスすることができる)任意のプロセスに属していません。このすべてがたshmgetシステムコールを行います。次のように定義され、コンバイン共有メモリ領域がブリッジに格納されたデータ構造に非常に重要であるshmid_kernel、各ゾーンは、共有メモリ制御構造の構造体shmid_kernelを有し、ファイルシステム管理:注:構造体shmid_kernel {構造体kern_ipc_perm shm_perm。構造体ファイル*のshm_file; int型のID; unsigned long型shm_nattchを、unsigned long型shm_segszに、time_t型shm_atim; time_t型shm_dtim; time_t型shm_ctim; pid_t shm_cprid; pid_tのshm_lprid;};最も重要な分野の構造はshm_fileする必要がありますが、それは次のようになります保存しますマッピングファイルに対応しています。共有メモリモードをながら、ファイルシステムのSHMの特定のファイルに対応する各共有オブジェクトのメモリ領域は、通常の状況下では、特殊なファイルシステムSHMファイルは、等にアクセスするためのリード()、write()メソッドで使用されていませんプロセスのアドレス空間にマッピングされたファイルの後に、直接そのメモリアクセスのアクセスに使用することができます。

メッセージキューセマフォなどのカーネルデータ構造により、構造体ipc_idsのshm_idsは、すべてのシステムの共有メモリ領域を維持するとして。 shm_ids.entries上図は、変数は構造配列を指すipc_id、各アレイは構造ipc_id kern_ipc_perm点ポインタ構造を有しています。ここでシステムV共有メモリ領域について、読者に精通している必要がありkern_ipc_permホストがshmid_kernelは、カーネルは、すべてのシステムの共有領域を制御することができるように、共有メモリの領域を記述するために使用される、shmid_kernel構造です。一方、ファイルに対応するファイルシステムのSHM shm_fileを指すファイルタイプshmid_kernelポインタの構成では、ファイルシステム内のSHMファイルに対応付けて共有メモリ領域に、そのように。共有メモリ領域を作成した後、システムがこの関数にshmat()を完了するために呼び出し、プロセスのアドレス空間にマップされなければなりません。あなたがたshmget()を呼び出すとき、共有メモリ領域は、したがって対応として、SHMファイルシステムが同じ名前のファイルで作成されているので、()にshmatを呼び出して、マッピングファイルのプロセス工程におけるファイルシステムSHMと同じ名前と同じです。

II:System V共有メモリAPIの

Vは、主に以下のAPIで、システムのメモリを共有:たshmget()にshmat()にshmdt()とshmctl()。 #include< SYS /ipc.h>の#include< SYS /shm.h>

たshmget()指定された領域を作成するために、対応する共有領域に存在しない場合は、共有メモリ領域IDを取得するために使用されます。プロセスは簡単に訪問のための領域を共有することができるようにshmat()は、どこへ行くか、呼び出し元プロセスのアドレス空間に共有メモリ領域をマッピングします。 shmdt()コールは、共有メモリ領域をマッピングする過程を緩和するために使用されます。共有メモリ領域の制御動作を実現shmctl。

III:実施例

例示的な通信システムV共有メモリを介して二つのプロセス。

の#include< SYS /ipc.h>の#include< SYS /shm.h>の#include< SYS /types.hで>の#include< unistd.h> typedefの構造体{文字名[ ,null,null,0],4]; int型の年齢;}人々; //プロセスのアドレス空間は、メモリマッピングメインの共有メモリ領域を開きます(int型のargc、char型** ARGV){int型のshm_id、私は、key_tのキー; char型の温度;人* p_map; CHAR *名前="の/dev /SHM /myshm2";キー= ftok(名前、0); //元である「a'if(キー== - 1)にperror(" ftokエラー"); shm_id =たshmget(キー、4096、IPC_CREAT); IF(shm_id == - 1) {perrorは("たshmgetエラー");戻り、 }

p_map =(人*)にshmat(shm_id、NULL、0); //プロセスのアドレス空間は、メモリ温度にマッピング= '';のため(i = 0; I< 10; iは++) {TEMP + = 1;のmemcpy((*(p_map + I))名、&#038; TEMP、1); //共有メモリの書き込み動作(それはメモリ内のマッピングプロセスで書かれている)、

(*(p_map + I))年齢= 20 + I;. //(*(p_map I +)) .nameの等価(p_map + I) - >名 }(にshmdt(p_map)== - 1)であれば//マッピングされていないにperror(" DETA CHエラー");}#含む< SYS /ipc.h>の#include< SYS /shm.h>の#include< SYS /types.hで>の#include< unistd.h> typedefの構造体{文字名[4]; int型の年齢;}人々、主(int型ARGC、チャー** ARGV){int型shm_id、I; key_tのキー、人々は* p_map; CHAR *名前="の/dev /SHM /myshm2";キー= ftok (名前、0); IF(キー== -1)にperror(" ftokエラー"); shm_id =たshmget(キー、4096、IPC_CREAT); IF(shm_id == -1) {perrorは("たshmgetエラー");戻り、 } p_map =(人*) shmat(shm_id、NULL、0); {のprintf(; I< 10 iは++ I = 0)ため("名:%S \\ N",(*(p_map + I))名); //共有メモリ(つまり、読み出しプロセスメモリマップである)のprintf読み出し動作("年齢%d個の\\ N",(*(p_map + I))年齢。);}もし(にshmdt(p_map)== -1)にperror(");エラー"を取り外す}

システムV共有メモリ領域を作成し、フォーマットデータが書き込まれtestwrite.c、同じシステムV共有メモリ領域へのアクセスtestread.c、読み出しフォーマットされたデータ。 2つのプログラムがtestwriteとtestread用にコンパイルされ、そして./testwrite ./testread ./testread以下の出力を行った:名前:B年齢20;名:C 21歳;名:D年齢22;名:E年齢23;名:年齢24 F;名:G年齢25;名:H年齢26;名:私は27年齢;名:J年齢28;名:K年齢29。

Copyright © Windowsの知識 All Rights Reserved