28

मैंने विभिन्न स्रोतों की खोज की लेकिन NSThreads और जीसीडी का उपयोग करने के बीच वास्तव में अंतर को समझ में नहीं आया। मैं ओएस एक्स प्लेटफॉर्म पर पूरी तरह से नया हूं इसलिए मैं पूरी तरह से गलत व्याख्या कर रहा हूं।ग्रैंड सेंट्रल डिस्पैच बनाम एनएसटीएचडीएस?

जो मैंने ऑनलाइन पढ़ा है, उससे जीसीडी अधिक तकनीकी शब्दावली ("ब्लॉक") जोड़ते समय मूल धागे (POSIX, NSThreads इत्यादि) के समान ही काम करता है। ऐसा लगता है कि मूल धागा निर्माण प्रणाली (थ्रेड, रन फ़ंक्शन बनाएं) को केवल जटिल बनाते हैं।

जीसीडी वास्तव में क्या है और पारंपरिक थ्रेडिंग पर इसे कभी भी क्यों पसंद किया जाएगा? जीसीडी के बजाए पारंपरिक धागे का इस्तेमाल कब किया जाना चाहिए? और अंत में जीसीडी के अजीब वाक्यविन्यास का कोई कारण है? (केवल कॉलिंग फ़ंक्शंस के बजाय "ब्लॉक")।

मै मैक ओएस एक्स 10.6.8 हिम तेंदुए पर हूं और मैं आईओएस के लिए प्रोग्रामिंग नहीं कर रहा हूं - मै मैक के लिए प्रोग्रामिंग कर रहा हूं। मैं कोको में एक्सकोड 3.6.8 का उपयोग कर रहा हूं, एक जीयूआई एप्लीकेशन बना रहा हूं।

+0

बस एक नोट सूत्र, ऑपरेटिंग सिस्टम और GCD के साथ मेरा अनुभव साझा किया है: यदि आप उन्हें ब्लॉक से अधिक पसंद करते हैं GCD फ़ंक्शन के उपयोग की अनुमति देता है। – Monolo

+0

इस विषय पर ऐप्पल डेवलपर कनेक्शन (मुफ्त में) पर वास्तव में अच्छे वीडियो हैं - उन्हें जांचें! – Jay

उत्तर

44

डिस्पैच के लाभ

प्रेषण के फायदे ज्यादातर यहां दिए गए हैं:

Migrating Away from Threads

विचार यह है कि आप अपनी ओर से काम खत्म करने के बाद से प्रतिमान और अधिक आसानी से सबसे कोड फिट बैठता है ।

  • यह स्मृति दंड आपके आवेदन आवेदन की स्मृति अंतरिक्ष में धागा ढेर के भंडारण के लिए भुगतान करता है कम कर देता है।
  • यह आपके धागे बनाने और कॉन्फ़िगर करने के लिए आवश्यक कोड को समाप्त करता है।
  • यह थ्रेड पर काम को प्रबंधित और शेड्यूल करने के लिए आवश्यक कोड को समाप्त करता है।
  • यह आपके द्वारा लिखे गए कोड को सरल बनाता है।

अनुभव से, GCD प्रकार @synchronized के बजाय ताला का उपयोग कर तेजी से या अधिक के बारे में 80% है, हालांकि सूक्ष्म मानक धोखा हो सकता है। here और पढ़ें, हालांकि मुझे लगता है कि लिखने के साथ एसिंक जाने की सलाह कई मामलों में लागू नहीं होती है, और यह धीमी है (लेकिन यह असीमित है)।

धागे

आप धागे का उपयोग क्यों जारी रहेगा के लाभ? उसी दस्तावेज़ से:

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

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

उद्देश्य-सी में ब्लॉक?

भयानक वाक्यविन्यास के कारण उद्देश्य-सी में ब्लॉक वास्तव में भयानक हैं (हालांकि एक्सकोड कभी-कभी स्वतः पूर्ण होने में सहायता कर सकता है)। यदि आप रूबी (या किसी अन्य भाषा, बहुत ज्यादा) में ब्लॉक देखते हैं तो आप देखेंगे कि वे प्रेषण के लिए कितने सरल और सुरुचिपूर्ण हैं। मैं कहूंगा कि आप उद्देश्य-सी वाक्यविन्यास में उपयोग करेंगे, लेकिन मुझे सच में लगता है कि आप अपने उदाहरणों से प्रतिलिपि बनाने के लिए उपयोग करेंगे :)

आपको उपयोगी होने के लिए my examples from here मिल सकता है, या सिर्फ ध्यान भंग। निश्चित नहीं।

+0

