2012-12-13 24 views
11

के बीच संबंधों को मैं बहुत बहु सूत्रण के लिए नया हूँ, और मैं एक परियोजना, जहां मैं अपने जावा प्रोग्राम में 4 सीपीयू का उपयोग करने की कोशिश कर रहा हूँ पर काम कर रहा हूँ। मैं कुछ ऐसा करना चाहता था जैसेजावा - धागे और सीपीयू

int numProcessors = Runtime.getRuntime().availableProcessors(); 
ExecutorService e = Executors.newFixedThreadPool(numProcessors); 

क्या यह गारंटी होगी कि मेरे पास एक सीपीयू प्रति सीपीयू काम करेगा? जब मैं धागे बनाते हैं, तो सिस्टम व्यस्त नहीं होगा, हालांकि कुछ समय बाद यह बेहद व्यस्त होगा। मैंने सोचा कि ओएस कम से कम व्यस्त सीपीयू को धागे बनाने के लिए चुन देगा, लेकिन अगर कोई भी सृजन के समय विशेष रूप से व्यस्त नहीं होता है तो यह कैसे काम करता है?

इसके अलावा, थ्रेड पूल सेवा धागे का पुन: उपयोग माना जाता है, लेकिन अगर यह देखता है एक और सीपीयू के बारे में अधिक उपलब्धता, यह धागा मारने और वहाँ एक नया एक अंडे होगा?

+2

आपका ओएस थ्रेड शेड्यूलिंग करता है, जावा नहीं। –

उत्तर

2

इस गारंटी मैं होगा कि एक धागा सीपीयू प्रति काम कर रहा होगा जावा में उपलब्ध है?

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

जब मैं धागे बनाते हैं, तो सिस्टम व्यस्त नहीं होगा, हालांकि कुछ समय बाद यह बेहद व्यस्त होगा। मैंने सोचा कि ओएस कम से कम व्यस्त सीपीयू को धागे बनाने के लिए चुन देगा, लेकिन अगर कोई भी सृजन के समय विशेष रूप से व्यस्त नहीं होता है तो यह कैसे काम करता है?

ओएस द्वारा थ्रेड बनाए जाते हैं और इसे शेड्यूल करने के लिए धागे की सूची में जोड़ा जाता है।

इसके अलावा, थ्रेड पूल सेवा धागे का पुन: उपयोग माना जाता है, लेकिन अगर यह देखता है एक और सीपीयू के बारे में अधिक उपलब्धता, यह धागा मारने और वहाँ एक नया एक अंडे होगा?

जावा मामले में कोई शामिल किए जाएं। ओएस फैसला करता है। यह धागे को मार और पुनरारंभ नहीं करता है।

धागे जिस तरह से आप का सुझाव में सीपीयू से जुड़ा नहीं है। ओएस सीपीयू के बीच थ्रेड पास करता है जिसके आधार पर एक थ्रेड को चलाने की आवश्यकता होती है और कौन सी सीपीयू मुक्त होती है।

+0

मेरी चिंता वास्तव में है कि ओएस एक ही सीपीयू पर उन्हें तुरंत चालू करने जा रहा है और फिर क्योंकि यह धागे का पुन: उपयोग करता है, कि यह उन्हें वहां रखेगा, भले ही यह उस बिंदु पर आता है जहां सीपीयू पिन किया गया है और अन्य 3 मुक्त हैं । क्या यह संभव है? – Marianna

+0

आप ओएस को ऐसा करने के लिए मजबूर कर सकते हैं, लेकिन डिफ़ॉल्ट रूप से यह प्रत्येक सीपीयू, अगले मुक्त थ्रेड को चला सकता है जो चला सकता है। –

+0

मैं देखता हूं, अद्यतन के लिए धन्यवाद। यदि ओएस सीपीयू में धागे को पार कर रहा है तो मुझे लगता है कि मेरे प्रश्न का उत्तर दें। यूनिक्स पर इसकी निगरानी करने का सबसे अच्छा तरीका क्या है? यदि मैं 'शीर्ष' फ़ंक्शन का उपयोग करता हूं तो क्या मुझे एक से अधिक जावा प्रोसेस चलेंगे? – Marianna

2

कोई इसके बारे में जहां धागे

वह उचित (ताकि एक लाइन आप कोर 0 और अगले पर हो सकता है देखता है वास्तव में ओएस धागा अनुसूचक कोर के आसपास धागे विस्थापित करने के लिए नि: शुल्क है चलाने के लिए कुछ भी गारंटी नहीं है कोर 4) पर

आप धागे की affinity सेट कर सकते हैं, लेकिन यह नहीं सीधे (AFAIK)

1

"अगर यह देखता है एक और सीपीयू के बारे में अधिक उपलब्धता, यह धागा मारने और वहाँ एक नया एक अंडे जाएगा?"

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

  • Thread.start() प्रोसेसर कतार में धागा डालता
  • जब वहाँ उपलब्ध प्रोसेसर है, अनुसूचक प्रोसेसर कतार में पहले धागा लेता प्रोसेसर
  • जब पर एक पुट एक कब्जे वाले ताला पर थ्रेड ब्लॉक, या आई/ओ ऑपरेशन के अंत की प्रतीक्षा कर रहा है, इसे प्रोसेसर से हटा दिया जाता है और इसी कतार में रखा जाता है। जब लॉक मुक्त हो जाता है, या I/O ऑपरेशन समाप्त होता है, तो थ्रेड उस कतार से वापस प्रोसेसर कतार में ले जाया जाता है।
  • जब धागा अवरुद्ध किए बिना बहुत लंबा काम करता है (ओ/एस निर्भर समय, कहें, 50 एमएस), एक बाधा होती है, और शेड्यूलर दिखता है कि प्रोसेसर कतार में धागे हैं या नहीं। यदि वहां हैं, तो मौजूदा थ्रेड प्रोसेसर से लिया जाता है और प्रोसेसर कतार के अंत में रखा जाता है, और कतार में पहला धागा प्रोसेसर पर लगाया जाता है। इस तरह लंबे चलने वाले धागे को अन्य थ्रेड भी निष्पादित करने देता है।

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