शेयर्ड मेमोरी

कंप्यूटर विज्ञान में, साझा मेमोरी रैंडम एक्सेस मेमोरी  है जिसे एक साथ कई प्रोग्रामों द्वारा उनके बीच संचार प्रदान करने या अनावश्यक प्रतियों से बचने के इरादे से एक्सेस किया जा सकता है। साझा मेमोरी प्रोग्राम के बीच डेटा पास करने का एक कुशल साधन है। संदर्भ के आधार पर, प्रोग्राम एक प्रोसेसर या कई अलग-अलग प्रोसेसर पर चल सकते हैं।

एक प्रोग्राम के अंदर संचार के लिए मेमोरी का उपयोग करना, उदा। इसके कई थ्रेड्स (कंप्यूटर साइंस) के बीच, इसे साझा मेमोरी भी कहा जाता है।

हार्डवेयर में
कंप्यूटर हार्डवेयर में, साझा मेमोरी रैंडम एक्सेस मेमोरी (रैम) के एक (आमतौर पर बड़े) ब्लॉक को संदर्भित करती है जिसे बहु  में कई अलग-अलग केंद्रीय प्रसंस्करण इकाइयों (सीपीयू) द्वारा एक्सेस किया जा सकता है।

साझा मेमोरी सिस्टम उपयोग कर सकते हैं:
 * गैर-समान मेमोरी एक्सेस (यूएमए): सभी प्रोसेसर भौतिक मेमोरी को समान रूप से साझा करते हैं;
 * गैर-समान मेमोरी एक्सेस (NUMA): मेमोरी एक्सेस का समय प्रोसेसर के सापेक्ष मेमोरी लोकेशन पर निर्भर करता है;
 * कैश-ओनली मेमोरी आर्किटेक्चर (COMA): प्रत्येक नोड पर प्रोसेसर के लिए स्थानीय मेमोरी का उपयोग वास्तविक मुख्य मेमोरी के बजाय कैश के रूप में किया जाता है।

एक साझा मेमोरी सिस्टम को प्रोग्राम करना अपेक्षाकृत आसान है क्योंकि सभी प्रोसेसर डेटा का एक ही दृश्य साझा करते हैं और प्रोसेसर के बीच संचार उतना ही तेज़ हो सकता है जितना कैश मैमोरी एक ही स्थान पर पहुँचती है। साझा मेमोरी सिस्टम के साथ समस्या यह है कि कई CPU  को मेमोरी तक तेजी से पहुंच की आवश्यकता होती है और कैश मेमोरी की संभावना होगी, जिसमें दो जटिलताएं हैं:
 * एक्सेस टाइम डिग्रेडेशन: जब कई प्रोसेसर एक ही मेमोरी लोकेशन को एक्सेस करने की कोशिश करते हैं तो यह विवाद का कारण बनता है। आस-पास के स्मृति स्थानों तक पहुँचने का प्रयास करने से गलत साझाकरण हो सकता है। साझा मेमोरी कंप्यूटर बहुत अच्छी तरह से स्केल नहीं कर सकते। उनमें से अधिकांश में दस या उससे कम प्रोसेसर होते हैं;
 * डेटा सुसंगतता की कमी: जब भी एक कैश को ऐसी जानकारी के साथ अपडेट किया जाता है जो अन्य प्रोसेसरों द्वारा उपयोग की जा सकती है, तो परिवर्तन को अन्य प्रोसेसरों में प्रतिबिंबित करने की आवश्यकता होती है, अन्यथा विभिन्न प्रोसेसर असंगत डेटा के साथ काम करेंगे। इस तरह के कैश सुसंगतता प्रोटोकॉल, जब वे अच्छी तरह से काम करते हैं, तो कई प्रोसेसरों के बीच साझा जानकारी तक अत्यधिक उच्च-प्रदर्शन पहुंच प्रदान कर सकते हैं। दूसरी ओर, वे कभी-कभी अतिभारित हो सकते हैं और प्रदर्शन में बाधा बन सकते हैं।

अड़चन-प्रभाव को कम करने के लिए क्रॉसबार स्विच, ओमेगा नेटवर्क, हाइपरट्रांसपोर्ट या सामने की ओर बस  जैसी तकनीकों का उपयोग किया जा सकता है।

