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

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

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

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

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

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

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

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

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

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

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

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

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

यहाँ, कॉल करने के लिए  एक अज्ञात कार्यक्रम के अंदर रखा जाता है, जिसे पश्चात में वैश्विक समवर्ती क्रमों में से एक पर रखा जाता है। इसके चलने के पश्चात , मुख्यपंक्ति(जिस पर एप्लिकेशन का मुख्य थ्रेड चलता है) पर एक नया ब्लॉक रखा गया है, जो 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