ग्रीन थ्रेड क्यों नहीं?


33

जब तक मुझे पता है कि इस पर सवाल पहले से ही शामिल हैं (जैसे https://stackoverflow.com/questions/5713142/green-threads-vs-non-green-threads ), मुझे ऐसा नहीं लगता कि मुझे संतोषजनक उत्तर मिला है ।

सवाल यह है: जेवीएम का समर्थन अब हरे धागे क्यों नहीं?

यह कोड-शैली जावा FAQ पर यह कहता है :

एक हरे रंग का धागा जावा वर्चुअल मशीन (JVM) के लिए ऑपरेशन के एक मोड को संदर्भित करता है जिसमें सभी कोड एक ही ऑपरेटिंग सिस्टम थ्रेड में निष्पादित होते हैं।

और यह ओवर java.sun.com :

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

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

विचार?


5
मेरे लिए, सवाल लगता है: हरे धागे क्यों? कई प्रक्रियाओं के माध्यम से जेवीएम स्तर पर इसका अनुकरण करके मल्टीथ्रेडिंग को फिर से क्यों पेश किया जाए? यह बहुत दर्द होता है और प्रतीत होता है कि प्रोग्रामर को स्प्रेडिंग थ्रेड्स के साथ अधिक उदार होने की अनुमति देने के अलावा कोई लाभ नहीं है (और मुझे यकीन नहीं है कि यह एक फायदा है)।

4
खैर, यह एक समवर्ती प्रोग्रामिंग मॉडल के बारे में है जो तराजू है। वर्तमान में, जावा में, यदि आप स्केलेबिलिटी चाहते हैं तो आप अपने स्वयं के थ्रेड पूल के साथ एनआईओ पर स्विच करें। कम से कम, यह मेरी समझ है।
redjamjar

3
< Akka.io > जैसी चीजों की उपस्थिति जो हल्के धागों का समर्थन करती है, मुझे भी लगता है कि एक आवश्यकता है। वास्तव में, बस यहां काफी अच्छी चर्चा मिली < stackoverflow.com/questions/7458782/… >
redjamjar

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

JVM को सीधे देशी धागों का समर्थन करने में काफी समय लगा। तब तक ग्रीन थ्रेड्स मध्यवर्ती समाधान था।
थोरबजोरन रावन एंडरसन

जवाबों:


29

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

यह एक शर्म की बात है - हरे रंग के धागे एक बेहतर अमूर्तता प्रदान करते हैं, जिससे संगामिति एक उपयोगी उपकरण है जो एक ठोकर नहीं है। अगर कई बाधाओं को दूर नहीं किया जा सकता है लेकिन हरे रंग के धागे का कोई फायदा नहीं है:

  • उन्हें उपलब्ध सभी सीपीयू कोर का उपयोग करना चाहिए

  • संदर्भ स्विचिंग सस्ता होना चाहिए

  • आई / ओ किसी भी धागा यह करने में लगे हुए ब्लॉक कर सकते हैं, लेकिन नहीं किसी अन्य धागा और निश्चित रूप से अन्य सभी धागे, जो कुछ जल्दी कार्यान्वयन में मामला था नहीं।

मैंने अक्सर सोचा है कि जावा में मल्टी-थ्रेडिंग इतना कठिन क्यों है लेकिन अब यह स्पष्ट होता जा रहा है - यह अंततः मूल थ्रेड्स के स्विच के साथ करना था, जो हैं:

  • सभी सीपीयू कोर का उपयोग करने में अच्छा है

  • वास्तव में समवर्ती होने में अच्छा है, स्वतंत्र I / O आदि प्रदान करता है

  • संदर्भ स्विचिंग में धीमी गति से (सबसे अच्छे हरे धागे के कार्यान्वयन के साथ तुलना में)

  • स्मृति के साथ बुरी तरह से लालची, इसलिए उनमें से अधिकतम उपयोग करने योग्य संख्या को सीमित करना

  • वास्तविक दुनिया को व्यक्त करने के लिए किसी भी आधार के लिए एक खराब अमूर्त, जो निश्चित रूप से अत्यधिक समवर्ती है।

आजकल, बहुत से प्रोग्रामर का समय अब ​​नॉन-ब्लॉकिंग आई / ओ, फ्यूचर्स आदि को कोड करने में चला जाता है। यह एक बड़ी शर्म की बात है कि हमारे पास एब्सट्रैक्शन का बेहतर स्तर नहीं है।

तुलना के लिए, Erlang के अलावा नई Go भाषा विशाल संगामिति का अच्छा काम करती है। उन सभी का ग्रैंड-डैडी ऑकम बना हुआ है , अभी भी एक शोध परियोजना है।


कितनी बार हम आपके पोस्ट किए जाने के बाद से चले गए हैं: O
दिमित्री

3
काश, जंग एक और भाषा है जिसने बेहतर संगति सार को त्याग दिया। उन्होंने भी सहकारी धागों से देशी धागों की ओर बढ़ने का फैसला किया।
रिक -777

2
@ रिक -777 जंग ऐसा करने के लिए बहुत कम स्तर है।
माल्कम

15

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

आपके द्वारा सुझाया गया विकल्प, प्रक्रियाओं का एक पूल, कुछ फायदे और कुछ नुकसान हैं। सबसे बड़ा फायदा, 'थ्रेड्स' का अलगाव, वास्तव में आपको यहां ज्यादा नहीं मिलेगा। बड़े नुकसान, कार्यान्वयन की अत्यधिक कठिनाई और कम कुशल सिंक्रनाइज़ेशन, यहां सौदा-हत्यारा है।

हालाँकि, मैं मानता हूं कि कुछ एप्लिकेशन मौजूद हैं (जावा नहीं) जहां प्रक्रियाओं का एक पूल जो आप थ्रेड्स के पूल की तरह उपयोग कर सकते हैं (लेकिन अधिक अलगाव के साथ) एक बड़ी बात होगी। धागे सब कुछ बहुत ज्यादा साझा करते हैं। प्रक्रियाओं के साथ, आप विशेष रूप से चुन सकते हैं कि क्या साझा करना है। मेरी जानकारी के लिए, अभी तक इसे लागू करने के प्रयास में कोई नहीं गया है।


ओकाम इस पेशकश का दावा करता है। यह 80 के दशक में एक महत्वपूर्ण भाषा थी, लेकिन विकास के वित्त पोषण की कमी से ग्रस्त था और परिणामस्वरूप केवल एक अनुसंधान आला बन गया। लेकिन संगामिति पर इसके विचार अब उतने ही ठोस हैं, जितने तब थे और अभी तक नहीं सुधरे हैं।
रिक -777

यदि आप "मल्टी थ्रेडेड" ए ला गोलांग ("एम: एन" टाइप शेड्यूलिंग) कर रहे हैं तो सैद्धांतिक रूप से केवल एक हरे रंग के धागे को एक पेज की गलती से अवरुद्ध किया जाता है क्योंकि अन्य धागे "स्लैक उठा सकते हैं" (अन्य हरे रंग के धागे) लगता है। .. softwareengineering.stackexchange.com/questions/222642/...
rogerdpack

13

औसत जावा कोड के लिए कोई लाभ नहीं होगा। जावा एरलांग नहीं है, और जावा प्रोग्रामर भी उसी मानसिकता में नहीं हैं जैसे कि एरलांग प्रोग्रामर। भाषा का इस तरह इस्तेमाल करने का कभी इरादा नहीं था।

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


तो, हालांकि, स्पष्ट करने के लिए, यह एर्लांग में एक उपयोगी दृष्टिकोण है। और, जावा मानसिकता के मुद्दों को नजरअंदाज करते हुए, यह वास्तव में मदद कर सकता है?
Redjamjar

1
@redjamjar, यह जावा में उपयोगी होने की संभावना नहीं है, भाषा ही इस तरह के उपयोग के लिए काफी उपयुक्त नहीं है, और इसका मुख्य (और केवल) लाभ - पुस्तकालयों का उपयोग करने के लिए तैयार का विशाल शरीर - इस तरह के एक विदेशी में अच्छी तरह से फिट नहीं होगा प्रोग्रामिंग दृष्टिकोण।
एसके-तर्क 3

हाँ, अगर आप उस मॉडल को चाहते हैं, तो एर्लैंग का उपयोग करें, यह परिमाण का एक क्रम आसान होगा
Zachary K

1
जावा! = जेवीएम, सिर्फ कह रहा है :)
कामिल टॉमविच

1
@ बनिए, ये "फायदे" केवल तभी मौजूद हैं जब आपको तुलना करने के लिए कुछ भी नहीं मिला है
SK-logic
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.