2012-05-08 10 views
7

मैं वर्तमान में स्कैला में कलाकारों के बारे में सीख रहा हूं। पुस्तक receive की बजाय react विधि का उपयोग करने की अनुशंसा करती है, क्योंकि यह सिस्टम को कम धागे का उपयोग करने की अनुमति देती है।क्या JVM एप्लिकेशन में कई धागे महंगा हैं?

मैंने why creating a thread is expensive पढ़ा है। लेकिन इसके कारण क्या हैं, एक बार जब आपके पास धागे होते हैं (जो शुरुआत के बाद स्कैला में अभिनेता प्रणाली के लिए पकड़ लेना चाहिए), उन्हें आसपास रखना महंगा है?

क्या यह मुख्य रूप से स्मृति खपत है? या क्या कोई अन्य कारण हैं?

+0

ध्यान दें कि यह प्रश्न * सृजन के बाद * धागे के ऊपरी हिस्से के बारे में है, इसलिए यह लिंक किए गए प्रश्न का डुप्लिकेट नहीं है। वास्तव में प्रश्न में जो पहले से ही कहा गया है ... – rolve

उत्तर

10

कई धागे का उपयोग करना अधिक महंगी की तुलना में आप उम्मीद करेंगे हो सकता है क्योंकि:

  • प्रत्येक थ्रेड ढेर जो कितने धागे JVM के लिए बिल्कुल भी बनाया जा सकता है पर प्रतिबंध स्थानों के बाहर स्मृति की खपत;
  • एक धागे से दूसरे में स्विच कुछ CPU समय का उपभोग करता है, इसलिए यदि आपके पास एक ही थ्रेड में किया जा सकता है, तो आप सीपीयू चक्रों को बचाएंगे;
  • वहां जेवीएम शेड्यूलर है जो अधिक धागे होने पर अधिक काम करता है। अंतर्निहित ओएस शेड्यूलर पर भी लागू होता है;
  • आखिर में, सीपीयू-कोर कार्यों के लिए आपके पास CPU कोर की तुलना में अधिक थ्रेड का उपयोग करने में थोड़ा सा अर्थ नहीं होता है और आपके पास I/O गतिविधियों (उदाहरण के लिए, नेटवर्क क्लाइंट) की तुलना में अधिक I/O धागे का उपयोग करने में थोड़ा सा अर्थ नहीं होता है।
+4

यह ध्यान देने योग्य हो सकता है कि "JVM शेड्यूलर" टिप्पणी का अर्थ है कि आपके जीसी विराम कुछ हद तक बढ़ेगा (क्योंकि सभी धागे को एक सुरक्षित बिंदु पर लाने में अधिक समय लगता है), शायद अधिक ध्यान देने योग्य युवा जीन पर – Matt

+0

@ मैट पर एक अच्छा बिंदु! धन्यवाद! –

2

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

कुछ ऑपरेटिंग सिस्टम/जेवीएम में थ्रेड की मात्रा पर भी बाधाएं हो सकती हैं जो समवर्ती रूप से मौजूद हो सकती हैं।

आखिरकार, यह छोटे ओवरहेड्स का संचय है जो अंततः बहुत से खाते में हो सकता है। और इनमें से कोई वास्तव में जावा के लिए विशिष्ट नहीं है।

2

आसपास के धागे होने के कारण "महंगा" नहीं है। बेशक, यह थोड़े इस बात पर निर्भर करता है कि हम यहां कितने बात कर रहे हैं। मुझे संदेह होगा कि अरबों धागे एक समस्या होगी। मुझे लगता है कि आम तौर पर बोलते हुए, बहुत सारे धागे को महंगा माना जाता है क्योंकि आप अधिक समानांतर काम कर सकते हैं ताकि सीपीयू बढ़ जाए, स्मृति बढ़ जाए, आदि ... लेकिन अगर वे सही ढंग से प्रबंधित होते हैं (सिस्टम संसाधनों की सुरक्षा के लिए उदाहरण के लिए पूल किया जाता है) तो यह ठीक है। JVM आवश्यक रूप से मूल धागे का उपयोग नहीं करता है, इसलिए जावा थ्रेड को ओएस मूल धागे के लिए मैप नहीं किया जाता है (यानी उदाहरण के लिए हरे धागे को देखें, या हल्के धागे)। मेरी राय में, जेवीएम में धागे के लिए कोई अंतर्निहित लागत नहीं है। लागत खराब थ्रेड प्रबंधन और संसाधनों के अत्यधिक उपयोग से लापरवाही से उन्हें काम सौंपा गया है।

+1

यह अब तक का सबसे अच्छा स्पष्टीकरण है, इसलिए +1। –

+0

यकीन है कि यह "महंगा" है। यह स्मृति का उपयोग करता है। मेरा मानना ​​है कि डिफ़ॉल्ट 64-बिट मशीन पर 1 एमबी/थ्रेड है। तो 1000 धागे => 1 जीबी। आपके पास 32 जीबी हो सकती है और परवाह नहीं है, लेकिन "महंगा नहीं" भ्रामक है। –