2012-03-01 17 views
7

संभव डुप्लिकेट चल/एकल जावा धागा:
Would a multithreaded Java application exploit a multi-core machine very well?ड्युअल-कोर CPU उपयोग

मैं अपने डुअल कोर मशीन पर चल रहा है इस तरह एक सादा और सरल जावा धागा है (विंडोज एक्सपी 32 बिट पर्यावरण)

public static void main(String[] strs) { 

    long j = 0; 
    for(long i = 0; i<Long.MAX_VALUE; i++) 
     j++; 

    System.out.println(j); 
    } 

मेरी उम्मीद थी कि यह एक सीपी तक टिकेगी यू उच्च गति कैश का पूरी तरह से शोषण करने के लिए (चूंकि लूप में हम स्थानीय चर जे के साथ काम करते रहते हैं, इसलिए एक सीपीयू उपयोगिता 100% होगी और दूसरा बहुत निष्क्रिय होगा। मेरी प्राप्ति के लिए थ्रेड शुरू होने के बाद दोनों सीपीयू का उपयोग लगभग 40% ~ 60% पर किया जा रहा है और एक सीपीयू का उपयोग दूसरे की तुलना में थोड़ा अधिक है।

मेरा सवाल यह है कि क्या कोई ओएस लोड-बैलेंसिंग तंत्र है जो बाहर की शेष राशि का पता चला है? मेरे मामले में यह संभव है कि विंडोज ओएस ने पाया कि एक सीपीयू लगभग 100% मार रहा है और दूसरा लगभग निष्क्रिय है, इसलिए यह समय-समय पर थ्रेड को दूसरे CPU पर पुन: निर्धारित करता है?

enter image description here

# EDIT1 मैं एक संभावित व्याख्या पाया है: http://siber.cankaya.edu.tr/ozdogan/OperatingSystems/ceng328/node130.html

+0

हां, ओएस चारों ओर धागे उछाल देगा। – Mysticial

+0

मुझे लगता है कि इस प्रश्न का उत्तर पहले ही दिया जा चुका है http://stackoverflow.com/questions/1649402/would-a-multithreaded-java-application-exploit-a-multi-core-machine-very-well – parion

+0

और ध्यान रखें कि अधिकांश जावा प्रोग्राम एक कोर का उपयोग करने और एक कोर के साथ रहने का प्रयास करेंगे, जैसा कि मैंने Minecraft के साथ पाया था। यहां एक ऐसे व्यक्ति की कहानी दी गई है जिसने इसे अपने नए कंप्यूटर के साथ पाया है http://mlee888.wordpress.com/2006/03/31/java-performance-in-dual-coremultiprocessor-environment/ – parion

उत्तर

3

ओएस कार्यान्वित जब धागे, यह समय की एक निश्चित अवधि के लिए प्रत्येक थ्रेड (माना 10-20ms), तो धागे के राज्य की बचत होती है चलाता है, और अन्य थ्रेड के लिए लग रहा है चलाने के लिए।

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

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

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

यह एक उचित व्यापार-बंद की तरह लगता है: यदि कोर में एकजुट होने पर आपका धागा बेहतर प्रदर्शन करता है, तो बस ओएस से ऐसा करने के लिए कहें। लेकिन, ओएस आपके लिए इसे समझने की कोशिश करने से परेशान नहीं होगा।

1

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

int main(int argc, char** argv) 
{ 
    while(true); 
    return 0; 
} 

आप इस प्रक्रिया को देखें, तो यह 25% (क्वाड-कोर का उपयोग) पर लगातार है, लेकिन विंडोज 7 से संसाधन मॉनिटर पता चलता है कि 4 कोर में से कोई भी, लगातार 100% पर है भी कोर हालांकि 0 दूसरों की तुलना में अधिक उपयोग पर है।

cpu may share कोर के बीच कैश, इसलिए इस व्यवहार का मतलब यह नहीं है कि कैश का उपयोग नहीं किया जा रहा है।

+1

क्या कोई आधिकारिक/दस्तावेज स्पष्टीकरण है कि क्यों और कैसे ओएस थ्रेड को उछालता है? – njzhxf

+0

@njzhxf - क्या इससे कोई फर्क पड़ता है? –

+0

@StephenC इसके बारे में कुछ और सीखना चाहता था – njzhxf

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