C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

共有メモリを介したIPC


共有メモリは、2つ以上のプロセス間で共有されるメモリです。しかし、なぜメモリやその他の通信手段を共有する必要があるのでしょうか?

繰り返しになりますが、各プロセスには独自のアドレススペースがあり、プロセスが独自のアドレススペースから他のプロセスに情報を通信する場合は、IPC(プロセス間通信)技術でのみ可能です。すでに認識しているように、コミュニケーションは関連するプロセス間または関連しないプロセス間で行うことができます。

通常、相互に関連するプロセス通信は、パイプまたは名前付きパイプを使用して実行されます。無関係なプロセス(たとえば、ある端末で実行されているプロセスと別の端末で実行されている別のプロセス)の通信は、名前付きパイプを使用するか、共有メモリとメッセージキューの一般的なIPC技術を介して実行できます。

パイプと名前付きパイプのIPC手法を見てきましたが、残りのIPC手法、つまり共有メモリ、メッセージキュー、セマフォ、信号、メモリマッピングについて知るときが来ました。

共有メモリを介したIPC

2つ以上のプロセス間で通信するために共有メモリを使用することはわかっていますが、共有メモリを使用する前に、システムコールで実行する必要があることを確認してください-

  • 共有メモリセグメントを作成するか、作成済みの共有メモリセグメントを使用します(shmget())

  • すでに作成されている共有メモリセグメントにプロセスをアタッチします(shmat())

  • すでに接続されている共有メモリセグメントからプロセスを切り離します(shmdt())

  • 共有メモリセグメントの操作を制御する(shmctl())

ここでは、2つのプロセスを作成します。 1つは書き込み可能で、もう1つは読み取り可能です。リーダーとライターのプロセスが共有メモリを使用してどのように機能しているかを見てみましょう。

サンプルコード

#include <iostream>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
using namespace std;
main() {
   key_t my_key = ftok("shmfile",65); // ftok function is used to generate unique key
   int shmid = shmget(my_key,1024,0666|IPC_CREAT); // shmget returns an ide in shmid
   char *str = (char*) shmat(shmid,(void*)0,0); // shmat to join to shared memory
   cout<<"Write Data : ";
   fgets(str, 50, stdin);
   printf("Data written in memory: %s\n",str);
   //detach from shared memory
   shmdt(str);
}

サンプルコード

#include <iostream>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
using namespace std;
main() {
   key_t my_key = ftok("shmfile",65); // ftok function is used to generate unique key
   int shmid = shmget(my_key,1024,0666|IPC_CREAT); // shmget returns an ide in shmid
   char *str = (char*) shmat(shmid,(void*)0,0); // shmat to join to shared memory
   printf("Data read from memory: %s\n",str);
   shmdt(str);
   shmctl(shmid,IPC_RMID,NULL); // destroy the shared memory
}

出力

共有メモリを介したIPC


  1. Google Chrome のメモリ使用量/メモリ リークの問題?

    私はインターネットの閲覧に Google Chrome を使用するのが大好きです。その主な理由の 1 つは、常に超高速であることです。すべてのアドオンで Firefox が肥大化するのは好きではありませんでしたし、Internet Explorer は単純に遅いだけです。 Microsoft Edge は IE よりもかなり高速ですが、他の Google サービスを非常に多く使用しているため、Chrome に引き離され続けています。 Firefox の新しい Quantum ブラウザは Chrome よりもさらに高速で、切り替えを真剣に考えていました。 初めて Chrome を使い始めたと

  2. IRQL_NOT_LESS_OR_EQUAL エラーを修正

    値が 0x0000000A のバグ チェックで上記のエラー コードに直面した場合、これは、カーネル モード ドライバーが、割り込み要求レベル (IRQL) が上がっているときに、無効なアドレスでページ メモリにアクセスしたことを示しています。つまり、ドライバーは、必要なアクセス許可を持っていないメモリ アドレスにアクセスしようとしました。 これがユーザー アプリケーションで発生すると、アクセス違反のエラー メッセージが生成されます。これがカーネル モードで発生すると、STOP エラー コード 0x0000000A が生成されます。新しいバージョンの Windows へのアップグレード