2009-09-01 10 views
6

मुझे बताया गया है कि क्लोजर में लॉकलेस समेकन है और यह महत्वपूर्ण है।लॉकलेस समेकन इतना बड़ा सौदा क्यों है (क्लोजर में)?

मैंने कई भाषाओं का उपयोग किया है लेकिन उन्हें नहीं पता था कि वे दृश्यों के पीछे ताले प्रदर्शन कर रहे थे।

क्लोजर (या इस सुविधा में मौजूद किसी भी भाषा में) का यह लाभ क्यों है?

उत्तर

8

मैं विशेष रूप से क्लोजर के बारे में बात नहीं कर सकता, लेकिन ... इसका मतलब है कि आपको काम करने से पहले किसी के साथ कुछ करने के लिए इंतजार करने की आवश्यकता नहीं है। जो माहान है।

आमतौर पर यह अपरिवर्तनीय प्रकारों के साथ हासिल किया जाता है। अगर कुछ भी संशोधित नहीं किया जा सकता है, तो आपको इसे तब तक इंतजार करने की ज़रूरत नहीं है जब तक कि आप इसे एक्सेस करने से पहले किसी और के साथ नहीं कर लेते।

+2

'कोई' कौन है? क्या आप एक उदाहरण दे सकते हैं? मुझे नहीं लगता कि कोई भी 'मेरे साथ मेरी वस्तुओं को साझा कर रहा है। शायद मुझे बिस्तर के नीचे जांच करनी चाहिए। –

+4

* कोई * कोड का एक और टुकड़ा है, दूसरे थ्रेड में, उस ऑब्जेक्ट को एक्सेस करना। –

+0

कभी-कभी कभी-कभी तेज़ी से तेज़ होता है - जैसे अधिकांश अनुकूलन जो मापने के बिना किए जाते हैं। तो कभी-कभी यह एक अच्छी बात है, और कभी-कभी उन ताले बेहतर होते। यही कारण है कि हम सॉफ्टवेयर ** इंजीनियरों ** कहा जाता है। – Eloff

5

डेडलॉक्स। या उनकी कमी की अधिक सही होने के लिए। डिबग करने के लिए पृथ्वी पर

  1. नरक:

    सबसे अधिक भाषाओं में सबसे बड़ी समस्याओं में से एक यह है कि आप गतिरोध कि कर रहे हैं के साथ पहुंचते हैं।

  2. यह सुनिश्चित करने में कठिनाई है कि आप छुटकारा पा चुके हैं।

अब कोई ताले के साथ, जाहिर है कि आप डेडलॉक्स में नहीं भागेंगे।

+0

मुझे कभी भी एक डेडलॉक का सामना नहीं हुआ है जिसे मैं जानता था। क्या यह शायद मुझे लगता है कि यह अक्सर से अधिक हो रहा है? मुझे लगता है कि मैं इस मुद्दे से परिचित नहीं हूं, भले ही मैंने बहुत प्रोग्राम किया है। डेटाबेस में ही एकमात्र लॉकिंग मुद्दों के बारे में मुझे पता था। –

+0

@i_like_monkeys यदि आप सी # में वेबफ्रंटेंड लिख रहे हैं तो अधिकांश लॉकिंग मुद्दे निम्न परतों (वेबसर्वर और डेटाबेस) में होने जा रहे हैं, लेकिन यदि आप प्रोग्राम विकसित करने जा रहे हैं जो निश्चित रूप से एक मुद्दा है। – tomjen

+0

यदि आपके पास डेडलॉक है, तो आमतौर पर लक्षण यह होगा कि आपका प्रोग्राम फ्रीज हो जाएगा (0% सीपीयू उपयोग, इसके कार्यों में से कोई भी नहीं किया जाता है, जब तक कि आप इसे टास्क मैनेजर या मैन्युअल रूप से मार नहीं देते)। डेडलॉक्स तब हो सकते हैं जब आपके धागे एक समय में एक से अधिक ताला लगा रहे हों, और अलग-अलग धागे ताले को एक अलग क्रम में प्राप्त कर रहे हों। –

1

लॉकलेस समेकन का लाभ कार्यक्रम में जटिलता की कमी है। अनिवार्य भाषाओं में, समवर्ती प्रोग्रामिंग ताले पर निर्भर करती है, और एक बार जब कार्यक्रम भी मामूली जटिल हो जाता है, तो हार्ड-टू-फिक्स डेडलॉक बग्स रेंगते हैं।

+0

क्या यह कभी आपके साथ हुआ है? –

9

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

+0

हाँ! एसटीएम = सॉफ्टवेयर लेनदेन मेमोरी। यह देखने के लिए एक अच्छा काम है कि क्या आप यह जानना चाहते हैं कि यह कैसे काम करता है। क्लोजर एसटीएम में –

+2

, पाठकों को अन्य लेखकों के लिए भी इंतजार नहीं करना पड़ता है (जब तक वे एकाधिक संदर्भों में लगातार स्नैपशॉट प्राप्त करने के लिए एक लेनदेन पढ़ने के लिए नहीं चाहते हैं) – mikera

