2010-08-04 7 views
11

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

क्या शून्य-प्रतिलिपि संदेश-पासिंग त्रुटिपूर्ण है Erlang में? नोड्स के बीच यह स्पष्ट रूप से लागू नहीं किया जा सकता है, लेकिन एक ही नोड पर प्रक्रियाओं के बीच क्या है? This question संबंधित है।

उत्तर

7

AFAIK -shared या -brbrid modell का उपयोग करके एरलांग में शून्य-प्रतिलिपि संदेश-पासिंग के लिए प्रयोगात्मक समर्थन था/प्रयोगात्मक समर्थन था। मैं 2009 में एक ब्लॉग पोस्ट पढ़ें का दावा है कि यह SMP मशीनों पर टूट गया है, लेकिन मैं वर्तमान स्थिति के बारे में पता नहीं

21

मुझे नहीं लगता कि अपने दावे बिल्कुल सही है - अंतर-प्रक्रिया गए संदेशों के गहरे नकल नहीं है Erlang में एक बाधा, और डिफ़ॉल्ट वीएम बिल्ड/सेटिंग्स के साथ, यह ठीक है कि सभी Erlang सिस्टम क्या कर रहे हैं।

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

हालांकि कई साझा डेटास्ट्रक्चर हैं। बड़ी बाइनरी (> 64 बाइट लंबी) आम तौर पर नोड-वाइड क्षेत्र में आवंटित होती हैं और संदर्भ गिना जाता है। Erlang प्रक्रियाओं बस इन बाइनरी के संदर्भ स्टोर। इसका मतलब है कि यदि आप एक बड़ी बाइनरी बनाते हैं और इसे किसी अन्य प्रक्रिया में भेजते हैं, तो आप केवल संदर्भ भेज रहे हैं।

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

निकोलस ग्रैडवोहल ने बताया कि वीएम के लिए एक प्रयोगात्मक हाइब्रिड हीप मोड था जो प्रक्रियाओं के बीच टर्म साझा करने की अनुमति देता था और शून्य-प्रतिलिपि संदेश को सक्षम करता था। यह एक विशेष रूप से आशाजनक प्रयोग नहीं रहा है क्योंकि मैं इसे समझता हूं - इसे अतिरिक्त लॉकिंग की आवश्यकता होती है और प्रक्रियाओं की मौजूदा क्षमता को स्वतंत्र रूप से कचरा इकट्ठा करने के लिए जटिल करती है। इसलिए न केवल इंटर-प्रोसेस संदेशों की प्रतिलिपि बना रही है जो एरलांग सिस्टम में सामान्य बाधा नहीं है, जिससे यह वास्तव में प्रदर्शन को कम कर देता है।

+1

हां, गैर-एसएमपी वीएम में हाइब्रिड और शेर मॉडल संभव थे, लेकिन अत्यधिक लॉकिंग और एसएमपी में कचरे के साथ मुद्दों के कारण ये मॉडल निषिद्ध रूप से धीमे और बनाए रखने में कठोर थे, इसलिए उन्हें गिरा दिया गया। – gleber

4

मुझे लगता है कि अन्य सवाल आप संदर्भित कर रहे हैं करने के लिए स्वीकार किए जाते हैं जवाब लिखा है, और उस में मैं तुम्हें कोड की इस पंक्ति के लिए एक सीधा सूचक दे:

message = copy_struct(message, msize, &hp, &bp->off_heap); 

यह एक समारोह में कहा जाता है जब Erlang रन -टाइम सिस्टम को एक संदेश भेजने की आवश्यकता होती है, और यह किसी भी प्रकार के "अगर" के अंदर नहीं है जिससे इसे छोड़ दिया जा सकता है। तो, जहां तक ​​मैं कह सकता हूं, जवाब है "हाँ, यह हमेशा कॉपी किया जाता है।" (यही कारण है कि सख्ती से सच नहीं है - वहाँ एक "अगर", लेकिन यह असाधारण मामलों, नहीं सामान्य कोड के प्रवाह पथ के साथ काम कर रहा है।)

(मैं संकर ढेर विकल्प निकोलस द्वारा लाया अनदेखी कर रहा हूँ ऐसा लगता है कि वह सही है, लेकिन चूंकि इस तरह से एर्लांग सामान्य रूप से निर्मित नहीं होता है और इसकी अपनी दंड है, मुझे नहीं लगता कि यह आपकी चिंता का उत्तर देने के तरीके के रूप में विचार करने योग्य है।)

मुझे नहीं पता कि आप 10 GByte/sec को बाधा क्यों मान रहे हैं। कंप्यूटर में रजिस्ट्रार या सीपीयू कैश से कुछ भी कम नहीं होता है, और ऐसी यादें छोटी होती हैं, इस प्रकार खुद को एक प्रकार की बाधा उत्पन्न होती है। इसके अलावा, आपके द्वारा प्रस्तावित शून्य-प्रतिलिपि विचार को बहु-कोर सिस्टम में गुजरने वाले क्रॉस-सीपीयू संदेश के मामले में लॉकिंग की आवश्यकता होगी, जो एक बाधा भी है। हम इस प्रक्रिया में एक बार अन्य प्रक्रिया के संदेश कतार में संदेश की प्रतिलिपि बनाने के लिए लॉकिंग जुर्माना दे रहे हैं; बाद में भुगतान क्यों करें जब यह प्रक्रिया संदेश पढ़ने के लिए हो जाती है?

नीचे की रेखा, मुझे नहीं लगता कि इसे तेजी से जाने के तरीकों के आपके विचार वास्तव में बहुत मदद करेंगे।

7

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

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

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