2009-11-16 6 views
14

हम हाल ही में अपने ऑपरेटिंग सिस्टम क्लास में धागे के बारे में बात कर रहे हैं और एक सवाल मेरे दिमाग में आया है।तथ्य यह नहीं है कि गो और जावा का उपयोग उपयोगकर्ता स्पेस थ्रेड का मतलब है कि आप वास्तव में एकाधिक कोर का लाभ नहीं ले सकते हैं?

चूंकि जाओ, (और जावा) कर्नेल थ्रेड के बजाय उपयोगकर्ता-स्थान धागे का उपयोग करता है, इसका मतलब यह नहीं है कि आप प्रभावी रूप से एकाधिक कोर के फायदे नहीं ले सकते हैं क्योंकि ओएस केवल प्रक्रिया के लिए CPU समय आवंटित करता है, न कि खुद धागे?

This seems to confirm the fact that you can't

Wikipedia also seems to think so

+0

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

+0

स्टीफनसी, उन्होंने "तथ्य" शब्द का उपयोग किया हो सकता है, लेकिन वह एक प्रश्न पूछ रहा है, और निश्चित रूप से संभावना है कि उसकी धारणा गलत है। अंतर बनाने के लिए +1। – snarf

+0

सिर्फ दूसरों ने जो कहा है उस पर टिप्पणी करने के लिए ... लिनक्स पर जावा, उदाहरण के लिए: यह जावा थ्रेड के मूल लिनक्स धागे से दस साल से अधिक रहा है। यह पहले ऐसा नहीं था (मुझे इन दिनों याद है) लेकिन, हाँ, यह अब से 10 साल से अधिक रहा है। – SyntaxT3rr0r

उत्तर

17

आपको क्या लगता है कि उपयोगकर्ता उपयोगकर्ता-स्थान धागे का उपयोग करता है?

ऐसा नहीं है। यह ओएस-थ्रेड्स का उपयोग करता है और कई कोर का लाभ उठा सकता है।

आप इस तथ्य से परेशान हो सकते हैं कि डिफ़ॉल्ट रूप से केवल अपने प्रोग्राम को चलाने के लिए 1 थ्रेड का उपयोग करता है। यदि आप दो goroutines शुरू करते हैं तो वे एक थ्रेड में चलते हैं। लेकिन यदि I/O Go के लिए एक goroutine ब्लॉक दूसरे थ्रेड बनाता है और नए थ्रेड पर अन्य goroutine चलाने के लिए जारी है।

यदि आप वास्तव में पूर्ण बहु-कोर पावर अनलॉक करना चाहते हैं तो बस GOMAXPROCS() फ़ंक्शन का उपयोग करें।

runtime.GOMAXPROCS(4); //somewhere in main

अब अपने कार्यक्रम 4 ओएस-सूत्र (1 के बजाय) का प्रयोग करेंगे और पूरी तरह से एक जैसे का उपयोग करने में सक्षम होगा 4 कोर सिस्टम।

+0

किसी कारण से, हालांकि मैंने इसे कहीं पढ़ा है ... –

+0

और अब यह नहीं लगता है कि, कहां ठीक है, अनुमान लगाओ कि आप सही हैं! –

+0

लेकिन अन्यथा आप सही थे। यदि कुछ वास्तव में उपयोगकर्ता-स्थान धागे पर निर्भर करता है तो यह बहु-कोर/बहु-सीपीयू सिस्टम का उपयोग करने में सक्षम नहीं होगा – jitter

6

जावा के नवीनतम संस्करणों की, ओएस धागे का उपयोग करने हालांकि वहां जरूरी जावा धागे के साथ एक-से-एक मानचित्रण नहीं है। जावा स्पष्ट रूप से कई हार्डवेयर धागे में काफी अच्छी तरह से काम करता है।

+0

तो मूल रूप से, JVM कर्नेल थ्रेड बनाता है जो उपयोगकर्ता थ्रेड के रूप में माना जाएगा? –

+1

असल में, हाँ। –

0

मुझे लगता है कि "उपयोगकर्ता-स्थान धागे" से आपका मतलब है (उदाहरण के लिए) गो के goroutines।

यह सच है कि समरूपता के लिए गोरौटाइन का उपयोग ओएस धागे को कार्य इकाइयों को निर्दिष्ट करने के लिए एक विशेष उद्देश्य एल्गोरिदम डिजाइन (हाथ से और वैज्ञानिक गणना द्वारा) से कम कुशल है।

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

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

संबंधित मुद्दे

 संबंधित मुद्दे