หน่วยความจำที่แบ่งใช้คือหน่วยความจำที่แบ่งใช้ระหว่างสองกระบวนการขึ้นไป แต่ทำไมเราต้องแบ่งปันความทรงจำหรือวิธีการสื่อสารอื่น ๆ ?
ย้ำอีกครั้งว่าแต่ละกระบวนการมีพื้นที่ที่อยู่ของตัวเอง หากกระบวนการใดต้องการสื่อสารกับข้อมูลบางอย่างจากพื้นที่ที่อยู่ของตนเองไปยังกระบวนการอื่น ก็สามารถทำได้ด้วยเทคนิค IPC (การสื่อสารระหว่างกระบวนการ) เท่านั้น ตามที่เราทราบแล้ว การสื่อสารอาจอยู่ระหว่างกระบวนการที่เกี่ยวข้องหรือไม่เกี่ยวข้อง
โดยปกติ การสื่อสารกระบวนการที่เกี่ยวข้องกันจะดำเนินการโดยใช้ไปป์หรือเนมไปป์ กระบวนการที่ไม่เกี่ยวข้องกัน (เช่น กระบวนการที่ทำงานอยู่ในเทอร์มินัลหนึ่งและอีกกระบวนการหนึ่งในเทอร์มินัลอื่น) สามารถทำได้โดยใช้ Named Pipes หรือผ่านเทคนิค IPC ยอดนิยมของ Shared Memory and Message Queues
เราได้เห็นเทคนิค 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 }
ผลลัพธ์