Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> C++

साझा स्मृति के माध्यम से आईपीसी

साझा स्मृति दो या दो से अधिक प्रक्रियाओं के बीच साझा की गई स्मृति है। हालाँकि, हमें स्मृति या संचार के किसी अन्य माध्यम को साझा करने की आवश्यकता क्यों है?

दोहराने के लिए, प्रत्येक प्रक्रिया का अपना पता स्थान होता है, यदि कोई प्रक्रिया कुछ सूचनाओं के साथ अपने स्वयं के पता स्थान से अन्य प्रक्रियाओं तक संचार करना चाहती है, तो यह केवल आईपीसी (इंटर प्रोसेस संचार) तकनीकों के साथ संभव है। जैसा कि हम पहले से ही जानते हैं, संचार संबंधित या असंबंधित प्रक्रियाओं के बीच हो सकता है।

आमतौर पर, अंतर-संबंधित प्रक्रिया संचार पाइप्स या नामांकित पाइप्स का उपयोग करके किया जाता है। असंबंधित प्रक्रियाएं (जैसे कि एक प्रक्रिया एक टर्मिनल में चल रही है और दूसरी प्रक्रिया दूसरे टर्मिनल में चल रही है) संचार नामांकित पाइप्स का उपयोग करके या साझा मेमोरी और संदेश कतारों की लोकप्रिय आईपीसी तकनीकों के माध्यम से किया जा सकता है।

हमने पाइप्स और नामांकित पाइपों की आईपीसी तकनीकों को देखा है और अब शेष आईपीसी तकनीकों को जानने का समय आ गया है, जैसे कि साझा मेमोरी, संदेश कतार, सेमाफोर, सिग्नल और मेमोरी मैपिंग।

साझा स्मृति के माध्यम से आईपीसी

हम जानते हैं कि दो या दो से अधिक प्रक्रियाओं के बीच संवाद करने के लिए, हम साझा स्मृति का उपयोग करते हैं लेकिन साझा स्मृति का उपयोग करने से पहले सिस्टम कॉल के साथ क्या करने की आवश्यकता है, आइए इसे देखें -

  • साझा मेमोरी सेगमेंट बनाएं या पहले से बनाए गए साझा मेमोरी सेगमेंट का उपयोग करें (shmget ())

  • प्रक्रिया को पहले से बनाए गए साझा मेमोरी सेगमेंट (shmat ()) में संलग्न करें

  • पहले से संलग्न साझा स्मृति खंड (shmdt ()) से प्रक्रिया को अलग करें

  • साझा स्मृति खंड (shmctl ()) पर नियंत्रण संचालन

यहां हम दो प्रोसेस बनाएंगे। एक लिख सकता है और दूसरा पढ़ सकता है। आइए देखें कि साझा स्मृति का उपयोग करके पाठक और लेखक की प्रक्रियाएं कैसे काम कर रही हैं।

उदाहरण कोड

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

उदाहरण कोड

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

आउटपुट

साझा स्मृति के माध्यम से आईपीसी


  1. वितरित साझा मेमोरी को लागू करने के लिए एल्गोरिदम

    साझा स्मृति मेमोरी ब्लॉक है जिसे एक से अधिक प्रोग्राम द्वारा एक्सेस किया जा सकता है। एक साझा स्मृति अवधारणा का उपयोग संचार का एक तरीका प्रदान करने और कम अनावश्यक स्मृति प्रबंधन प्रदान करने के लिए किया जाता है। वितरित साझा मेमोरी DSM . के रूप में संक्षिप्त वितरित प्रणालियों में साझा स्मृति अवधारणा क

  1. Google Chrome मेमोरी उपयोग/मेमोरी लीक समस्याएं?

    मुझे इंटरनेट ब्राउज़ करने के लिए Google Chrome का उपयोग करना पसंद है और इसका एक मुख्य कारण हमेशा से रहा है क्योंकि यह बहुत तेज़ है! मुझे सभी ऐड-ऑन के साथ फ़ायरफ़ॉक्स का ब्लोट कभी पसंद नहीं आया और इंटरनेट एक्सप्लोरर बिल्कुल धीमा है। माइक्रोसॉफ्ट एज आईई की तुलना में काफी तेज है, लेकिन मैं इतनी सारी अ

  1. IRQL_NOT_LESS_OR_EQUAL त्रुटि ठीक करें

    यदि आप 0x0000000A के मान के साथ बग चेक के साथ उपरोक्त त्रुटि कोड का सामना करते हैं, तो यह इंगित करता है कि कर्नेल-मोड ड्राइवर ने पेजेड मेमोरी को एक अमान्य पते पर एक्सेस किया है, जबकि एक उठाए गए इंटरप्ट अनुरोध स्तर (आईआरक्यूएल) पर। संक्षेप में, ड्राइवर ने उस मेमोरी एड्रेस को एक्सेस करने का प्रयास किय