2010-02-18 3 views
9

मैंने संदेश कतार और साझा स्मृति के बीच अंतर के बारे में बहुत से लेख पढ़े। लेकिन अभी भी स्पष्ट नहीं है कि अच्छा प्रदर्शन प्राप्त करने के लिए कौन सा अच्छा है।अंतर?

साझा स्मृति की तरह कतारों पर अच्छा होने का अनुमान है, लेकिन इसमें सिंक्रनाइज़ करने के मामले में प्रदर्शन समस्या भी है।

+0

डुप्लिकेट http://stackoverflow.com/questions/2275909/whats-the-advantage-of-queues-over-pipes-when-communicating-between-processes/2276157#2276157 – t0mm13b

+0

डुप्ली नहीं। एक पाइप के बारे में है, एक शर्म के बारे में है। – kennytm

उत्तर

1

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

29

दोनों साझा स्मृति और संदेश कतारों का उपयोग प्रक्रियाओं के बीच जानकारी का आदान-प्रदान करने के लिए किया जा सकता है। अंतर में का उपयोग किया जाता है।

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

एक संदेश कतार में वन-वे पाइप है: एक प्रक्रिया कतार में लिखते हैं, और एक अन्य आदेश तक एक अंत के डेटा स्थिति उत्पन्न होती है यह लिखा गया था में डेटा पढ़ता है। जब कतार बनाई जाती है, संदेश का आकार (प्रति संदेश बाइट, आमतौर पर काफी छोटा) और कतार लंबाई (लंबित संदेशों की अधिकतम संख्या) सेट की जाती हैं। एक्सेस साझा स्मृति से धीमी है क्योंकि प्रत्येक पढ़ने/लिखने का ऑपरेशन आमतौर पर एक संदेश होता है। लेकिन कतार गारंटी देता है कि प्रत्येक ऑपरेशन या तो पूरे संदेश को सफलतापूर्वक या कतार को बदलने के बिना विफल हो जाएगा। तो लेखक केवल आंशिक संदेश लिखने के बाद कभी असफल नहीं हो सकता है, और पाठक या तो एक पूर्ण संदेश या कुछ भी नहीं प्राप्त करेगा।

+0

हां, अच्छा बिंदु। धन्यवाद। मेरे लिए – khushi

+0

+1। मैंने यह पाठ बहुत उपयोगी पाया। – gotqn

2

संभावित रेस-स्थितियों के लिए साझा स्मृति के साथ साझा स्मृति का उपयोग करते समय, जहां एक प्रक्रिया इसे लिखती है और दूसरा इससे पढ़ता है, कुछ ध्यान में रखना है। पूर्व का उपयोग करने का एक संबद्ध जोखिम है, मान लीजिए कि दो प्रक्रियाएं इसका उपयोग कर रही हैं, इसे लिखने के लिए, दूसरा इसे पढ़ने के लिए, जो लिख रहा है वह असामान्य स्थिति के कारण मर जाता है, इसे पढ़ने की प्रक्रिया लटका या क्रैश हो सकती है।

साझा स्मृति को तेज़ (कम ओवरहेड, डेटा गुजरने की उच्च मात्रा) के रूप में समझा जा सकता है तो कतार। लेकिन दूसरी ओर कतारों के लिए, डेटा की कम मात्रा के साथ उच्च ओवरहेड (एक कतार बनाने के लिए स्थापित आदि की आवश्यकता होती है) की आवश्यकता होती है।

साझा स्मृति के साथ ऑनस यह है कि आपको थ्रेड सुरक्षित होने के लिए सिंक्रनाइज़ेशन लागू करना होगा। आईपीसी पर Beej द्वारा उत्कृष्ट लेख पर एक नज़र डालें।

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

यह दोनों के बीच का अंतर है।

उम्मीद है कि यह मदद करता है, सर्वश्रेष्ठ संबंध, टॉम।

+0

उस (beej) आलेख के लिए धन्यवाद। वास्तव में एक गड़बड़ाना। – khushi

0

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