2010-12-13 30 views
23

ऐसा लगता है कि मैंने जावा थ्रेड/ओएस थ्रेड और व्याख्या की गई भाषा के साथ गड़बड़ की है।जावा थ्रेड बनाम ओएस थ्रेड

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

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

एक बार हॉटस्पॉट इन निष्पादन पथ दोनों को संकलित करता है, दोनों मूल थ्रेड के रूप में उतने ही अच्छे हो सकते हैं? क्या मैं सही हू ?

[संपादित करें]: एक वैकल्पिक प्रश्न हो सकता है, मान लें कि आपके पास एक जावा थ्रेड है जिसका कोड जेआईटी संकलित नहीं है, आप उस थ्रेड को बनाते हैं और शुरू करते हैं()? ओएस थ्रेड और जेवीएम बाइटकोड को चलाने के लिए कैसे इंटरैक्ट करते हैं?

धन्यवाद

उत्तर

25

प्रत्येक थ्रेड चलाने के लिए एक अलग सीपीयू पर चला सकते हैं जो एक देशी ओएस थ्रेड दिया जाएगा लेकिन जब से जावा है व्याख्या इन धागे फिर JVM के साथ बातचीत करने की आवश्यकता होगी और फिर बाइट कन्वर्ट करने के लिए कोड मशीन निर्देशों के लिए? क्या मैं सही हू ?

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

यदि हां, छोटे प्रोग्रामों की तुलना में जावा थ्रेड्स एक बड़ा फायदा नहीं होगा?

यहां छोटे परिभाषित करें। अल्पकालिक प्रक्रियाओं के लिए, हां, थ्रेडिंग उस बड़े अंतर को नहीं बनाता है क्योंकि आपका अनुक्रमिक निष्पादन पर्याप्त तेज़ है। ध्यान दें कि यह फिर से हल होने वाली समस्या पर निर्भर करता है। UI टूलकिट्स के लिए, कोई फर्क नहीं पड़ता कि एप्लिकेशन कितना छोटा है, यूआई उत्तरदायी रखने के लिए कुछ प्रकार के थ्रेडिंग/असीमित निष्पादन की आवश्यकता है।

थ्रेडिंग भी समझ में आता है जब आपके पास ऐसी चीजें हैं जो समानांतर में चल सकती हैं। एक सामान्य उदाहरण थ्रेड पर भारी आईओ और दूसरे में गणना करना होगा। आप वास्तव में अपनी प्रसंस्करण को अवरुद्ध नहीं करना चाहते हैं क्योंकि आपका मुख्य धागा आईओ कर रहा है।

एक बार हॉटस्पॉट इन दोनों निष्पादन रास्तों दोनों के रूप में अच्छा के रूप में देशी धागे हो सकता है संकलित? क्या मैं सही हू ?

मेरा पहला बिंदु देखें।

वास्तव में थ्रेडिंग एक रजत बुलेट नहीं है, जब "इस कोड को तेज़ी से जाने के लिए उपयोग धागे" की सामान्य गलतफहमी की बात आती है। थोड़ा सा पढ़ने और अनुभव आपकी सबसे अच्छी शर्त होगी। क्या मैं this awesome book की प्रति प्राप्त करने की अनुशंसा कर सकता हूं? :-)

@ संजय: वास्तव में अब मैं अपने प्रश्न को रेफ्रेम कर सकता हूं। अगर मेरे पास थ्रेड है जिसका कोड JIT'd नहीं किया गया है तो ओएस थ्रेड इसे निष्पादित करता है?

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

जावा pkg.MyClass -> वीएम स्थित विधि चलाने के लिए -> लाइन द्वारा विधि लाइन के लिए बाइट-कोड को क्रियान्वित करने शुरू -> अपने मूल समकक्ष करने के लिए प्रत्येक बाइट-कोड अनुदेश कन्वर्ट -> अनुदेश ओएस द्वारा निष्पादित -> अनुदेश मशीन

द्वारा निष्पादित जब JIT में लात मारी है:

जावा पीकेजी।MyClass -> वीएम स्थित विधि जो JIT'ed कर दिया गया है चलाने के लिए -> कि विधि के लिए जुड़े देशी कोड का पता लगाने -> अनुदेश ओएस द्वारा निष्पादित -> अनुदेश मशीन द्वारा निष्पादित

जैसा कि आप देख सकते हैं, चाहे आप जिस मार्ग का पालन करते हैं, भले ही वीएम निर्देश को किसी समय पर अपने मूल समकक्ष को मैप किया जाना चाहिए। क्या उस देशी कोड को फिर से उपयोग के लिए संग्रहीत किया जाता है या अगर एक अलग चीज़ (ऑप्टिमाइज़ेशन, याद है?) दूर फेंक दिया जाता है।

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

+0

रान के लिए खेद है, यह जवाब अपेक्षा से काफी अधिक है। ;-) –

+0

@ संजय: अगर मुझे यह सही लगता है तो पहली बार थ्रेड निष्पादित होने से पहले भी जेआईटी किया जाएगा?Essesntially JVM पहले स्वतंत्र धागे और निष्पादन के लिए ओएस थ्रेड दोनों के लिए जेआईटी करता है? – Geek

