2012-03-14 21 views
15

का उपयोग करने के लिए मैं विभिन्न आईपीसी तंत्र के बारे में पढ़ रहा हूं। मैं परिदृश्यों को समझने की कोशिश कर रहा हूं, जहां हम साझा मेमोरी का उपयोग करते हैं और जहां हम नामित पाइप्स (फीफो) का उपयोग करते हैं।साझा मेमोरी का उपयोग कब करें जब साझा मेमोरी

पाइप्स: एकाधिक प्रक्रिया लिख ​​सकती है, हालांकि केवल एक प्रक्रिया पढ़ सकती है। लिखें ऑपरेशन परमाणु है।

साझा मेमोरी: एकाधिक प्रक्रिया पढ़ और लिख सकती है। और उपयोगकर्ता को पढ़ने के लिए पारस्परिक बहिष्करण प्रदान करने की आवश्यकता है & लिखें।

क्या यह साझा स्मृति और पाइप के अनुप्रयोग का एकमात्र अंतर है?

+1

ध्यान दें कि लिखने पर केवल परमाणु होते हैं यदि आकार में PIPE_BUF से अधिक नहीं है। –

उत्तर

35

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

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

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

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

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

+1

कुछ मामूली सुधार। पाइप्स को 'पाइप' सिस्कल के माध्यम से गुमनाम रूप से बनाया जा सकता है। फ़ाइल द्वारा निजी रूप से 'nmap'ing' द्वारा साझा की गई मेमोरी भी फाइल सिस्टम में रह सकती है। – johannes

+1

एफआईएफओ भी कई से एक संचार का समर्थन करता है ("सारांश" केवल एक-से-एक का तात्पर्य है)। –

+0

@MarkRajcok संभव है, अभ्यास में पाइप के साथ कई लेखकों को बहुत उपयोगी नहीं है क्योंकि संदेश स्तर पर सिंक्रनाइज़ेशन का प्रबंधन करने के लिए कोई अंतर्निहित तंत्र नहीं है - जो कुछ भी लेखक भेजते हैं, वे अप्रत्याशित तरीके से हस्तक्षेप किए जाएंगे। यहां तक ​​कि यदि बाहरी सिंक्रनाइज़ेशन लागू किया गया है, तो सबसे अच्छा व्यक्ति प्रत्येक संदेश भेजे जाने पर लेखकों के बीच विशेष लॉकिंग होगा, जो प्रभावी नहीं है क्योंकि केवल एक ही समय में ही लिख सकता है। –

संबंधित मुद्दे