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

IPC โดยใช้คิวข้อความ


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

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

  • หากเราต้องการสื่อสารกับรูปแบบข้อความขนาดเล็ก

  • ข้อมูลหน่วยความจำที่ใช้ร่วมกันจำเป็นต้องได้รับการปกป้องด้วยการซิงโครไนซ์เมื่อมีการสื่อสารหลายกระบวนการพร้อมกัน

  • ความถี่ในการเขียนและอ่านโดยใช้หน่วยความจำที่ใช้ร่วมกันนั้นสูง การใช้งานฟังก์ชันต่างๆ จะซับซ้อนมาก ไม่คุ้มกับการใช้ประโยชน์ในกรณีแบบนี้

  • จะเกิดอะไรขึ้นหากกระบวนการทั้งหมดไม่จำเป็นต้องเข้าถึงหน่วยความจำที่ใช้ร่วมกัน แต่มีเพียงไม่กี่กระบวนการที่ต้องการมันเท่านั้น จะเป็นการดีกว่าถ้านำไปใช้กับคิวข้อความ

  • หากเราต้องการสื่อสารกับแพ็กเก็ตข้อมูลที่แตกต่างกัน เช่น กระบวนการ A กำลังส่งข้อความประเภท 1 เพื่อประมวลผล B ข้อความประเภท 10 เพื่อประมวลผล C และข้อความประเภท 20 เพื่อประมวลผล D ในกรณีนี้ การดำเนินการกับคิวข้อความจะง่ายกว่า เพื่อลดความซับซ้อนของประเภทข้อความที่กำหนดเป็น 1, 10, 20 อาจเป็น 0 หรือ +ve หรือ –ve ตามที่กล่าวไว้ด้านล่าง

  • แน่นอน ลำดับของคิวข้อความคือ FIFO (เข้าก่อนออกก่อน) ข้อความแรกที่แทรกในคิวคือข้อความแรกที่จะดึงข้อมูล

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

การสื่อสารโดยใช้คิวข้อความสามารถเกิดขึ้นได้ด้วยวิธีต่อไปนี้ -

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

การเขียนลงในหน่วยความจำที่ใช้ร่วมกันโดยกระบวนการเดียวด้วยแพ็กเก็ตข้อมูลที่แตกต่างกัน และการอ่านจากหน่วยความจำดังกล่าวโดยหลายกระบวนการ เช่น ตามประเภทข้อความ

IPC โดยใช้คิวข้อความ

เมื่อเห็นข้อมูลบางอย่างเกี่ยวกับคิวข้อความแล้ว ก็ถึงเวลาตรวจสอบการเรียกของระบบ (System V) ที่รองรับคิวข้อความ

ในการสื่อสารโดยใช้คิวข้อความ มีขั้นตอนดังต่อไปนี้ -

ขั้นตอนที่ 1 − สร้างคิวข้อความหรือเชื่อมต่อกับคิวข้อความที่มีอยู่แล้ว (msgget())

ขั้นตอนที่ 2 − เขียนลงในคิวข้อความ (msgsnd())

ขั้นตอนที่ 3 − อ่านจากคิวข้อความ (msgrcv())

ขั้นตอนที่ 4 - ดำเนินการควบคุมคิวข้อความ (msgctl())

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

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

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

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

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

ผลลัพธ์

IPC โดยใช้คิวข้อความ