+1

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

7

और पूरे जावा प्रक्रिया चलाता है केवल एक ही ओएस थ्रेड

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

एक सामान्य सिफारिश थ्रेड पूल का उपयोग कर रही है जहां धागे की संख्या कोर की संख्या (कारक 1-1.5) के समान होती है। यह एक और संकेत है कि JVM एक ओएस थ्रेड/प्रक्रिया तक ही सीमित नहीं है।


wkipedia से:

जावा 1.1 में, हरे रंग के धागे केवल सूत्रण JVM द्वारा इस्तेमाल किया मॉडल, कम से कम सोलारिस [4] थे। चूंकि हरे धागे में मूल धागे की तुलना में कुछ सीमाएं होती हैं, बाद के जावा संस्करणों ने उन्हें देशी धागे के पक्ष में छोड़ दिया।

अब 2010 में जावा 7 के विकास के साथ और जावा 8 योजनाबद्ध - क्या हम वास्तव में ऐतिहासिक "हरी धागे" में अभी भी रुचि रखते हैं ??

+0

मैं जेडीके i.2 से पहले विशिष्ट थ्रेड के बारे में बात कर रहा था, जिसे ग्रीन थ्रेड के नाम से जाना जाता था। – Geek

+0

@ गीक - आपने "ग्रीन थ्रेड्स" का उल्लेख किया है, लेकिन सामान्य रूप से जावा थ्रेड के बारे में आपका प्रश्न (शीर्षक को देख रहा था)। अगर आप केवल हरे धागे और जावा 1.1/1.2 –

+0

निश्चित रूप से रुचि रखते हैं, तो कृपया अपना प्रश्न संपादित करें। असल में ग्रीन थ्रेड्स को शामिल करना यह समझना आसान है कि जेवीएम द्वारा दो धागे चलाने पर बाइट कोड रूपांतरण कैसे संभाला जाता है क्योंकि JVM का पूरा नियंत्रण होता है। मैं इसे ओएस थ्रेड के रूप में चलाने वाले दो धागे को समझने में सक्षम नहीं हूं। – Geek

2

थ्रेड कोड चलाने और चलाने के लिए अलग-अलग मुद्दे हैं। जेवीएम द्वारा प्लेटफॉर्म पर ग्रीन थ्रेड का उपयोग किया जाता है जिनके पास धागे का मूल समर्थन नहीं होता है। (आईएमएचओ मुझे नहीं पता कि कौन सा मंच थ्रेड का समर्थन नहीं करता है)।

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

नीचे पंक्ति: प्रदर्शन और धागे के बारे में चिंता न करें। जावा आप जो कुछ भी कोडिंग कर रहे हैं उसे चलाने के लिए पर्याप्त मजबूत है।

+0

जावा 1.0 हरे धागे का इस्तेमाल किया। सुनिश्चित नहीं है कि किसी के पास से है, लेकिन डिजाइन में इसकी अनुमति है। –

+0

तो जैसे आपने कहा कि यदि मेरे पास जेआईटी या हॉटस्पॉट के माध्यम से सभी कोड हैं, तो मैं दो जावा थ्रेड को दो ओएस थ्रेड के रूप में प्रभावी ढंग से चला सकता हूं, काफी मेला। लेकिन मुझे लगता है कि कोड के पहले पास पर जेआईटी संकलन होता है, इसलिए पहली बार जब मैं कोड चलाता हूं जो दो धागे शुरू करता है तो दो धागे को अभी भी व्याख्या करना होगा? इसलिए जेवीएम ओएस थ्रेड दोनों द्वारा शामिल किया जाएगा। – Geek

+0

जहां तक ​​मुझे पता है कि जेवीएम मूल धागे पर एक पतला आवरण बनाता है। एक एप्लिकेशन में सभी थ्रेड एक ही मेमोरी साझा करते हैं, इसलिए देशी कोड में संकलित कोड थ्रेड के बीच साझा किया जाएगा। – AlexR

3
  1. कुछ जावा कार्यान्वयन हरे धागे बना सकते हैं जैसे आप इसे (एक एकल देशी धागे पर JVM द्वारा किए गए शेड्यूलिंग) का वर्णन है, लेकिन सामान्य पीसी उपयोग कई कोर पर जावा के कार्यान्वयन।
  2. जेवीएम स्वयं काम करने के लिए पहले से ही विभिन्न धागे का उपयोग कर सकता है (कचरा संग्रहण, कक्षा लोडिंग, बाइट-कोड-सत्यापन, जेआईटी-कंपाइलर)।
  3. ओएस जेवीएम नामक एक प्रोग्राम चलाता है। JVM जावा-बाइटकोड निष्पादित करता है। यदि प्रत्येक जावा-थ्रेड में एक मूल मूल धागा होता है (जो समझ में आता है और पीसी-कार्यान्वयन पर मामला प्रतीत होता है), तो उस थ्रेड में जेवीएम-कोड जावा-कोड - जेआईटीएड या व्याख्या - निष्पादित करता है - एक थ्रेड पर -program। मल्टीथ्रेडिंग के माध्यम से यहां कोई अंतर नहीं है।
संबंधित मुद्दे