ग्रैंड सेंट्रल डिस्पैच: Difference between revisions
No edit summary |
No edit summary |
||
Line 29: | Line 29: | ||
ग्रैंड सेंट्रल डिस्पैच अभी भी निम्न स्तर पर थ्रेड्स का उपयोग करता है लेकिन उन्हें प्रोग्रामर से दूर कर देता है, जिन्हें अधिक विवरणों से चिंतित होने की आवश्यकता नहीं होगी। जीसीडी में कार्य बनाने और क्रमबद्ध करने में सहज होते हैं; एप्पल का कहना है कि जीसीडी में कार्य इकाई को पंक्तिबद्ध करने के लिए 15 निर्देशों की आवश्यकता होती है, जबकि पारंपरिक थ्रेड बनाने के लिए सरलता से कई सौ निर्देशों की आवश्यकता हो सकती है।<ref name="gcdworks" /> | ग्रैंड सेंट्रल डिस्पैच अभी भी निम्न स्तर पर थ्रेड्स का उपयोग करता है लेकिन उन्हें प्रोग्रामर से दूर कर देता है, जिन्हें अधिक विवरणों से चिंतित होने की आवश्यकता नहीं होगी। जीसीडी में कार्य बनाने और क्रमबद्ध करने में सहज होते हैं; एप्पल का कहना है कि जीसीडी में कार्य इकाई को पंक्तिबद्ध करने के लिए 15 निर्देशों की आवश्यकता होती है, जबकि पारंपरिक थ्रेड बनाने के लिए सरलता से कई सौ निर्देशों की आवश्यकता हो सकती है।<ref name="gcdworks" /> | ||
ग्रैंड सेंट्रल डिस्पैच में एक कार्य का उपयोग या | ग्रैंड सेंट्रल डिस्पैच में एक कार्य का उपयोग या तोपंक्तिमें रखा गया कार्य विषय बनाने के लिए किया जा सकता है या इसे किसी घटना स्रोत को निर्दिष्ट किया जा सकता है। यदि किसी घटना स्रोत को कोई कार्य निर्दिष्ट गया है, तो घटना ट्रिगर होने पर ब्लॉक या कार्यक्रम से कार्य इकाई बनाई जाती है, और कार्य इकाई को उचित पंक्ति में रखा जाता है। यह एप्पल द्वारा एक थ्रेड बनाने की तुलना में अधिक कुशल के रूप में वर्णित किया गया है जिसका एकमात्र उद्देश्य ट्रिगरिंग के एकल घटना पर प्रतीक्षा करना है। | ||
== विशेषताएं == | == विशेषताएं == | ||
डिस्पैच रूपरेखा उन्हें बनाने और संचालित करने के लिए कई डेटा प्रकारों और कार्यों की घोषणा करता है: | डिस्पैच रूपरेखा उन्हें बनाने और संचालित करने के लिए कई डेटा प्रकारों और कार्यों की घोषणा करता है: | ||
* प्रेषण पंक्ति ऐसी वस्तुएं हैं जो कार्यों की पंक्ति बनाए रखती हैं, या तो अज्ञात कोड ब्लॉक या कार्यक्रम, और इन कार्यों को अपने | * प्रेषण पंक्ति ऐसी वस्तुएं हैं जो कार्यों की पंक्ति बनाए रखती हैं, या तो अज्ञात कोड ब्लॉक या कार्यक्रम, और इन कार्यों को अपने पंक्ति में निष्पादित करती हैं। लाइब्रेरी स्वचालित रूप से विभिन्न प्राथमिकता स्तरों के साथ कई क्रमें बनाता है जो संचालन परिस्थिति के आधार पर चलने के लिए इष्टतम संख्या का चयन करते हुए कई कार्यों को समवर्ती रूप से निष्पादित करते हैं। लाइब्रेरी के लिए ग्राहक किसी भी संख्या में क्रमिक पंक्ति भी बना सकता है, जो एक बार में सबमिट किए गए पंक्ति में कार्यों को निष्पादित करता है।<ref name=OSConcepts /> चूंकि क्रमिक पंक्ति एक समय में केवल एक कार्य चला सकती है,पंक्ति में सबमिट किया गया प्रत्येक कार्य पंक्ति पर अन्य कार्यों के संबंध में महत्वपूर्ण है, और इस प्रकार एक क्रमिक पंक्ति का उपयोग आलोचनात्मक संसाधन पर लॉक (कंप्यूटर विज्ञान) लगाने के अतिरिक्त किया जा सकता है। | ||
* डिस्पैच स्रोत ऐसी वस्तुएं हैं जो क्लाइंट को ब्लॉक या फ़ंक्शंस को सिस्टम घटना पर अतुल्यकालिक रूप से निष्पादित करने के लिए पंजीकृत करने की अनुमति देती हैं, जैसे कि [[यूनिक्स डोमेन सॉकेट]] या [[फाइल डिस्क्रिप्टर]] पढ़ने या लिखने के लिए तैयार है, या एक PओएसIX [[सिग्नल (कंप्यूटिंग)]]। | * डिस्पैच स्रोत ऐसी वस्तुएं हैं जो क्लाइंट को ब्लॉक या फ़ंक्शंस को सिस्टम घटना पर अतुल्यकालिक रूप से निष्पादित करने के लिए पंजीकृत करने की अनुमति देती हैं, जैसे कि [[यूनिक्स डोमेन सॉकेट]] या [[फाइल डिस्क्रिप्टर]] पढ़ने या लिखने के लिए तैयार है, या एक PओएसIX [[सिग्नल (कंप्यूटिंग)]]। | ||
* डिस्पैच ग्रुप ऐसे ऑब्जेक्ट हैं जो कई कार्यों को पश्चात में शामिल होने के लिए समूहीकृत करने की अनुमति देते हैं। समूह के सदस्य के रूप में | * डिस्पैच ग्रुप ऐसे ऑब्जेक्ट हैं जो कई कार्यों को पश्चात में शामिल होने के लिए समूहीकृत करने की अनुमति देते हैं। समूह के सदस्य के रूप में कार्यपंक्तिमें जोड़े जा सकते हैं, और तब ग्राहक समूह ऑब्जेक्ट का उपयोग उस समूह के सभी कार्यों के पूरा होने तक प्रतीक्षा करने के लिए कर सकता है। | ||
* डिस्पैच सेमाफोर ऐसी वस्तुएं हैं जो क्लाइंट को एक साथ निष्पादित करने के लिए केवल कुछ निश्चित कार्यों की अनुमति देती हैं। | * डिस्पैच सेमाफोर ऐसी वस्तुएं हैं जो क्लाइंट को एक साथ निष्पादित करने के लिए केवल कुछ निश्चित कार्यों की अनुमति देती हैं। | ||
Line 66: | Line 66: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
यहाँ, कॉल करने के लिए <code>[myDoc analyze]</code> एक अज्ञात कार्यक्रम के अंदर रखा जाता है, जिसे पश्चात में वैश्विक समवर्ती क्रमों में से एक पर रखा जाता है। इसके चलने के पश्चात <code>[myDoc analyze]</code>, | यहाँ, कॉल करने के लिए <code>[myDoc analyze]</code> एक अज्ञात कार्यक्रम के अंदर रखा जाता है, जिसे पश्चात में वैश्विक समवर्ती क्रमों में से एक पर रखा जाता है। इसके चलने के पश्चात <code>[myDoc analyze]</code>, मुख्यपंक्ति(जिस पर एप्लिकेशन का मुख्य थ्रेड चलता है) पर एक नया ब्लॉक रखा गया है, जो [[GUI]] को अपडेट करता है (यह आवश्यक है क्योंकि GUI को केवल मुख्य थ्रेड द्वारा अपडेट किया जा सकता है)। इन दो छोटे बदलावों को करके, डेवलपर ने उपयोगकर्ता द्वारा देखे गए एप्लिकेशन के संभावित स्टाल से बचा लिया है, और अपने एप्लिकेशन को हार्डवेयर संसाधनों का बेहतर उपयोग करने की अनुमति दी है। | ||
दूसरा उदाहरण for लूप को समानांतर करने का है: | दूसरा उदाहरण for लूप को समानांतर करने का है: | ||
Line 84: | Line 84: | ||
total = summarize(results, count); | total = summarize(results, count); | ||
</syntaxhighlight> | </syntaxhighlight> | ||
यहाँ, <code>dispatch_apply</code> इसे दिए गए ब्लॉक को चलाता है, <code>count</code> समय, प्रत्येक मंगलाचरण को एक | यहाँ, <code>dispatch_apply</code> इसे दिए गए ब्लॉक को चलाता है, <code>count</code> समय, प्रत्येक मंगलाचरण को एक वैश्विकपंक्तिमें रखना, और प्रत्येक आह्वान को 0 से एक अलग संख्या में पारित करना <code>count</code>-1। यह ओएस को कार्य को फैलाने की इजाजत देगा क्योंकि यह फिट दिखता है, मौजूदा हार्डवेयर और सिस्टम लोड के लिए चलने वाले धागे की इष्टतम संख्या चुनता है। <code>dispatch_apply</code> यह तब तक वापस नहीं आता जब तक कि दी गईपंक्तिमें रखे गए सभी ब्लॉकों का निष्पादन पूरा नहीं हो जाता, ताकि यह गारंटी दी जा सके कि कॉल करने से पहले मूल लूप के अंदर सभी कार्य पूरे हो गए हैं <code>summarize</code>. | ||
प्रोग्रामर उन कार्यों के लिए अपनी खुद की | प्रोग्रामर उन कार्यों के लिए अपनी खुद की क्रमिक क्रमें बना सकते हैं जिन्हें वे जानते हैं कि उन्हें क्रमिक रूप से चलना चाहिए लेकिन जिन्हें एक अलग थ्रेड पर निष्पादित किया जा सकता है। एक नईपंक्तिइस प्रकार बनाई जाएगी: | ||
<syntaxhighlight lang="c"> | <syntaxhighlight lang="c"> | ||
Line 116: | Line 116: | ||
== आंतरिक == | == आंतरिक == | ||
जीसीडी को लिबडिस्पैच द्वारा कार्यान्वित किया गया है, एप्पल द्वारा विकसित pthreads गैर-POSIX एक्सटेंशन के समर्थन से। जीसीडी (10.6), माउंटेन लायन (10.8) और मावेरिक्स (10.9) के आधिकारिक लॉन्च के माध्यम से एप्पल ने अपनी स्थापना के पश्चात से (ओएस X 10.5 में) इंटरफ़ेस बदल दिया है। नवीनतम परिवर्तनों में उपयोगकर्ता मोड और कर्नेल दोनों में pthreads का समर्थन करने वाले कोड बनाना शामिल है, निजी (कर्नेल pthread समर्थन के साथ केवल शिम्स तक कम हो गया है, और वास्तविक | जीसीडी को लिबडिस्पैच द्वारा कार्यान्वित किया गया है, एप्पल द्वारा विकसित pthreads गैर-POSIX एक्सटेंशन के समर्थन से। जीसीडी (10.6), माउंटेन लायन (10.8) और मावेरिक्स (10.9) के आधिकारिक लॉन्च के माध्यम से एप्पल ने अपनी स्थापना के पश्चात से (ओएस X 10.5 में) इंटरफ़ेस बदल दिया है। नवीनतम परिवर्तनों में उपयोगकर्ता मोड और कर्नेल दोनों में pthreads का समर्थन करने वाले कोड बनाना शामिल है, निजी (कर्नेल pthread समर्थन के साथ केवल शिम्स तक कम हो गया है, और वास्तविक कार्यपंक्तिकार्यान्वयन एक अलग कर्नेल एक्सटेंशन में चला गया है)।<ref name="GCD Internals">{{cite web |url=http://newosxbook.com/articles/GCD.html |title=GCD Internals: The undocumented side of the Grand Central Dispatcher |last1=Levin |first1=Jonathan |date=15 February 2014 |access-date=17 March 2014}}</ref> | ||
अन्य प्रणालियों पर, लिबडिस्पैच सिस्टम की स्वयं की घटना सुविधाओं (epoll, kevent, या Windows NT) का उपयोग करके अपने स्वयं के | अन्य प्रणालियों पर, लिबडिस्पैच सिस्टम की स्वयं की घटना सुविधाओं (epoll, kevent, या Windows NT) का उपयोग करके अपने स्वयं के कार्यपंक्तिको लागू करता है। मैकOS पर, kevent का उपयोग कर्नेल कार्यपंक्तिके साथ किया जाता है। | ||
== यह भी देखें == | == यह भी देखें == |
Revision as of 18:16, 12 March 2023
This article relies excessively on references to primary sources. (जून 2010) (Learn how and when to remove this template message) |
GCD | |
Original author(s) | Dave Zarzycki |
---|---|
Developer(s) | Apple Inc. |
Operating system | Mac OS X 10.6 (2009) and later, iOS 4.0 and later,[1] watchOS, tvOS, FreeBSD |
Type | System Utility |
License | Apache 2.0 |
Website | https://apple.github.io/swift-corelibs-libdispatch/ |
ग्रैंड सेंट्रल डिस्पैच (जीसीडी या लिबडिस्पैच), मल्टी-कोर (कम्प्यूटिंग) | मल्टी-कोर प्रोसेसर और अन्य सममितीय मल्टीप्रोसेसिंग सिस्टम वाले सिस्टम के लिए एप्लिकेशन सपोर्ट को अनुकूलित करने के लिए एप्पल इनकॉरपोरेटेड द्वारा विकसित एक विधि है।।[2] यह थ्रेड पूल पैटर्न के आधार पर कार्य समानता का क्रियान्वयन है। मौलिक विचार थ्रेड पूल के प्रबंधन को डेवलपर के हाथों से बाहर और ऑपरेटिंग सिस्टम के निकट ले जाना है। डेवलपर पूल के वास्तु-कला से निश्चिंत हो कर कार्य के पैकेज को पूल में इंजेक्ट करता है। यह मॉडल सरलता, सुवाह्यता और प्रदर्शन में सुधार करता है।
जीसीडी को सबसे पहले मैकओएस X 10.6 के साथ रिलीज़ किया गया था, और यह आईओएस (एप्पल) 4 और इसके पश्चात के संस्करण के साथ भी उपलब्ध है। ग्रैंड सेंट्रल डिस्पैच शीर्षकभव्य केन्द्रीय टर्मिनल का एक संदर्भ है।
लाइब्रेरी के लिए स्रोत कोड जो जीसीडी की सेवाओं का कार्यान्वयन प्रदान करता है, लिबडिस्पैच, एप्पल द्वारा 10 सितंबर, 2009 को अपाचे लाइसेंस के अनुसार जारी किया गया था।[3] इसे पोर्ट किया गया है[4] फ्रीबीएसडी 8.1+ के लिए,[5] मिडनाइटबीएसडी 0.3+,[6] लिनक्स, और सोलारिस।[7][8] 2011 में विंडोज़ पर लिबडिस्पैच कार्य करने के प्रयासों को प्रतिकूल में विलय नहीं किया गया था।[9][10] सफारी और आईट्यून्स के साथ भेजे गए विंडोज के लिए एप्पल के पास लिबडिस्पैच.dll का अपना पोर्ट है, लेकिन कोईसॉफ़्टवेयर विकास किट प्रदान नहीं किया गया है।
2017 के पश्चात से, निक हचिंसन द्वारा आतिथेय किया गया मूल लिबडिस्पैच रिपॉजिटरी[11] जून 2016 में बनाए गए स्विफ्ट (प्रोग्रामिंग भाषा) कोर लाइब्रेरी का भाग है जो एक संस्करण के पक्ष में हटा दिया गया था। नया संस्करण अधिक प्लेटफार्मों का समर्थन करता है, विशेष रूप से विंडोज सहित।
डिजाइन
जीसीडी एक प्रोग्राम में विशिष्ट कार्य (कंप्यूटिंग) की अनुमति देकर कार्य करता है जिसे निष्पादन के लिए क्रमबद्ध करने के लिए समानांतर में चलाया जा सकता है और प्रसंस्करण संसाधनों की उपलब्धता के आधार पर, उन्हें किसी भी उपलब्ध प्रोसेसर कोर पर निष्पादित करने के लिए शेड्यूलिंग (कंप्यूटिंग) किया जाता है।[12][13] (एप्पल द्वारा मार्ग के रूप में संदर्भित)।[14]
एक कार्य या तो एक कार्यक्रम के रूप में या एक ब्लॉक (सी भाषा विस्तार) के रूप में व्यक्त किया जा सकता है।[15] ब्लॉक सी (प्रोग्रामिंग भाषा) , सी ++, और ऑब्जेक्टिव सी प्रोग्रामिंग लैंग्वेज के वाक्य-विन्यास का एक विस्तार है जो एक क्लोजर (कंप्यूटर साइंस) के समान एक ऑब्जेक्ट में कोड और डेटा को एनकैप्सुलेट करता है।[12] जीसीडी अभी भी उन परिस्थिति में उपयोग किया जा सकता है जहां ब्लॉक उपलब्ध नहीं हैं।[16]
ग्रैंड सेंट्रल डिस्पैच अभी भी निम्न स्तर पर थ्रेड्स का उपयोग करता है लेकिन उन्हें प्रोग्रामर से दूर कर देता है, जिन्हें अधिक विवरणों से चिंतित होने की आवश्यकता नहीं होगी। जीसीडी में कार्य बनाने और क्रमबद्ध करने में सहज होते हैं; एप्पल का कहना है कि जीसीडी में कार्य इकाई को पंक्तिबद्ध करने के लिए 15 निर्देशों की आवश्यकता होती है, जबकि पारंपरिक थ्रेड बनाने के लिए सरलता से कई सौ निर्देशों की आवश्यकता हो सकती है।[12]
ग्रैंड सेंट्रल डिस्पैच में एक कार्य का उपयोग या तोपंक्तिमें रखा गया कार्य विषय बनाने के लिए किया जा सकता है या इसे किसी घटना स्रोत को निर्दिष्ट किया जा सकता है। यदि किसी घटना स्रोत को कोई कार्य निर्दिष्ट गया है, तो घटना ट्रिगर होने पर ब्लॉक या कार्यक्रम से कार्य इकाई बनाई जाती है, और कार्य इकाई को उचित पंक्ति में रखा जाता है। यह एप्पल द्वारा एक थ्रेड बनाने की तुलना में अधिक कुशल के रूप में वर्णित किया गया है जिसका एकमात्र उद्देश्य ट्रिगरिंग के एकल घटना पर प्रतीक्षा करना है।
विशेषताएं
डिस्पैच रूपरेखा उन्हें बनाने और संचालित करने के लिए कई डेटा प्रकारों और कार्यों की घोषणा करता है:
- प्रेषण पंक्ति ऐसी वस्तुएं हैं जो कार्यों की पंक्ति बनाए रखती हैं, या तो अज्ञात कोड ब्लॉक या कार्यक्रम, और इन कार्यों को अपने पंक्ति में निष्पादित करती हैं। लाइब्रेरी स्वचालित रूप से विभिन्न प्राथमिकता स्तरों के साथ कई क्रमें बनाता है जो संचालन परिस्थिति के आधार पर चलने के लिए इष्टतम संख्या का चयन करते हुए कई कार्यों को समवर्ती रूप से निष्पादित करते हैं। लाइब्रेरी के लिए ग्राहक किसी भी संख्या में क्रमिक पंक्ति भी बना सकता है, जो एक बार में सबमिट किए गए पंक्ति में कार्यों को निष्पादित करता है।[13] चूंकि क्रमिक पंक्ति एक समय में केवल एक कार्य चला सकती है,पंक्ति में सबमिट किया गया प्रत्येक कार्य पंक्ति पर अन्य कार्यों के संबंध में महत्वपूर्ण है, और इस प्रकार एक क्रमिक पंक्ति का उपयोग आलोचनात्मक संसाधन पर लॉक (कंप्यूटर विज्ञान) लगाने के अतिरिक्त किया जा सकता है।
- डिस्पैच स्रोत ऐसी वस्तुएं हैं जो क्लाइंट को ब्लॉक या फ़ंक्शंस को सिस्टम घटना पर अतुल्यकालिक रूप से निष्पादित करने के लिए पंजीकृत करने की अनुमति देती हैं, जैसे कि यूनिक्स डोमेन सॉकेट या फाइल डिस्क्रिप्टर पढ़ने या लिखने के लिए तैयार है, या एक PओएसIX सिग्नल (कंप्यूटिंग)।
- डिस्पैच ग्रुप ऐसे ऑब्जेक्ट हैं जो कई कार्यों को पश्चात में शामिल होने के लिए समूहीकृत करने की अनुमति देते हैं। समूह के सदस्य के रूप में कार्यपंक्तिमें जोड़े जा सकते हैं, और तब ग्राहक समूह ऑब्जेक्ट का उपयोग उस समूह के सभी कार्यों के पूरा होने तक प्रतीक्षा करने के लिए कर सकता है।
- डिस्पैच सेमाफोर ऐसी वस्तुएं हैं जो क्लाइंट को एक साथ निष्पादित करने के लिए केवल कुछ निश्चित कार्यों की अनुमति देती हैं।
Libdispatch अपने स्वयं के ऑब्जेक्ट मॉडल, ओएस ऑब्जेक्ट के साथ आता है, जो आंशिक रूप से Objective-C मॉडल के साथ संगत है। नतीजतन, इसकी वस्तुओं को ओबीजेसी वस्तुओं के लिए टोल-फ्री ब्रिज किया जा सकता है।[17]
उदाहरण
This article is written like a manual or guidebook. (June 2010) (Learn how and when to remove this template message) |
ग्रैंड सेंट्रल डिस्पैच के उपयोग को प्रदर्शित करने वाले दो उदाहरण जॉन सिराकुसा की आर्स टेक्निका स्नो लेपर्ड समीक्षा में देखे जा सकते हैं।[18] प्रारंभ में, एक दस्तावेज़-आधारित एप्लिकेशन में एक विधि होती है, जिसे कहा जाता है analyzeDocument
जो दस्तावेज़ में शब्दों और अनुच्छेदों की संख्या गिनने जैसा कुछ कर सकता है। आम तौर पर, यह एक त्वरित प्रक्रिया होगी, और उपयोगकर्ता को बटन दबाने और परिणाम दिखाने के बीच देरी के बिना मुख्य धागे में निष्पादित किया जा सकता है।
- (IBAction)analyzeDocument:(NSButton *)sender {
NSDictionary *stats = [myDoc analyze];
[myModel setDict:stats];
[myStatsView setNeedsDisplay:YES];
}
यदि दस्तावेज़ बड़ा है और विश्लेषण को निष्पादित करने में लंबा समय लगता है तो मुख्य थ्रेड कार्यक्रम के समाप्त होने की प्रतीक्षा करेगा। यदि इसमें पर्याप्त समय लगता है, तो उपयोगकर्ता नोटिस करेगा, और एप्लिकेशन घूमता हुआ पहिया भी कर सकता है। समाधान यहाँ देखा जा सकता है:
- (IBAction)analyzeDocument:(NSButton *)sender {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSDictionary *stats = [myDoc analyze];
dispatch_async(dispatch_get_main_queue(), ^{
[myModel setDict:stats];
[myStatsView setNeedsDisplay:YES];
});
});
}
यहाँ, कॉल करने के लिए [myDoc analyze]
एक अज्ञात कार्यक्रम के अंदर रखा जाता है, जिसे पश्चात में वैश्विक समवर्ती क्रमों में से एक पर रखा जाता है। इसके चलने के पश्चात [myDoc analyze]
, मुख्यपंक्ति(जिस पर एप्लिकेशन का मुख्य थ्रेड चलता है) पर एक नया ब्लॉक रखा गया है, जो GUI को अपडेट करता है (यह आवश्यक है क्योंकि GUI को केवल मुख्य थ्रेड द्वारा अपडेट किया जा सकता है)। इन दो छोटे बदलावों को करके, डेवलपर ने उपयोगकर्ता द्वारा देखे गए एप्लिकेशन के संभावित स्टाल से बचा लिया है, और अपने एप्लिकेशन को हार्डवेयर संसाधनों का बेहतर उपयोग करने की अनुमति दी है।
दूसरा उदाहरण for लूप को समानांतर करने का है:
for (i = 0; i < count; i++) {
results[i] = do_work(data, i);
}
total = summarize(results, count);
यह कोड चलाता है do_work
समारोह count
बार, i असाइन करनाth आई के परिणामth सरणी में तत्व results
, और उसके पश्चात लूप समाप्त होने के पश्चात सरणी पर सारांशित करें। दुर्भाग्य से कार्य की गणना क्रमिक रूप से की जाती है, जहाँ इसकी आवश्यकता नहीं हो सकती है। यह मानते हुए कि do_work इसे किए गए किसी भी अन्य कॉल के परिणामों पर भरोसा नहीं करता है, ऐसा कोई कारण नहीं है कि इन कॉलों को एक साथ नहीं किया जा सकता है। जीसीडी में यह कैसे किया जाएगा:
dispatch_apply(count, dispatch_get_global_queue(0, 0), ^(size_t i){
results[i] = do_work(data, i);
});
total = summarize(results, count);
यहाँ, dispatch_apply
इसे दिए गए ब्लॉक को चलाता है, count
समय, प्रत्येक मंगलाचरण को एक वैश्विकपंक्तिमें रखना, और प्रत्येक आह्वान को 0 से एक अलग संख्या में पारित करना count
-1। यह ओएस को कार्य को फैलाने की इजाजत देगा क्योंकि यह फिट दिखता है, मौजूदा हार्डवेयर और सिस्टम लोड के लिए चलने वाले धागे की इष्टतम संख्या चुनता है। dispatch_apply
यह तब तक वापस नहीं आता जब तक कि दी गईपंक्तिमें रखे गए सभी ब्लॉकों का निष्पादन पूरा नहीं हो जाता, ताकि यह गारंटी दी जा सके कि कॉल करने से पहले मूल लूप के अंदर सभी कार्य पूरे हो गए हैं summarize
.
प्रोग्रामर उन कार्यों के लिए अपनी खुद की क्रमिक क्रमें बना सकते हैं जिन्हें वे जानते हैं कि उन्हें क्रमिक रूप से चलना चाहिए लेकिन जिन्हें एक अलग थ्रेड पर निष्पादित किया जा सकता है। एक नईपंक्तिइस प्रकार बनाई जाएगी:
dispatch_queue_t exampleQueue;
exampleQueue = dispatch_queue_create( "com.example.unique.identifier", NULL );
// exampleQueue may be used here.
dispatch_release( exampleQueue );
क्रम पर एक डिस्पैच किए गए ब्लॉक से बचने के लिए सावधानी बरती जानी चाहिए क्योंकि यह गतिरोध की गारंटी है। ऐसा कोड निम्न कार्य कर सकता है:
dispatch_queue_t exampleQueue = dispatch_queue_create( "com.example.unique.identifier", NULL );
dispatch_sync( exampleQueue, ^{
dispatch_sync( exampleQueue, ^{
printf( "I am now deadlocked...\n" );
});
});
dispatch_release( exampleQueue );
अनुप्रयोग
जीसीडी का उपयोग पूरे macओएस (10.6 स्नो लेपर्ड से शुरू) में किया जाता है, और एप्पल ने macओएस एप्लिकेशन डेवलपर्स द्वारा इसे अपनाने के लिए प्रोत्साहित किया है। FreeBSD डेवलपर रॉबर्ट वाटसन (कंप्यूटर वैज्ञानिक) ने 11 मई, 2010 को अपाचे जीसीडी MPM (मल्टी-प्रोसेसिंग मॉड्यूल) के माध्यम से जीसीडी का उपयोग करने के लिए एक प्रमुख ओपन सोर्स एप्लिकेशन, अपाचे HTTP सर्वर के पहले अनुकूलन की घोषणा की, ताकि प्रोग्रामिंग को स्पष्ट किया जा सके। मॉडल और जीसीडी को मौजूदा, बड़े पैमाने पर बहु-थ्रेडेड, अनुप्रयोगों में कैसे एकीकृत किया जाए। उनकी घोषणा ने देखा कि जीसीडी एमपीएम में अन्य थ्रेडेड एमपीएम के रूप में लाइनों की संख्या एक तिहाई से आधी थी।[19][20]
आंतरिक
जीसीडी को लिबडिस्पैच द्वारा कार्यान्वित किया गया है, एप्पल द्वारा विकसित pthreads गैर-POSIX एक्सटेंशन के समर्थन से। जीसीडी (10.6), माउंटेन लायन (10.8) और मावेरिक्स (10.9) के आधिकारिक लॉन्च के माध्यम से एप्पल ने अपनी स्थापना के पश्चात से (ओएस X 10.5 में) इंटरफ़ेस बदल दिया है। नवीनतम परिवर्तनों में उपयोगकर्ता मोड और कर्नेल दोनों में pthreads का समर्थन करने वाले कोड बनाना शामिल है, निजी (कर्नेल pthread समर्थन के साथ केवल शिम्स तक कम हो गया है, और वास्तविक कार्यपंक्तिकार्यान्वयन एक अलग कर्नेल एक्सटेंशन में चला गया है)।[21] अन्य प्रणालियों पर, लिबडिस्पैच सिस्टम की स्वयं की घटना सुविधाओं (epoll, kevent, या Windows NT) का उपयोग करके अपने स्वयं के कार्यपंक्तिको लागू करता है। मैकOS पर, kevent का उपयोग कर्नेल कार्यपंक्तिके साथ किया जाता है।
यह भी देखें
- कार्य समानांतर लाइब्रेरी
- जावा समवर्ती
- ओपनएमपी
- थ्रेडिंग बिल्डिंग ब्लॉक्स (टीबीबी)
संदर्भ
- ↑ "Grand Central Dispatch (GCD) Reference". Apple Inc.
- ↑ Apple Previews Mac OS X Snow Leopard to Developers Archived March 18, 2012, at the Wayback Machine, June 9, 2008.
- ↑ "ग्रैंड सेंट्रल डिस्पैच". apple.github.io.
- ↑ "GCD libdispatch w/Blocks support working on FreeBSD". Archived from the original on July 27, 2011. Retrieved September 28, 2009.
- ↑ "FreeBSD तिमाही स्थिति रिपोर्ट". www.freebsd.org.
- ↑ "libdispatch". Just Journal.
- ↑ libdispatch mailing list: "Porting status Linux" April 10, 2011
- ↑ libdispatch mailing list: "Porting status Solaris x86/64" April 10, 2011
- ↑ libdispatch mailing list: "libdispatch for Win32" April 22, 2011
- ↑ libdispatch mailing list: "Updates regarding the status of libdispatch on Windows" May 5, 2011
- ↑ Hutchinson, Nicholas (10 January 2020). "libdispatch". GitHub. Retrieved 15 January 2020.
- ↑ 12.0 12.1 12.2 "ग्रैंड सेंट्रल डिस्पैच पर एप्पल टेक्निकल ब्रीफ" (PDF). Archived from the original on September 20, 2009. Retrieved September 12, 2009.
{{cite web}}
: CS1 maint: bot: original URL status unknown (link) - ↑ 13.0 13.1 Gagne, Abraham Silberschatz, Peter Baer Galvin, Greg (2013). ऑपरेटिंग सिस्टम की अवधारणाएँ (9th ed.). Hoboken, N.J.: Wiley. pp. 182–183. ISBN 9781118063330.
{{cite book}}
: CS1 maint: multiple names: authors list (link) - ↑ "WWDC 2008: New in Mac OS X Snow Leopard". Archived from the original on October 17, 2008. Retrieved June 18, 2008.
- ↑ "ग्रैंड सेंट्रल डिस्पैच (जीसीडी) संदर्भ". Retrieved September 13, 2009.
- ↑ "GrandCentralDispatch - FreeBSD Wiki".
- ↑ Bugaev, Sergey. "मच-ओ लिंकिंग और लोडिंग ट्रिक्स". Darling development blog. Retrieved 15 January 2020.
- ↑ Mac OS X 10.6 Snow Leopard: the Ars Technica review (accessed September 2, 2009)
- ↑ libdispatch-dev GCD MPM for Apache (accessed May 14, 2010)
- ↑ apache-libdispatch (accessed May 14, 2010)
- ↑ Levin, Jonathan (15 February 2014). "GCD Internals: The undocumented side of the Grand Central Dispatcher". Retrieved 17 March 2014.