Computer >> Máy Tính >  >> Lập trình >> C ++

IPC thông qua bộ nhớ chia sẻ

Bộ nhớ dùng chung là bộ nhớ được chia sẻ giữa hai hoặc nhiều tiến trình. Tuy nhiên, tại sao chúng ta cần chia sẻ bộ nhớ hoặc một số phương tiện giao tiếp khác?

Nhắc lại, mỗi tiến trình có không gian địa chỉ riêng, nếu tiến trình nào muốn giao tiếp một số thông tin từ không gian địa chỉ của chính nó với các tiến trình khác thì chỉ có thể thực hiện được với kỹ thuật IPC (inter process Communication). Như chúng ta đã biết, giao tiếp có thể giữa các quá trình có liên quan hoặc không liên quan.

Thông thường, giao tiếp giữa các quá trình liên quan được thực hiện bằng cách sử dụng Đường ống hoặc Đường ống được đặt tên. Các quy trình không liên quan (giả sử một quy trình đang chạy trong một thiết bị đầu cuối và một quy trình khác trong một thiết bị đầu cuối khác) giao tiếp có thể được thực hiện bằng cách sử dụng Ống có tên hoặc thông qua các kỹ thuật IPC phổ biến của Bộ nhớ dùng chung và Hàng đợi tin nhắn.

Chúng tôi đã xem các kỹ thuật IPC của Đường ống và Đường ống được đặt tên và bây giờ đã đến lúc biết các kỹ thuật IPC còn lại viz., Bộ nhớ dùng chung, Hàng đợi tin nhắn, Semaphores, Tín hiệu và Ánh xạ bộ nhớ.

IPC thông qua bộ nhớ chia sẻ

Chúng tôi biết rằng để giao tiếp giữa hai hoặc nhiều quy trình, chúng tôi sử dụng bộ nhớ dùng chung nhưng trước khi sử dụng bộ nhớ dùng chung, những gì cần phải thực hiện với các lệnh gọi hệ thống, chúng ta hãy xem điều này -

  • Tạo phân đoạn bộ nhớ dùng chung hoặc sử dụng phân đoạn bộ nhớ dùng chung đã được tạo (shmget ())

  • Đính kèm quy trình vào phân đoạn bộ nhớ dùng chung đã được tạo (shmat ())

  • Tách tiến trình khỏi phân đoạn bộ nhớ dùng chung đã được đính kèm (shmdt ())

  • Kiểm soát các hoạt động trên phân đoạn bộ nhớ dùng chung (shmctl ())

Ở đây chúng tôi sẽ tạo ra hai quy trình. Một người có thể viết và người khác có thể đọc. Hãy để chúng tôi xem quy trình trình đọc và ghi đang hoạt động như thế nào khi sử dụng bộ nhớ dùng chung.

Mã mẫu

#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);
}

Mã mẫu

#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
}

Đầu ra

IPC thông qua bộ nhớ chia sẻ