जब हमारे पास पहले से ही साझा मेमोरी है तो हमें संदेश कतारों की आवश्यकता क्यों है? यह कई कारणों से होगा, आइए हम इसे सरलीकरण के लिए कई बिंदुओं में विभाजित करने का प्रयास करें -
-
जैसा कि समझा जाता है, एक बार एक प्रक्रिया द्वारा संदेश प्राप्त हो जाने के बाद यह किसी अन्य प्रक्रिया के लिए उपलब्ध नहीं होगा। जबकि साझा स्मृति में, डेटा कई प्रक्रियाओं तक पहुंचने के लिए उपलब्ध है।
-
अगर हम छोटे संदेश प्रारूपों के साथ संवाद करना चाहते हैं।
-
जब एक ही समय में कई प्रक्रियाएं संचार करती हैं, तो साझा स्मृति डेटा को सिंक्रनाइज़ेशन के साथ संरक्षित करने की आवश्यकता होती है।
-
साझा मेमोरी का उपयोग करके लिखने और पढ़ने की आवृत्ति अधिक है, तो कार्यक्षमता को लागू करना बहुत जटिल होगा। इस तरह के मामलों में उपयोग के लायक नहीं है।
-
क्या होगा यदि सभी प्रक्रियाओं को साझा स्मृति तक पहुंचने की आवश्यकता नहीं है लेकिन बहुत कम प्रक्रियाओं को केवल इसकी आवश्यकता है, संदेश कतारों के साथ कार्यान्वित करना बेहतर होगा।
-
अगर हम अलग-अलग डेटा पैकेट के साथ संवाद करना चाहते हैं, तो कहें कि प्रक्रिया ए, बी को संसाधित करने के लिए संदेश प्रकार 1 भेज रहा है, संदेश प्रकार 10 को संसाधित करने के लिए संदेश प्रकार 20 भेज रहा है, और इस मामले में, संदेश कतारों के साथ कार्यान्वित करना आसान है। दिए गए संदेश प्रकार को 1, 10, 20 के रूप में सरल बनाने के लिए, यह या तो 0 या +ve या -ve हो सकता है जैसा कि नीचे चर्चा की गई है।
-
बेशक, संदेश कतार का क्रम फीफो (फर्स्ट इन फर्स्ट आउट) है। कतार में डाला गया पहला संदेश पुनर्प्राप्त किया जाने वाला पहला संदेश है।
साझा स्मृति या संदेश कतारों का उपयोग करना इस बात पर निर्भर करता है कि आवेदन की आवश्यकता क्या है और इसका कितना प्रभावी ढंग से उपयोग किया जा सकता है।
संदेश कतारों का उपयोग करके संचार निम्नलिखित तरीकों से हो सकता है -
-
एक प्रक्रिया द्वारा साझा स्मृति में लिखना और दूसरी प्रक्रिया द्वारा साझा स्मृति से पढ़ना। जैसा कि हम जानते हैं, पठन कई प्रक्रियाओं के साथ भी किया जा सकता है।
अलग-अलग डेटा पैकेट के साथ एक प्रक्रिया द्वारा साझा मेमोरी में लिखना और इसे कई प्रक्रियाओं द्वारा पढ़ना, यानी संदेश प्रकार के अनुसार।
संदेश कतारों पर कुछ जानकारी देखने के बाद, अब सिस्टम कॉल (सिस्टम 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; }
आउटपुट