[दस्तावेज़] (https://developer.apple.com/reference/dispatch?changes=latest_minor) कहता है ** "प्रेषण कतारों में सबमिट किए गए कार्य को सिस्टम द्वारा पूरी तरह से प्रबंधित धागे के पूल पर निष्पादित किया जाता है। कोई गारंटी नहीं दी जाती है उस धागे पर जिस पर एक कार्य निष्पादित करता है "**, वे आखिरी पंक्ति में क्या कहना चाहते हैं? – Rishi

9

ब्लॉक निष्पादित करने के लिए कोड के ब्लॉक को पार करने की अनुमति देते हैं। एक बार जब आप "अजीब वाक्यविन्यास" से पहले हो जाते हैं, तो वे काफी शक्तिशाली होते हैं।

जीसीडी कतारों का भी उपयोग करता है जो अलग-अलग कतारों में निष्पादित कोड अलग होने पर लॉक फ्री कॉन्सुरेंसी के साथ ठीक से उपयोग करने में मदद कर सकते हैं। डेडलॉक्स के मौके को कम करने के दौरान पृष्ठभूमि और समरूपता प्रदान करने का यह एक आसान तरीका है (यदि सही उपयोग किया जाता है)।

"अजीब वाक्य रचना" है क्योंकि वे कैरेट (^) चुना है, क्योंकि यह कुछ ऐसे प्रतीक दिए गए सी में एक ऑपरेटर ++

देखें के रूप में अतिभारित नहीं किया गया था में से एक था: https://developer.apple.com/library/ios/#documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html

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

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

...

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

+0

मैं इस अंतिम पैराग्राफ का पालन नहीं करता हूं। यह हमेशा ऐसा लगता है जैसे ओकेशनल लॉकिंग एक धारावाहिक कतार से भी बदतर है, जिसमें कोई समरूपता नहीं है। क्या यह आपके अनुभव में कितनी बार लॉकिंग होता है, इस पर निर्भर करता है कि यह एक अनुभवजन्य प्रश्न नहीं है? –

+1

मुझे लगता है कि यह वही कह रहा है - भले ही आप एक धारावाहिक कतार का उपयोग करते हैं, यह लॉकिंग के साथ समवर्ती धागे से अक्सर बेहतर होता है। यह "अक्सर" और "हमेशा" नहीं होता है क्योंकि यदि लॉकिंग न्यूनतम है (और आप डेडलॉक आदि का प्रबंधन नहीं कर सकते हैं ...), तो आप समरूपता के साथ तेजी से हो सकते हैं लेकिन थ्रेड मेमोरी के ऊपरी हिस्से के साथ। – bryanmac

+1

इसके अलावा, थ्रेड के साथ अधिकांश समय, लोग बस एसिंक जाने की कोशिश कर रहे हैं और यूआई थ्रेड को अवरुद्ध नहीं कर रहे हैं जो एक साधारण एकल कतार के लिए अच्छा है। – bryanmac

11

आप हमेशा पसंद किए जाने वाले जवाब अब तक एक भी आवेदन के डोमेन के अंदर धागे के संदर्भ बनाम GCD और मतभेदों को यह प्रोग्रामिंग के लिए है, कारण के बारे में हैं GCD क्योंकि मल्टीटास्किंग वातावरण का है (के बाद से आप कर रहे हैं मैकोज़क्स पर और आईओएस नहीं)। आपकी मशीन पर अकेले चल रहा है, तो थ्रेड ठीक हैं। कहें, आपके पास एक वीडियो संस्करण प्रोग्राम है और वीडियो पर कुछ प्रभाव लागू करना चाहते हैं। रेंडर में 8 कोर के साथ मशीन पर 10 मिनट लगेंगे। ठीक।

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

अधिक विस्तृत संदर्भ के लिए, http://deusty.blogspot.com/2010/11/introducing-gcd-based-cocoahttpserver.html पर एक नज़र डालें जहां आप जीसीडी बनाम थ्रेड का उपयोग कर HTTP सर्वर का बेंचमार्क देख सकते हैं, और देखें कि यह कैसे स्केल करता है। एक बार जब आप समझते हैं कि बहु-ऐप वातावरण में मल्टीकोर मशीनों के लिए समस्याएं हैं, तो आप हमेशा जीसीडी का उपयोग करना चाहेंगे, क्योंकि थ्रेड हमेशा अनुकूल नहीं होते हैं, जबकि जीसीडी संभावित रूप से हो सकता है क्योंकि ओएस लोड के आधार पर प्रति ऐप थ्रेड उपयोग स्केल कर सकता है।

कृपया, याद रखें कि हमारे मशीनों में जल्द ही हमारे मशीनों में अधिक GHz नहीं होगा। अब से हमारे पास केवल अधिक कोर होंगे, इसलिए इस पर्यावरण के लिए सर्वोत्तम उपकरण का उपयोग करना आपका कर्तव्य है, और वह जीसीडी है।

+0

बहुत दिलचस्प +1। –

+0

हाँ - बहुत अच्छे अंक। धन्यवाद – bryanmac

+0

मॉडल और कोर को थ्रेड करने के बारे में निश्चित नहीं है, लेकिन अनुभवजन्य साक्ष्य यह है कि आईओएस पर भी, जीसीडी के लिए लॉकिंग मॉडल मेरे पसंदीदा, 'सिंक्रनाइज़ेड' से कहीं अधिक तेज़ है: http://www.fieryrobot.com/blog/2010/09/01/सिंक्रनाइज़ेशन-ग्रैंड-सेंट्रल-प्रेषण/टिप्पणी-पृष्ठ -1/# टिप्पणी -221262 (अगर वे आपके मामले पर लागू नहीं होते हैं तो एसिंक सेटर्स का उपयोग करने के लिए लेखक की सलाह को अनदेखा करें) –

0

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

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

मैं एटी http://iosdose.com