समानांतर और समवर्ती प्रोग्रामिंग के बीच अंतर?


44

समवर्ती प्रोग्रामिंग को देखते समय, दो शब्दों का आमतौर पर उपयोग किया जाता है अर्थात समवर्ती और समानांतर।

और कुछ प्रोग्रामिंग भाषाएं विशेष रूप से समानांतर प्रोग्रामिंग के लिए समर्थन का दावा करती हैं, जैसे कि जावा

क्या इसका मतलब समानांतर और समवर्ती प्रोग्रामिंग वास्तव में अलग हैं?


10
हां, समवर्ती और समानांतर प्रोग्रामिंग अलग हैं। उदाहरण के लिए, आपके पास संदर्भ बदलने के माध्यम से एक ही कोर पर समवर्ती रूप से निष्पादित करने वाले दो धागे (या प्रक्रियाएं) हो सकते हैं। जब दो धागे (या प्रक्रियाएं) दो अलग-अलग कोर (या प्रोसेसर) पर निष्पादित होते हैं, तो आपके पास समानता होती है। तो, पूर्व मामले में (संगामिति) समानता केवल "आभासी" है, जबकि उत्तरार्द्ध में आपके पास सही समानता है। इसलिए, प्रत्येक समानांतर कार्यक्रम समवर्ती होता है, लेकिन यह आवश्यक नहीं है कि रूपांतरण सही हो।
मैसिमो कैपरो

1
यहां सावधान रहें। आप भाषा समर्थन (यानी, नए निर्माणों के साथ भाषा का विस्तार) या निम्न स्तर के दृष्टिकोण (जैसे, पुस्तकालय का उपयोग करके, एमपीआई और ओपनएमपी के मामले में) का उपयोग करके समान परिणाम प्राप्त कर सकते हैं। वैसे भी, SMP समर्थन के साथ वर्तमान मल्टीकोर प्रोसेसर और ऑपरेटिंग सिस्टम के साथ, प्रोग्राम जो समवर्ती होगा यदि पुराने सिंगल-कोर प्रोसेसर पर चलाए जाते हैं, तो समानांतर में निष्पादित किया जा सकता है यदि ओएस विभिन्न कोर पर प्रोग्राम के निष्पादन के थ्रेड को शेड्यूल करता है। तो, भेद आजकल थोड़ा "धुंधला" है।
मास्सिमो काफ़ारो

3
आप प्रकाश विलंबता स्थिरांक की गति के लिए क्या उपयोग करते हैं। संगामिति में आप प्रकाश विलंबता की गति दिखाते हैं एक घड़ी चक्र है। समानांतर में आप मानते हैं कि एक सर्वर अगले दरवाजे पर है, वितरित में आप मानते हैं कि एक सर्वर मंगल पर है।


1
रॉबर्ट हार्पर ने दो ब्लॉग पोस्टों में इस मुद्दे पर चर्चा की, "समानांतरवाद संगामिति नहीं है" और "समानांतरवाद और संगामिति, पुनर्विचार" , जिसे आप जांचना चाहते हैं।
तुलसी

जवाबों:


26

समरूपता (साझा संसाधनों तक पहुंच का प्रबंधन) से समांतरवाद (प्रति यूनिट समय में अधिक काम करने के लिए अतिरिक्त कम्प्यूटेशनल इकाइयों का उपयोग करना)। समानता parallel rst सिखाएं क्योंकि यह आसान है और एक गैर-अनुक्रमिक मानसिकता को स्थापित करने में मदद करता है।

डैन ग्रॉसमैन द्वारा "ए सोफोमेरिक to परिचय से साझा-स्मृति समानता और संगोष्ठी का परिचय" (16 नवंबर, 2013 का संस्करण)


21

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

वहां से उद्धृत:

कई क्षेत्रों में, समानांतर और समवर्ती शब्द समानार्थक हैं; प्रोग्रामिंग में ऐसा नहीं है, जहां उनका उपयोग मौलिक रूप से विभिन्न अवधारणाओं का वर्णन करने के लिए किया जाता है।

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

इसके विपरीत, समरूपता एक प्रोग्राम-स्ट्रक्चरिंग तकनीक है जिसमें नियंत्रण के कई सूत्र हैं। विशेष रूप से नियंत्रण के धागे "एक ही समय में" निष्पादित होते हैं; अर्थात्, उपयोगकर्ता उनके प्रभाव को देखता है। चाहे वे वास्तव में एक ही समय में निष्पादित हों या नहीं एक कार्यान्वयन विवरण है; समवर्ती कार्यक्रम एकल प्रोसेसर पर interleaved निष्पादन, या कई भौतिक प्रोसेसर के माध्यम से निष्पादित कर सकता है।

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

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

"नियंत्रण के धागे" की धारणा विशुद्ध रूप से कार्यात्मक कार्यक्रम में समझ में नहीं आती है, क्योंकि निरीक्षण करने के लिए कोई प्रभाव नहीं हैं, और मूल्यांकन क्रम अप्रासंगिक है। तो समसामयिक प्रभावकारी कोड के लिए एक संरचित तकनीक है; हास्केल में, जिसका अर्थ है IO मोनाड में कोड।

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

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

