2009-03-13 7 views
17

मैंने जो आर्मस्ट्रांग के 'Programming Erlang', और 'एन कोर मशीन में एन गुना तेज' सिद्धांत पढ़ा। Erlang में multicore प्रोग्रामिंग के लिए कुशल तरीका बहुत सारी प्रक्रियाओं (धागे) का उपयोग करना है।एरलांग और अन्य भाषा में मल्टीकोर प्रोग्रामिंग के बीच क्या अंतर है?

मैं एक सी ++ प्रोग्रामर हूं, इसलिए मैं सी ++ में बहुत सारे थ्रेड बनाने और एरलांग में कई प्रक्रियाओं के बीच अंतर के बारे में उत्सुक हूं। मैं समझता हूं कि सी/सी ++ में धागे से निपटना इतना आसान नहीं है। इसके अलावा मुझे पता है कि लॉकिंग/अनलॉकिंग सिस्टम को धीमा कर देती है। लेकिन यह असंभव नहीं है, है ना?

तो .. Erlang एक muticore दोस्ताना भाषा क्यों है? क्या यह सिर्फ इसलिए है क्योंकि कार्यक्रम करना आसान है?

मैं एक एमएमओआरपीजी के लिए एक ऑनलाइन गेम सर्वर बना रहा हूं, इसलिए मुझे एर्लांग में वैकल्पिक सर्वर भाषा के रूप में रूचि है।

(मैं पहले से ही this सवाल पढ़ा लेकिन मुझे लगता है यह सवाल मैं तलाश कर रहा हूँ नहीं है।)

+2

एरलांग में 'थ्रेड' नहीं है जिसमें एर्लांग प्रक्रियाएं हैं। Erlang प्रक्रियाओं के बारे में सोचने के रूप में 'धागे' एक प्रमुख श्रेणी गलती है और आपको गलत रास्ते का सही नेतृत्व करेंगे ... –

+0

हाँ। मैं सिर्फ प्रोग्रामर के लिए 'थ्रेड' का जिक्र करता हूं जो केवल सी ++ को जानता है। –

+0

** संबंधित: ** http://stackoverflow.com/questions/2708033/technically-why-is-processes-in-erlang-more- कुशल-than-os-threads – Jonas

उत्तर

15

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

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

+0

हां +1 'स्पष्टीकरण के लिए' क्यों Erlang '। यह केवल एर्लांग नहीं है, कोई भी कार्यात्मक प्रोग्रामिंग भाषा जो हास्केल या स्कीम जैसी शुद्धता प्रदान करती है, इसे प्रदान कर सकती है। –

+2

एर्लांग भी रनटाइम इंजन में निर्मित समानांतर (काफी पारदर्शी) के साथ आता है जिस तरह से हास्केल या योजना कार्यान्वयन आमतौर पर नहीं होते हैं। – ConcernedOfTunbridgeWells

1

ठीक है, कि केवल एक बार सेट किया जा सकता है चर के साथ भाषा की प्रकृति और तथ्य यह है कि यह एक कार्यात्मक है भाषा स्वचालित रूप से कई समांतरता वाले कार्यक्रमों को मल्टीकोर के लिए "सही तरीका" लिखा और निष्पादित करती है।

मुझे उन दो तथ्यों के अलावा एर्लांग के बारे में बहुत कुछ पता नहीं है, इसलिए कुछ और भी हो सकता है। लेकिन यह कहना नहीं है कि आप एक सी ++ प्रोग्राम को स्केलेबल के रूप में नहीं बना सकते हैं, लेकिन संभवतः आप प्रदर्शन, स्केलेबिलिटी और स्थिरता को प्राप्त करने के लिए बहुत कुछ करेंगे, यदि आप एरलांग में लिखते हैं तो बिना किसी कीमत के आएंगे।

3

संदर्भ स्विच बेहद महंगा है। Erlang में कोई नहीं है। ताले पारंपरिक कार्यक्रमों को यह सोचने लगते हैं कि कौन सा धागा अगले निष्पादित करने जा रहा है। यह भी बेहद महंगा है।

24

यह धागे बनाम प्रक्रिया पर आता है।

ऑपरेटिंग सिस्टम विशेष रूप से डिज़ाइन किए गए थे ताकि प्रत्येक 'उपयोगकर्ता' ने सोचा कि उनके पास पूरा कंप्यूटर था - यही कारण है कि आप उदाहरण के लिए उपयोगकर्ता wwwrun के रूप में अपाचे चलाते हैं।

