ग्रैंड सेंट्रल डिस्पैच

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

जीसीडी को सबसे पहले मैकओएस X 10.6 के साथ रिलीज़ किया गया था, और यह आईओएस (एप्पल) 4 और इसके पश्चात के संस्करण के साथ भी उपलब्ध है। ग्रैंड सेंट्रल डिस्पैच शीर्षक भव्य केन्द्रीय टर्मिनल का एक संदर्भ है।

पुस्तकालय के लिए स्रोत कोड जो जीसीडी की सेवाओं का कार्यान्वयन प्रदान करता है, लिबडिस्पैच, एप्पल द्वारा 10 सितंबर, 2009 को अपाचे लाइसेंस के अनुसार जारी किया गया था। इसे पोर्ट किया गया है फ्रीबीएसडी 8.1+ के लिए, मिडनाइटबीएसडी 0.3+, लिनक्स, और सोलारिस। 2011 में विंडोज़ पर लिबडिस्पैच कार्य करने के प्रयासों को प्रतिकूल में विलय नहीं किया गया था।  सफारी और आईट्यून्स के साथ भेजे गए विंडोज के लिए एप्पल के पास लिबडिस्पैच.dll का अपना पोर्ट है, लेकिन कोई सॉफ़्टवेयर विकास किट  प्रदान नहीं किया गया है।

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

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

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

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

Libdispatch अपने स्वयं के ऑब्जेक्ट मॉडल, ओएस ऑब्जेक्ट के साथ आता है, जो आंशिक रूप से Objective-C मॉडल के साथ संगत है। नतीजतन, इसकी वस्तुओं को ओबीजेसी वस्तुओं के लिए टोल-फ्री ब्रिज किया जा सकता है।

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

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

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

दूसरा उदाहरण for लूप को समानांतर करने का है:

यह कोड चलाता है  समारोह   बार, i असाइन करनाth आई के परिणामth सरणी में तत्व , और उसके पश्चात लूप समाप्त होने के पश्चात सरणी पर सारांशित करें। दुर्भाग्य से कार्य की गणना क्रमिक रूप से की जाती है, जहाँ इसकी आवश्यकता नहीं हो सकती है। यह मानते हुए कि do_work इसे किए गए किसी भी अन्य कॉल के परिणामों पर भरोसा नहीं करता है, ऐसा कोई कारण नहीं है कि इन कॉलों को एक साथ नहीं किया जा सकता है। जीसीडी में यह कैसे किया जाएगा:

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

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

क्रम पर एक डिस्पैच किए गए ब्लॉक से बचने के लिए सावधानी बरती जानी चाहिए क्योंकि यह गतिरोध की गारंटी है। ऐसा कोड निम्न कार्य कर सकता है:

अनुप्रयोग
जीसीडी का उपयोग पूरे macओएस (10.6 स्नो लेपर्ड से शुरू) में किया जाता है, और एप्पल ने macओएस एप्लिकेशन डेवलपर्स द्वारा इसे अपनाने के लिए प्रोत्साहित किया है। FreeBSD डेवलपर रॉबर्ट वाटसन (कंप्यूटर वैज्ञानिक) ने 11 मई, 2010 को अपाचे जीसीडी MPM (मल्टी-प्रोसेसिंग मॉड्यूल) के माध्यम से जीसीडी का उपयोग करने के लिए एक प्रमुख ओपन सोर्स एप्लिकेशन, अपाचे HTTP सर्वर के पहले अनुकूलन की घोषणा की, ताकि प्रोग्रामिंग को स्पष्ट किया जा सके। मॉडल और जीसीडी को मौजूदा, बड़े पैमाने पर बहु-थ्रेडेड, अनुप्रयोगों में कैसे एकीकृत किया जाए। उनकी घोषणा ने देखा कि जीसीडी एमपीएम में अन्य थ्रेडेड एमपीएम के रूप में लाइनों की संख्या एक तिहाई से आधी थी।

आंतरिक
जीसीडी को लिबडिस्पैच द्वारा कार्यान्वित किया गया है, एप्पल द्वारा विकसित pthreads गैर-POSIX एक्सटेंशन के समर्थन से। जीसीडी (10.6), माउंटेन लायन (10.8) और मावेरिक्स (10.9) के आधिकारिक लॉन्च के माध्यम से एप्पल ने अपनी स्थापना के पश्चात से (ओएस X 10.5 में) इंटरफ़ेस बदल दिया है। नवीनतम परिवर्तनों में उपयोगकर्ता मोड और कर्नेल दोनों में pthreads का समर्थन करने वाले कोड बनाना शामिल है, निजी (कर्नेल pthread समर्थन के साथ केवल शिम्स तक कम हो गया है, और वास्तविक कार्य क्रम कार्यान्वयन एक अलग कर्नेल एक्सटेंशन में चला गया है)। अन्य प्रणालियों पर, लिबडिस्पैच सिस्टम की स्वयं की ईवेंट सुविधाओं (epoll, kevent, या Windows NT) का उपयोग करके अपने स्वयं के वर्कक्यू को लागू करता है। मैकOS पर, kevent का उपयोग कर्नेल वर्कक्यू के साथ किया जाता है।

यह भी देखें

 * कार्य समानांतर पुस्तकालय
 * जावा समवर्ती
 * ओपनएमपी
 * थ्रेडिंग बिल्डिंग ब्लॉक्स (टीबीबी)

बाहरी संबंध

 * जीसीडी project on GitHub
 * जीसीडी Reference from the मैक Developer Library
 * The Introducing Blocks and Grand Central Dispatch article from the मैक Developer Library