एक विषम सिस्टम आर्किटेक्चर (प्रोसेसर आर्किटेक्चर जो साझा मेमोरी के साथ सीपीयू और जीपीयू जैसे विभिन्न प्रकार के प्रोसेसर को एकीकृत करता है) के मामले में, सीपीयू की मेमोरी मैनेजमेंट यूनिट (एमएमयू) और इनपुट-आउटपुट मेमोरी मैनेजमेंट यूनिट (आईओएमएमयू) जीपीयू को कुछ विशेषताओं को साझा करना पड़ता है, जैसे एक सामान्य पता स्थान।

साझा मेमोरी के विकल्प वितरित मेमोरी और वितरित साझा मेमोरी हैं, प्रत्येक में मुद्दों का एक समान सेट होता है।

सॉफ्टवेयर में
कंप्यूटर सॉफ्टवेयर में, साझा मेमोरी या तो होती है
 * अंतर-प्रक्रिया संचार (आईपीसी) की एक विधि, यानी एक ही समय में चल रहे कार्यक्रमों के बीच डेटा का आदान-प्रदान करने का एक तरीका। एक प्रक्रिया (कंप्यूटिंग) रैंडम-एक्सेस मेमोरी में एक क्षेत्र बनाएगी जिसे अन्य प्रक्रियाएं एक्सेस कर सकती हैं;
 * आभासी मेमोरी मैपिंग का उपयोग करके या प्रश्न में प्रोग्राम के स्पष्ट समर्थन के साथ, आमतौर पर डेटा के एक टुकड़े की प्रतियां एक उदाहरण के लिए पहुंच को निर्देशित करके मेमोरी स्पेस को संरक्षित करने की एक विधि। यह अक्सर साझा लाइब्रेरी के लिए और जगह में निष्पादन (एक्सआईपी) के लिए उपयोग किया जाता है।

चूंकि दोनों प्रक्रियाएं साझा मेमोरी क्षेत्र जैसे नियमित कामकाजी मेमोरी तक पहुंच सकती हैं, यह संचार का एक बहुत तेज़ तरीका है (आईपीसी के अन्य तंत्रों जैसे नामित पाइप, यूनिक्स डोमेन सॉकेट या कॉरबा के विपरीत)। दूसरी ओर, यह कम मापनीय है, उदाहरण के लिए संचार प्रक्रियाएं एक ही मशीन पर चल रही होनी चाहिए (अन्य आईपीसी विधियों में से, केवल इंटरनेट डोमेन सॉकेट-यूनिक्स डोमेन सॉकेट संगणक संजाल का उपयोग कर सकते हैं), और देखभाल होनी चाहिए यदि अलग-अलग सीपीयू पर मेमोरी साझा करने वाली प्रक्रियाएं चल रही हैं और अंतर्निहित आर्किटेक्चर कैश सुसंगतता नहीं है, तो समस्याओं से बचने के लिए लिया गया।

साझा मेमोरी द्वारा IPC का उपयोग उदाहरण के लिए यूनिक्स सिस्टम पर एप्लिकेशन और एक्स विंडो सिस्टम के बीच छवियों को स्थानांतरित करने के लिए किया जाता है, या Microsoft Windows के तहत COM लाइब्रेरी में CoMarshalInterThreadInterfaceInStream द्वारा लौटाए गए IStream ऑब्जेक्ट के अंदर।

लाइब्रेरी (कंप्यूटिंग) # डायनेमिक लिंकिंग को आमतौर पर एक बार मेमोरी में रखा जाता है और कई प्रक्रियाओं के लिए मैप किया जाता है, और केवल वे पृष्ठ जिन्हें व्यक्तिगत प्रक्रिया के लिए अनुकूलित किया जाना था (क्योंकि एक प्रतीक अलग तरीके से हल किया गया है) को डुप्लिकेट किया जाता है, आमतौर पर कॉपी के रूप में जाना जाता है। ऑन-राइट जो लिखने का प्रयास करने पर पृष्ठ को पारदर्शी रूप से कॉपी करता है, और फिर निजी प्रतिलिपि पर लेखन को सफल होने देता है।

मल्टीपल एड्रेस स्पेस ऑपरेटिंग सिस्टम की तुलना में, मेमोरी शेयरिंग -- विशेष रूप से साझा करने की प्रक्रिया या पॉइंटर-आधारित संरचना -- सिंगल एड्रेस स्पेस ऑपरेटिंग सिस्टम में सरल है।

