ทำไมเราต้องมีคิวข้อความเมื่อเรามีหน่วยความจำที่ใช้ร่วมกันอยู่แล้ว? อาจมีสาเหตุหลายประการ ให้เราลองแยกสิ่งนี้ออกเป็นหลายจุดเพื่อให้เข้าใจง่าย -
-
ตามที่เข้าใจแล้ว เมื่อกระบวนการได้รับข้อความแล้ว จะไม่มีให้สำหรับกระบวนการอื่นอีกต่อไป ในขณะที่ในหน่วยความจำที่ใช้ร่วมกัน ข้อมูลจะพร้อมใช้งานสำหรับหลายกระบวนการในการเข้าถึง
-
หากเราต้องการสื่อสารกับรูปแบบข้อความขนาดเล็ก
-
ข้อมูลหน่วยความจำที่ใช้ร่วมกันจำเป็นต้องได้รับการปกป้องด้วยการซิงโครไนซ์เมื่อมีการสื่อสารหลายกระบวนการพร้อมกัน
-
ความถี่ในการเขียนและอ่านโดยใช้หน่วยความจำที่ใช้ร่วมกันนั้นสูง การใช้งานฟังก์ชันต่างๆ จะซับซ้อนมาก ไม่คุ้มกับการใช้ประโยชน์ในกรณีแบบนี้
-
จะเกิดอะไรขึ้นหากกระบวนการทั้งหมดไม่จำเป็นต้องเข้าถึงหน่วยความจำที่ใช้ร่วมกัน แต่มีเพียงไม่กี่กระบวนการที่ต้องการมันเท่านั้น จะเป็นการดีกว่าถ้านำไปใช้กับคิวข้อความ
-
หากเราต้องการสื่อสารกับแพ็กเก็ตข้อมูลที่แตกต่างกัน เช่น กระบวนการ A กำลังส่งข้อความประเภท 1 เพื่อประมวลผล B ข้อความประเภท 10 เพื่อประมวลผล C และข้อความประเภท 20 เพื่อประมวลผล D ในกรณีนี้ การดำเนินการกับคิวข้อความจะง่ายกว่า เพื่อลดความซับซ้อนของประเภทข้อความที่กำหนดเป็น 1, 10, 20 อาจเป็น 0 หรือ +ve หรือ –ve ตามที่กล่าวไว้ด้านล่าง
-
แน่นอน ลำดับของคิวข้อความคือ FIFO (เข้าก่อนออกก่อน) ข้อความแรกที่แทรกในคิวคือข้อความแรกที่จะดึงข้อมูล
การใช้หน่วยความจำที่ใช้ร่วมกันหรือคิวข้อความขึ้นอยู่กับความต้องการของแอปพลิเคชันและความสามารถในการใช้งาน
การสื่อสารโดยใช้คิวข้อความสามารถเกิดขึ้นได้ด้วยวิธีต่อไปนี้ -
-
การเขียนลงในหน่วยความจำที่ใช้ร่วมกันโดยกระบวนการหนึ่งและการอ่านจากหน่วยความจำที่ใช้ร่วมกันโดยกระบวนการอื่น ตามที่เราทราบ การอ่านสามารถทำได้หลายขั้นตอนเช่นกัน
การเขียนลงในหน่วยความจำที่ใช้ร่วมกันโดยกระบวนการเดียวด้วยแพ็กเก็ตข้อมูลที่แตกต่างกัน และการอ่านจากหน่วยความจำดังกล่าวโดยหลายกระบวนการ เช่น ตามประเภทข้อความ
เมื่อเห็นข้อมูลบางอย่างเกี่ยวกับคิวข้อความแล้ว ก็ถึงเวลาตรวจสอบการเรียกของระบบ (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; }
ผลลัพธ์