क्या गो-लैंग्स गोरोइन पूल केवल हरे धागे हैं?


47

यहाँ टिप्पणीकार हरे धागे की निम्नलिखित आलोचना प्रस्तुत करता है:

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

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

एक और आलोचना यहाँ है :

एक एकल प्रक्रिया में कई थ्रेड्स को फैंकने से बहुत सारी समस्याएं होती हैं। उनमें से एक यह है कि सभी फेक थ्रेड्स किसी भी पृष्ठ दोष पर स्टाल करते हैं।

- मेरा प्रश्न है कर रहे हैं जाने के लैंग के goroutines (एक डिफ़ॉल्ट पूल के लिए) सिर्फ हरे धागे? यदि हां - तो क्या वे ऊपर की आलोचनाओं को संबोधित करते हैं?

जवाबों:


67

मैं केवल एक आकस्मिक उपयोगकर्ता हूं, इसलिए नमक के एक दाने के साथ निम्नलिखित लें।

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

गो (या वास्तव में दो मौजूदा कार्यान्वयन) केवल मूल कोड का उत्पादन करने वाली भाषा है - यह एक वीएम का उपयोग नहीं करता है। इसके अलावा, वर्तमान रनटाइम कार्यान्वयन में अनुसूचक OS स्तर के थ्रेड्स पर निर्भर करता है (तब भी जब GOMAXPROCS = 1)। इसलिए मुझे लगता है कि गो मॉडल के लिए हरे धागे के बारे में बात करना थोड़ा अपमानजनक है।

गो लोगों ने विशेष रूप से अन्य संगामिति तंत्रों (जैसे कोरआउट या थ्रेड्स या हल्के प्रक्रियाओं) के साथ भ्रम से बचने के लिए गोरोइनिन शब्द गढ़ा है।

बेशक, गो एक एम: एन थ्रेडिंग मॉडल का समर्थन करता है, लेकिन जावा ग्रीन मॉडल मॉडल की तुलना में यह एरलांग प्रक्रिया मॉडल के अधिक करीब दिखता है।

हरे धागे पर गो मॉडल के कुछ लाभ यहां दिए गए हैं (जैसा कि जल्दी JVM में लागू किया गया है):

  • डेवलपर के लिए पारदर्शी तरीके से एकाधिक कोर या सीपीयू का प्रभावी ढंग से उपयोग किया जा सकता है। गो के साथ, डेवलपर को कंसीडर का ध्यान रखना चाहिए। गो रनटाइम समानता का ख्याल रखेगा। जावा ग्रीन थ्रेड्स कार्यान्वयन कई कोर या सीपीयू से अधिक नहीं था।

  • सिस्टम और C कॉल शेड्यूलर के लिए नॉन ब्लॉकिंग हैं (सभी सिस्टम कॉल, न केवल मल्टीप्लेज्ड I / Os को इवेंट लूप में सपोर्ट करने वाले)। जब ब्लॉकिंग सिस्टम कॉल किया गया था, तो ग्रीन थ्रेड्स कार्यान्वयन पूरी प्रक्रिया को अवरुद्ध कर सकते हैं।

  • नकल या खंडित ढेर। गो में, गोरोइन के लिए अधिकतम स्टैक आकार प्रदान करने की आवश्यकता नहीं है। स्टैक आवश्यकतानुसार बढ़ता है। एक परिणाम यह है कि गोरोइन को बहुत अधिक मेमोरी (4KB-8KB) की आवश्यकता नहीं होती है, इसलिए उनमें से एक बड़ी संख्या खुशी से पैदा की जा सकती है। गोरोइन का उपयोग इसलिए व्यापक हो सकता है।

अब, आलोचनाओं को संबोधित करने के लिए:

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

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

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

तो IMO, गोरोइन्ट्स हरे धागे नहीं हैं, और गो भाषा और वर्तमान कार्यान्वयन ज्यादातर इन आलोचनाओं को संबोधित करते हैं।


1
प्रश्न के लिए एक उत्कृष्ट और विस्तृत प्रतिक्रिया :)
Tuxdude 5

1
मुझे यह उत्तर पसंद है, लेकिन क्या आपके पास ओएस-थ्रेड्स बनाने / बनाने के लिए कोई संदर्भ है?
लार्स

1
Go Language की सबसे बड़ी कमियों में से एक यह है कि यह हर ब्लॉकिंग सिस्टम कॉल के लिए एक कर्नेल थ्रेड बनाता है!
user1870400

8
ध्यान दें कि विकिपीडिया पर "हरे रंग के धागे" लेख को "थ्रेड्स जो एक रनटाइम लाइब्रेरी या वर्चुअल मशीन (वीएमएन)" द्वारा निर्धारित किया गया है, को राज्य में बदल दिया गया है ; जिसका अर्थ है कि उस परिभाषा से आपका उत्तर अब सही नहीं होगा, क्योंकि गो रनटाइम शेड्यूलिंग / प्रबंधन करता है। मुझे लगता है कि ओएस-थ्रेड के विपरीत उपयोगकर्ता-थ्रेड थ्रेड के रूप में हरे रंग के धागे को परिभाषित करना अधिक उपयोगी है। और फिर, हाँ, गोरोइटिन सुनिश्चित करने के लिए हरे रंग के धागे हैं।
10

1
2 कि @mknecht। यह वीएम के बारे में नहीं है, यह रनटाइम के बारे में है। और गो निश्चित रूप से एक रनटाइम है। (जो थ्रेडिंग मॉडल और कचरा संग्रह का प्रबंधन करता है)।
टिम हार्पर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.