यूनिक्स जैसी प्रणालियों पर समर्थन
POSIX साझा मेमोरी, POSIX साझा मेमोरी का उपयोग करने के लिए एक मानकीकृत एपीआई प्रदान करता है। यह फ़ंक्शन का उपयोग करता है  sys/mman.h से। POSIX इंटरप्रोसेस संचार (POSIX का हिस्सा: XSI एक्सटेंशन) में साझा-मेमोरी फ़ंक्शन शामिल हैं ,  ,   और. यूनिक्स सिस्टम वी साझा मेमोरी के लिए भी एक एपीआई प्रदान करता है। यह sys/shm.h से shmget का उपयोग करता है। बीएसडी सिस्टम अनाम मैप की गई मेमोरी प्रदान करते हैं जिसका उपयोग कई प्रक्रियाओं द्वारा किया जा सकता है।

द्वारा बनाई गई साझा स्मृति  लगातार है। यह एक प्रक्रिया द्वारा स्पष्ट रूप से हटाए जाने तक सिस्टम में रहता है। इसमें एक खामी है कि यदि प्रक्रिया दुर्घटनाग्रस्त हो जाती है और साझा मेमोरी को साफ करने में विफल रहती है तो यह सिस्टम शटडाउन तक बनी रहेगी; डब किए गए एंड्रॉइड-विशिष्ट कार्यान्वयन में यह सीमा मौजूद नहीं है. POSIX भी प्रदान करता है  स्मृति में फ़ाइलों की मैपिंग के लिए एपीआई; मैपिंग को साझा किया जा सकता है, जिससे फ़ाइल की सामग्री को साझा मेमोरी के रूप में उपयोग करने की अनुमति मिलती है।

2.6 कर्नेल पर आधारित लिनक्स वितरण और बाद में RAM डिस्क के रूप में साझा मेमोरी के रूप में /dev/shm प्रदान करता है, विशेष रूप से एक विश्व-लेखन योग्य निर्देशिका के रूप में (एक निर्देशिका जिसमें सिस्टम का प्रत्येक उपयोगकर्ता फ़ाइलें बना सकता है) जो संग्रहीत है याद में। रेड हैट लिनक्स और डेबियन आधारित वितरण दोनों में इसे डिफ़ॉल्ट रूप से शामिल किया गया है। इस प्रकार की रैम डिस्क के लिए समर्थन कर्नेल विन्यास फाइल के भीतर पूरी तरह से वैकल्पिक है।

विंडोज़ पर समर्थन
विंडोज़ पर, कोई भी उपयोग कर सकता है  और   एक फ़ाइल के एक क्षेत्र को कई प्रक्रियाओं में मेमोरी में मैप करने के लिए कार्य करता है।

क्रॉस-प्लेटफ़ॉर्म समर्थन
कुछ सी++ पुस्तकालय साझा स्मृति कार्यक्षमता के लिए एक पोर्टेबल और वस्तु-उन्मुख पहुंच प्रदान करते हैं। उदाहरण के लिए, Boost (C++ लाइब्रेरी) में Boost.Interprocess C++ लाइब्रेरी शामिल है और Qt (ढांचा) QSharedMemory वर्ग प्रदान करता है।

प्रोग्रामिंग भाषा समर्थन
POSIX बाइंडिंग (कहते हैं, C/C++) के साथ प्रोग्रामिंग भाषाओं के लिए, साझा मेमोरी क्षेत्रों को ऑपरेटिंग सिस्टम द्वारा प्रदान किए गए कार्यों को कॉल करके बनाया और एक्सेस किया जा सकता है। समान प्रभाव के लिए इन ऑपरेटिंग सुविधाओं का उपयोग करने के अन्य प्रोग्रामिंग भाषाओं के अपने तरीके हो सकते हैं। उदाहरण के लिए, POSIX फ़ंक्शंस के समान, PHP साझा मेमोरी बनाने के लिए एक API प्रदान करता है।

यह भी देखें

 * वितरित स्मृति
 * वितरित साझा स्मृति
 * साझा ग्राफिक्स मेमोरी
 * विषम प्रणाली वास्तुकला
 * वैश्विक चर
 * नैनो-धागे
 * जगह पर अमल करें
 * साझा रजिस्टर
 * साझा स्नैपशॉट ऑब्जेक्ट
 * वॉन न्यूमैन आर्किटेक्चर # वॉन न्यूमैन टोंटी

बाहरी संबंध

 * IPC:Shared Memory by Dave Marshall
 * Shared Memory Introduction, Ch. 12 from book by Richard Stevens "UNIX Network Programming, Volume 2, Second Edition: Interprocess Communications".
 * SharedHashFile, An open source, shared memory hash table.