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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

यह भी देखें

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

बाहरी संबंध

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