प्रोग्रामर होने के कारण प्रोग्रामर ने उस प्रतिमान को अधिभारित करना शुरू किया, पहले प्रत्येक मानव उपयोगकर्ता द्वारा कई 'नौकरियां' चलाते हुए। चूंकि ऑपरेटिंग सिस्टम कई उपयोगकर्ताओं के लिए डिज़ाइन किए गए थे, उस आर्किटेक्चर की ऊपरी स्केलिंग सीमा उपयोगकर्ताओं के लिए ऊपरी स्केलिंग सीमा को प्रतिबिंबित करती है - यही कारण है कि अपाचे, उदाहरण के लिए, 4,000 - 8,000 उपयोगकर्ताओं पर मरना शुरू कर देगा।

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

  • यदि आपके पास पर्याप्त प्रक्रियाओं क्योंकि ऑपरेटिंग सिस्टम यह

  • प्रत्येक प्रक्रिया महंगी है संभाल नहीं कर सकते क्योंकि, डिजाइन द्वारा, यह उपयोगकर्ता ऑपरेटिंग सिस्टम की पूरी शक्ति देता है नहीं मिल सकता है

समस्या धागे यह है कि वे अलगाव को तोड़ते हैं जिनके लिए प्रक्रियाओं को डिजाइन किया गया था। मेरा धागा आपके धागे को मिटा सकता है - त्रुटियां फैलती हैं।

जहां Erlang अलग है, कई मामलों में है। जो आर्मस्ट्रांग का PhD Thesisसॉफ़्टवेयर त्रुटियों की उपस्थिति में विश्वसनीय वितरित सिस्टम बनाना कहा जाता है।

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

इसके अलावा, जो ने अपने पीएचडी थीसिस के पहले खंड के पहले भाग में इसे विश्वसनीय सॉफ्टवेयर रखने के लिए दो कंप्यूटरों के साथ शुरू करने की आवश्यकता है। Erlang/OTP के साथ, पर समय लिखें, आपको नहीं पता कि आपका सॉफ्टवेयर किस कंप्यूटर पर चल रहा है। रनल समय पर एरलांग/ओटीपी क्लस्टर आपके कम्प्यूटेशनल काम को आवंटित करेगा। तो एक एरलांग प्रक्रिया देशी वितरित होती है, जैसे स्पॉन() (कांटा() के लिए एरलांग) और अर्थशास्त्र को पुनरारंभ करें।

क्योंकि एरलांग की अपनी प्रक्रियाएं हैं, इसका अपना शेड्यूलर और उसका कोड लोडर/बाइनरी प्रारूप है (एरलांग का अर्थ लिया जा सकता है या यह मूल बाइनरी में संकलित हो सकता है)।इसके बाद आप अतिरिक्त लाभों की एक टीम देते हैं - इससे पहले कि आप अपना एरलांग/ओटीपी एप्लीकेशन लिख लें, यह पहले से ही अपनी बाइनरी आउट आदि को गर्म कर सकता है,

तो, सुनिश्चित करें कि आप सी ++ में बहु-थ्रेडेड ऐप्स लिख सकते हैं - लेकिन यह आपका है त्रुटि प्रसार को रोकने और सिस्टम स्थिरता बनाने की जिम्मेदारी।

और सुनिश्चित करें कि आप एर्लांग (सीएम में सीएम लिखा गया है) में विश्वसनीय सॉफ्टवेयर बना सकते हैं, यही कारण है कि आप क्यों चाहते हैं? पुराने दिनों में, कंपनियों ने अपना खुद का 'ऑपरेटिंग सिस्टम' लिखा था, अब आप अपना खुद का ऑपरेटिंग सिस्टम लिख सकते हैं, लेकिन आप क्यों चाहेंगे? मजबूत परीक्षण कोड की लाखों लाइनें हैं जो 'करता है', जैसे एरलंग/ओटीपी सिस्टम में 1.5 एम लाइनों का मजबूत परीक्षण कोड है जो 'करता है'।

एरलांग का उपयोग उन चीजों का उपयोग करने के बारे में है जो अन्य लोगों ने लिखे हैं और केवल उन बिट्स का निर्माण कर रहे हैं जो आपकी कंपनी को प्रभावी बनाती हैं।

2

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

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

संपादित: अच्छी presentation ++ Erlang और सी के बीच अंतर के बारे में - Erlang बड़ा शीर्ष प्रदर्शन, 3x कम विलंबता और 2.5x 18x कम SLOC - मुझे लगता है कि मोटोरोला के डेवलपर्स सी में अनुभवी ++ काफी अच्छा सॉफ्टवेयर लिखने के लिए।

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