हालांकि समवर्ती प्रोग्रामिंग का उपयोग करते हुए समानांतर प्रोग्रामिंग करना संभव है, यह अक्सर एक खराब विकल्प है, क्योंकि संगामिति sacriffices निर्धारकवाद। हास्केल में, समानांतर प्रोग्रामिंग मॉडल नियतात्मक हैं। हालांकि, यह ध्यान रखना महत्वपूर्ण है कि सभी प्रकार के समानांतर एल्गोरिदम को व्यक्त करने के लिए नियतात्मक प्रोग्रामिंग मॉडल पर्याप्त नहीं हैं; ऐसे एल्गोरिदम हैं जो आंतरिक नॉनडेटर्मिनिज़्म पर निर्भर करते हैं, विशेष रूप से समस्याएं जिनमें समाधान स्थान की खोज शामिल है। हास्केल में, एल्गोरिदम का यह वर्ग केवल संगामिति का उपयोग करके अभिव्यक्त होता है।


20

संगामिति और समानताएं उन समस्याओं में भिन्न होती हैं जो वे हल करते हैं और कारण देते हैं, लेकिन वे स्वतंत्र नहीं हैं।

संगामिति

दो कार्यों को समवर्ती रूप से निष्पादित करने का अर्थ है कि दोनों कार्यों के अलग-अलग चरणों को एक interleaved फ़ैशन में निष्पादित किया गया है। यदि आप समानता की अवहेलना करते हैं, तो आप यह मान सकते हैं कि केवल एक बयान को किसी भी समय निष्पादित किया जाता है, लेकिन आपके पास (एक प्राथमिकता) कोई गारंटी नहीं है कि अगले चरण को निष्पादित करने के लिए कौन सा कार्य मिलता है।

यह कुछ मायने में उपयोगी है:

  • एक कार्यक्रम में स्वतंत्र कार्यों की स्पष्ट प्रोग्रामिंग।
  • कंप्यूटिंग करते समय IO से निपटने की अनुमति देता है (उदाहरण के लिए GUI)।
  • एक समय में एक से अधिक कार्यक्रमों के निष्पादन की अनुमति देता है (ओएस स्तर पर संगामिति)।

मुख्य चुनौतियों में से कुछ हैं:

  • डेटा संगति बनाए रखें।
  • गतिरोध और लाइवलॉक से बचें ।
  • समवर्ती प्रक्रियाओं के सटीक शब्दार्थ निर्धारित करें।
  • स्थिर गुण निर्धारित करें जो शुद्धता सुनिश्चित करते हैं।

समानता

समानांतर में दो कार्यों को निष्पादित करने का मतलब है कि बयानों को एक ही समय में निष्पादित किया जाता है । यह मुख्य रूप से उपयोगी है:

  • समानांतर में कार्यक्रमों को निष्पादित करके सिस्टम थ्रूपुट में सुधार करें (जैसे मल्टी कोर सिस्टम पर)।
  • एक साथ कई सीपीयू का उपयोग करके व्यक्तिगत कार्यक्रमों के क्रम में सुधार करें।
  • कई मशीनों (जैसे वितरित डेटाबेस) पर IO का उपयोग करें।

मुख्य चुनौतियों में शामिल हैं:

  • विभाजन की समस्याएं जो एल्गोरिदम को अनुमति देती हैं और विकसित करती हैं जो समानता को नियोजित कर सकती हैं।
  • गणना इकाइयों के बीच निर्भरता और संचार को कम करें।
  • समसामयिकी द्वारा लाई गई सभी समस्याएं: स्मृति के दृष्टिकोण से कम से कम, समानांतर कार्यक्रम स्मृति के दृश्यों के क्रमबद्ध होने के कारण समवर्ती लगते हैं।
  • उप-इष्टतम हार्डवेयर समर्थन से निपटें।

समानांतर और वितरित कंप्यूटिंग को अलग करने के लिए यह प्रश्न भी देखें ।


4

थोड़ा आदर्शित उत्तर, शायद ...

  • Concurrency एक प्रोग्राम कैसे लिखा जाता है इसकी एक संपत्ति है । यदि किसी प्रोग्राम में कांटे / जोड़, ताले, लेन-देन, परमाणु तुलना-और-स्वैप संचालन आदि का उपयोग करके लिखा जाता है, तो यह समवर्ती है।

  • समानांतरवाद एक कार्यक्रम को निष्पादित करने का एक गुण है । यदि एक कार्यक्रम एक साथ एक से अधिक कम्प्यूटेशनल यूनिट पर निष्पादित होता है, तो यह समानांतर में निष्पादित हो रहा है।


1

इस पर उत्तरों का भार है, लेकिन यह भ्रामक हो सकता है। मुझे यह इस तरह से सोचना पसंद है, और शायद यह मदद करता है? "

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

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

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


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

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

अतिरिक्त पढ़ने के लिए, मैं वास्तव में इस प्रश्न के शीर्ष उत्तर में दिए गए उदाहरणों को पसंद करता हूं: https://www.quora.com/What-are-the-differences-between-parallel-concurrent-and-asynchronous-programming

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.