अंतर्निहित समानता / संगामिति अधिक व्यापक क्यों नहीं है? [बन्द है]


13

इंप्लिमेंट समांतरवाद ^ कंप्यूटर पर रखकर कई प्रोग्रामर से बड़ा बोझ उठा सकता है। तो ... वर्तमान में यह अधिक व्यापक क्यों नहीं है?


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


जवाबों:


11

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

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


1
स्कीम में, कुछ लूप हैं जो स्पष्ट रूप से ऑर्डर की गारंटी नहीं देने के लिए चुनते हैं।
जेवियर

कूल मैं नहीं जानता था कि योजना के बारे में
ज़ाचरी के

5

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

विरासत प्रोग्रामिंग भाषाएं भाषा से बहु थ्रेडेड फीचर्स को धीरे-धीरे समर्थन करने की कोशिश कर रही हैं (जैसे जावा जोड़ा java.util.concurrent)।

भविष्य में आने वाली नई भाषाओं में अंतर्निहित थ्रेडिंग और कंसीडर समर्थन बेहतर होगा।


4

अन्य उत्तरों में वर्णित बिंदुओं के अलावा (यह साबित करने के लिए कठिन है कि संचालन स्वतंत्र हैं, और प्रोग्रामर क्रमिक रूप से सोचते हैं), एक तीसरा कारक है जिस पर विचार करने की आवश्यकता है: समानांतरकरण की लागत

सच्चाई यह है कि, थ्रेड समानता के साथ बहुत महत्वपूर्ण लागत जुड़ी हुई है:

  • धागा निर्माण बहुत महंगा है: कर्नेल के लिए, एक प्रक्रिया शुरू करने के लिए एक धागा शुरू करना उसी के बारे में है। मैं सटीक लागतों के बारे में निश्चित नहीं हूं, लेकिन मेरा मानना ​​है कि यह दस माइक्रोसेकंड के क्रम में है।

  • म्यूटेक्स के माध्यम से थ्रेड संचार महंगा है: आमतौर पर, इसके लिए प्रत्येक तरफ एक सिस्टम कॉल की आवश्यकता होती है, संभवतः सोने के लिए एक धागा डालकर उसे फिर से जगाया जाता है, जो विलंबता के साथ-साथ ठंड कैश और फ्लश किए गए टीएलबी भी पैदा करता है। औसतन, म्यूटेक्स को लेने और जारी करने में लगभग एक माइक्रोसेकंड खर्च होता है।

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

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

अंत में, अपवाद के बिना कोई नियम नहीं: निहित समानता के शोषण का काम करता है जहां कोई थ्रेड शामिल नहीं है, जो कि कोड के वेक्टरकरण के साथ मामला है (AVX, Altivec, आदि जैसे SIMD अनुदेश सेट का उपयोग करके)। यह वास्तव में छोटे पैमाने पर समानता के लिए सबसे अच्छा काम करता है जो अपेक्षाकृत आसान साबित होता है।


0

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

अर्थात यह स्वाभाविक नहीं है ......


प्रोग्रामर सोचते हैं कि उन्हें कैसे सोचना सिखाया गया, जिस तरह वे प्रोग्राम करते हैं, उसी तरह उनकी प्रोग्रामिंग लैंग्वेज उन्हें प्रोग्राम करने के लिए प्रोत्साहित करती है। यदि कोई प्रोग्रामर आपकी तथाकथित फ्रिंज भाषाओं में खुद को उजागर नहीं करता है , तो वे कभी नहीं सीखेंगे कि समस्याओं के बारे में तर्क करने के अन्य तरीके हैं। मुझे लगता है यही कारण है कि सात सप्ताह में सात भाषाएं कई अनुशंसित लोगों की सूची में उच्च हैं।
मार्क बूथ

पेरहाप फ्रिंज गलत शब्द था - मेरा मतलब था कि व्यावसायिक रूप से इस्तेमाल की जाने वाली भाषाएँ (यानी C ++ या जावा नहीं)।
मटनज

1
हालाँकि, मैं अपने दावे के साथ खड़ा हूँ (इसे वापस करने के लिए मेरी अपनी राय के अलावा), कि प्रोग्रामर, लोग, नहीं, धातु cpacaity को वास्तव में "मल्टीथ्रेडिंग और बड़े पैमाने पर" परालिसिस प्राप्त करते हैं। एक ही समय में एक से अधिक कार्य करना मानव स्वभाव नहीं है। समय प्रबंधन पर हर पुस्तक आवश्यक कुछ शुरू करने की अवधारणाओं को बढ़ावा देती है, इसे समाप्त करें फिर अगली बात करें, क्योंकि यही कारण है कि हम कैसे वायर्ड हैं। इन प्रतिमानों का प्रभावी ढंग से और प्रभावी ढंग से उपयोग करने के लिए, हमें बड़े पैमाने पर उपकरण समर्थन की आवश्यकता होती है, जो वर्तमान में उपलब्ध नहीं है। कुछ लोग इसे "प्राप्त" करते हैं, और इन उपकरणों को विकसित करने की आवश्यकता है।
मटनज़

1
मुझे लगता don't have the patienceहै कि don't have the mental capacityहालांकि अधिक सटीक आकलन है । अपने करियर के दौरान, मैंने बहुत से आलसी प्रोग्रामर देखे हैं, जितना मैंने बेवकूफ लोगों को देखा है। मैं भाग्यशाली था, हालांकि, मुझे विश्वविद्यालय में अपने पहले वर्ष में, कार्यात्मक प्रक्रिया और साइड प्रोससुरल और OO के साथ बारीक-बारीक समानांतर प्रोग्रामिंग सिखाई गई थी। मुझे संदेह है कि कई प्रोग्रामर इतने भाग्यशाली नहीं थे और उनकी विचार प्रक्रियाएं सीधे-सीधे परिणाम के रूप में सामने आई हैं।
मार्क बूथ

0

लेनदेन ACID होना चाहिए, इसलिए, प्रोग्रामर मुख्य रूप से एक धागे के बारे में सोचने के लिए जाता है।

भाषाओं और प्लेटफ़ॉर्म को प्रोग्रामर को जितना संभव हो उतना कंज़्यूम करने से बचाना चाहिए

और संगामिति स्वयं के रूप में परीक्षण करने के लिए आसान नहीं है, इसलिए प्रोग्रामर इन मुद्दों के अलावा छोड़ने के लिए जाते हैं और, यहां तक ​​कि प्रतिबद्ध संगामिति से निपटने के बारे में नहीं सोच रहे हैं, क्या गलती है

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