+0

'पाठकों को कभी भी अन्य पाठकों के लिए इंतजार नहीं करना पड़ता है' अनिवार्य दुनिया में, रीड-राइट लॉक इस कार्यक्षमता प्रदान करते हैं :) – vemv

2

जब तक आप सख्ती से अनुक्रमिक प्रोग्राम लिखते हैं (ए, फिर बी, फिर सी; समाप्त हो गया!) आपके पास समवर्ती समस्याएं नहीं हैं, और एक भाषा की समवर्ती तंत्र अप्रासंगिक रहती है ।

जब आप "प्रोग्रामिंग अभ्यास" कार्यक्रमों से वास्तविक दुनिया की सामग्री में स्नातक हो जाते हैं, तो जल्द ही आपको उन समस्याओं का सामना करना पड़ता है जिनके समाधान बहु-थ्रेडिंग (या आपके द्वारा उपलब्ध समेकन का स्वाद) है।

केस: एक जीयूआई के साथ कार्यक्रम। मान लें कि आप वर्तनी जांच के साथ एक संपादक लिख रहे हैं। आप चाहते हैं कि वर्तनी परीक्षक चुपचाप पृष्ठभूमि में अपनी चीज कर रहा हो, फिर भी आप चाहते हैं कि जीयूआई उपयोगकर्ता इनपुट को आसानी से स्वीकार करे। तो आप उन दो गतिविधियों को अलग धागे के रूप में चलाते हैं।

केस: मैंने हाल ही में एक कार्यक्रम (काम के लिए) लिखा है जो दो लॉग फ़ाइलों से आंकड़े एकत्र करता है और उन्हें डेटाबेस में लिखता है। प्रत्येक फ़ाइल को संसाधित करने में लगभग 3 मिनट लगते हैं। मैंने उन प्रक्रियाओं को दो धागे में स्थानांतरित किया जो कि तरफ से चलते हैं, कुल प्रसंस्करण समय को 6 मिनट से थोड़ा अधिक 3 तक काटते हैं।

केस: वैज्ञानिक/इंजीनियरिंग सिमुलेशन सॉफ्टवेयर। आपके परीक्षण विषय (स्टार न्यूक्लियस, परमाणु विस्फोट, कीट आबादी का भौगोलिक फैलाव ...) का प्रतिनिधित्व करने वाले 3 आयामी ग्रिड में प्रत्येक बिंदु पर कुछ प्रभाव (गर्मी प्रवाह, कहें) की गणना करके हल की गई बहुत सारी समस्याएं हैं। असल में वही गणना प्रत्येक बिंदु पर और कई बिंदुओं पर की जाती है, इसलिए यह समानांतर में किया जाने का अर्थ होता है।

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

इस विषय की एक उपयोगी उपयोगी प्रारंभिक चर्चा in Wikipedia मिल सकती है।

0

ऐसी "लॉकलेस कॉन्सुरेंसी" वास्तव में भाषा की विशेषता नहीं है; बल्कि, यह एक मंच या रनटाइम पर्यावरण की एक विशेषता है, और दुःख ऐसी भाषा है जो आपको इन सुविधाओं तक पहुंचने के तरीके से बाहर नहीं निकल जाएगी।

लॉक-आधारित और लॉक-फ्री समरूपता के बीच के व्यापारों के बारे में सोचना मेटासिर्क्यूलर मूल्यांकनकर्ता समस्या के समान है: कोई परमाणु संचालन (जैसे तुलना-और-स्वैप, या सीएएस) के मामले में ताले लगा सकता है, और कोई भी कार्यान्वित कर सकता है ताले के मामले में परमाणु संचालन। जो नीचे होना चाहिए?

5

सबसे बड़ा सौदा यह है कि ताले लिखते नहीं हैं।

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

ये समस्याएं किसी भी व्यक्ति के लिए स्पष्ट हो जाएंगी, जिसने एक बड़ी, जटिल समवर्ती प्रणाली बनाना है (और उन्हें हल करना रिच हिकी के लिए क्लोजर बनाने में एक प्रमुख प्रेरणा थी)।

दूसरा मुद्दा प्रदर्शन है।

लॉकिंग और एसटीएम दोनों स्पष्ट रूप से ओवरहेड लगाते हैं। लेकिन कुछ महत्वपूर्ण मामलों में एसटीएम ओवरहेड बहुत कम हो सकता है।

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

+0

क्लोजर में एक एसटीएम संदर्भ के गैर-लेनदेन संबंधी रीड अनिवार्य रूप से ओवरहेड मुक्त हैं। सिद्धांत रूप में लेनदेन को पढ़ना चाहिए? डॉक्टर कहते हैं, "पाठकों और यात्रियों को कभी भी लेखकों, यात्रियों, या अन्य पाठकों को अवरुद्ध नहीं किया जाएगा।" – vemv