Tại sao chúng ta cần hàng đợi tin nhắn khi chúng ta đã có bộ nhớ dùng chung? Sẽ có nhiều lý do, chúng ta hãy cố gắng chia vấn đề này thành nhiều điểm để đơn giản hóa -
-
Như đã hiểu, một khi thông báo được một quy trình nhận được thì nó sẽ không còn khả dụng cho bất kỳ quy trình nào khác. Trong khi trong bộ nhớ dùng chung, dữ liệu có sẵn cho nhiều quá trình truy cập.
-
Nếu chúng ta muốn giao tiếp bằng các định dạng tin nhắn nhỏ.
-
Dữ liệu bộ nhớ dùng chung cần được bảo vệ bằng đồng bộ hóa khi nhiều quá trình giao tiếp cùng lúc.
-
Tần suất ghi và đọc bằng bộ nhớ dùng chung cao, khi đó sẽ rất phức tạp để triển khai chức năng. Không đáng để sử dụng trong những trường hợp này.
-
Điều gì sẽ xảy ra nếu tất cả các quy trình không cần truy cập vào bộ nhớ dùng chung nhưng rất ít quy trình chỉ cần nó, sẽ tốt hơn nếu triển khai với các hàng đợi tin nhắn.
-
Nếu chúng ta muốn giao tiếp với các gói dữ liệu khác nhau, giả sử quy trình A đang gửi thông báo loại 1 đến quy trình B, thông báo loại 10 để xử lý C và thông báo loại 20 để xử lý D. Trong trường hợp này, việc triển khai với hàng đợi thông báo sẽ đơn giản hơn. Để đơn giản hóa loại thông báo đã cho là 1, 10, 20, nó có thể là 0 hoặc + ve hoặc –ve như được thảo luận bên dưới.
-
Tất nhiên, thứ tự của hàng đợi tin nhắn là FIFO (First In First Out). Thư đầu tiên được chèn trong hàng đợi là thư đầu tiên được truy xuất.
Việc sử dụng Bộ nhớ dùng chung hoặc Hàng đợi tin nhắn tùy thuộc vào nhu cầu của ứng dụng và cách sử dụng nó hiệu quả.
Giao tiếp bằng cách sử dụng hàng đợi tin nhắn có thể xảy ra theo những cách sau -
-
Ghi vào bộ nhớ dùng chung bởi một quá trình và đọc từ bộ nhớ dùng chung bởi một quá trình khác. Như chúng ta đã biết, việc đọc cũng có thể được thực hiện với nhiều quá trình.
Ghi vào bộ nhớ dùng chung bằng một quá trình với các gói dữ liệu khác nhau và đọc từ đó bằng nhiều quá trình, tức là theo loại thông báo.
Đã thấy thông tin nhất định về hàng đợi tin nhắn, bây giờ là lúc kiểm tra lệnh gọi hệ thống (Hệ thống V) hỗ trợ hàng đợi tin nhắn.
Để thực hiện liên lạc bằng cách sử dụng hàng đợi tin nhắn, hãy làm theo các bước sau -
Bước 1 - Tạo hàng đợi tin nhắn hoặc kết nối với hàng đợi tin nhắn đã tồn tại (msgget ())
Bước 2 - Viết vào hàng đợi tin nhắn (msgsnd ())
Bước 3 - Đọc từ hàng đợi tin nhắn (msgrcv ())
Bước 4 - Thực hiện các thao tác điều khiển trên hàng đợi tin nhắn (msgctl ())
Ở đây chúng tôi sẽ tạo 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 <stdio.h> #include <sys/ipc.h> #include <sys/msg.h> // structure for message queue struct msg_buffer { long msg_type; char msg[100]; } message; main() { key_t my_key; int msg_id; my_key = ftok("progfile", 65); //create unique key msg_id = msgget(my_key, 0666 | IPC_CREAT); //create message queue and return id message.msg_type = 1; printf("Write Message : "); fgets(message.msg, 100, stdin); msgsnd(msg_id, &message, sizeof(message), 0); //send message printf("Sent message is : %s \n", message.msg); }
Mã mẫu
#include <stdio.h> #include <sys/ipc.h> #include <sys/msg.h> // Define message queue structure struct msg_buffer { long msg_type; char msg[100]; } message; main() { key_t my_key; int msg_id; my_key = ftok("progfile", 65); //create unique key msg_id = msgget(my_key, 0666 | IPC_CREAT); //create message queue and return id msgrcv(msg_id, &message, sizeof(message), 1, 0); //used to receive message // display the message printf("Received Message is : %s \n", message.msg); msgctl(msg_id, IPC_RMID, NULL); //destroy the message queue return 0; }
Đầu ra