Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

IPC ผ่านหน่วยความจำที่ใช้ร่วมกัน


หน่วยความจำที่แบ่งใช้คือหน่วยความจำที่แบ่งใช้ระหว่างสองกระบวนการขึ้นไป แต่ทำไมเราต้องแบ่งปันความทรงจำหรือวิธีการสื่อสารอื่น ๆ ?

ย้ำอีกครั้งว่าแต่ละกระบวนการมีพื้นที่ที่อยู่ของตัวเอง หากกระบวนการใดต้องการสื่อสารกับข้อมูลบางอย่างจากพื้นที่ที่อยู่ของตนเองไปยังกระบวนการอื่น ก็สามารถทำได้ด้วยเทคนิค IPC (การสื่อสารระหว่างกระบวนการ) เท่านั้น ตามที่เราทราบแล้ว การสื่อสารอาจอยู่ระหว่างกระบวนการที่เกี่ยวข้องหรือไม่เกี่ยวข้อง

โดยปกติ การสื่อสารกระบวนการที่เกี่ยวข้องกันจะดำเนินการโดยใช้ไปป์หรือเนมไปป์ กระบวนการที่ไม่เกี่ยวข้องกัน (เช่น กระบวนการที่ทำงานอยู่ในเทอร์มินัลหนึ่งและอีกกระบวนการหนึ่งในเทอร์มินัลอื่น) สามารถทำได้โดยใช้ Named Pipes หรือผ่านเทคนิค IPC ยอดนิยมของ Shared Memory and Message Queues

เราได้เห็นเทคนิค IPC ของไปป์และไปป์ที่มีชื่อแล้ว และตอนนี้ก็ถึงเวลาที่จะรู้เทคนิค IPC ที่เหลือ ได้แก่ หน่วยความจำที่ใช้ร่วมกัน คิวข้อความ เซมาฟอร์ สัญญาณ และการจับคู่หน่วยความจำ

IPC ผ่านหน่วยความจำที่ใช้ร่วมกัน

เรารู้ว่าในการสื่อสารระหว่างสองกระบวนการขึ้นไป เราใช้หน่วยความจำที่ใช้ร่วมกัน แต่ก่อนที่จะใช้หน่วยความจำที่ใช้ร่วมกัน สิ่งที่ต้องทำกับการเรียกของระบบ ให้เราดูสิ่งนี้ -

  • สร้างเซ็กเมนต์หน่วยความจำที่ใช้ร่วมกันหรือใช้เซ็กเมนต์หน่วยความจำที่ใช้ร่วมกันที่สร้างไว้แล้ว (shmget())

  • แนบกระบวนการกับเซ็กเมนต์หน่วยความจำที่แชร์ที่สร้างไว้แล้ว (shmat())

  • แยกกระบวนการออกจากเซ็กเมนต์หน่วยความจำที่ใช้ร่วมกันที่แนบมาแล้ว (shmdt())

  • ควบคุมการดำเนินการบนเซ็กเมนต์หน่วยความจำที่ใช้ร่วมกัน (shmctl())

ที่นี่เราจะสร้างสองกระบวนการ คนหนึ่งเขียนได้ อีกคนอ่านได้ ให้เราดูว่ากระบวนการอ่านและเขียนทำงานอย่างไรโดยใช้หน่วยความจำที่ใช้ร่วมกัน

โค้ดตัวอย่าง

#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 ผ่านหน่วยความจำที่ใช้ร่วมกัน