2009-10-16 16 views
9

के बीच थ्रेड के .NET आंदोलन Multi-core usage, threads, thread-pools से प्रश्न का पालन करें।कोर

धागे उनके जीवनकाल के दौरान एक से दूसरे कोर से चले गए हैं?

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

यह इस साइट पर मेरा पहला समय है, इसलिए मेरे पास अनुमान लगाने के लिए पर्याप्त प्रतिनिधि नहीं था। मैंने बस एक नया प्रश्न बनाने का फैसला किया जिस पर मैं टिप्पणी करना चाहता था।

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

इसके अलावा मैं सोच रहा था कि क्या बयान के संदर्भ में कोर के बीच धागे स्थानांतरित किए गए हैं। या क्या इसे सिर्फ "सामान्य ज्ञान" माना जाता है?

धन्यवाद!

उत्तर

6

ऐसा नहीं है कि थ्रेड किसी विशेष कोर पर रह रहा है और यह को दूसरे स्थान पर ले जाने की प्रक्रिया है।

ऑपरेटिंग सिस्टम में केवल थ्रेड (और/या प्रक्रियाओं) की एक सूची है जो निष्पादित करने के लिए तैयार हैं और उपलब्ध होने वाले जो भी कोर/सीपीयू पर उन्हें प्रेषित करेंगे।

जिसके अनुसार, किसी भी स्मार्ट अनुसूचक के रूप में ज्यादा संभव के रूप में एक ही कोर पर धागा शेड्यूल करने के लिए कोशिश करेंगे - बस प्रदर्शन को बढ़ाने के लिए (डेटा अधिक में होने की संभावना है कि कोर की कैश आदि)

+0

क्या यह केवल एक मामला है "कैश पहले से ही इस कोर पर था, इसलिए इस धागे को वापस पाने की उच्च संभावना है"? स्ट्रॉन्ग और तुलसेन एट अल द्वारा "कोर के बीच थ्रेड्स के फास्ट स्विचिंग" पढ़ने के बाद यह अधिक जटिल लग रहा था। और कॉन्स्टेंटिनौ, स्ज़ाइड्स एट अल द्वारा "सिंगल थ्रेड माइग्रेशन ऑन चिप मल्टी-कोर" के प्रदर्शन प्रभाव। यदि यह केवल कैश इतिहास का मामला है, तो "किसी भी स्मार्ट शेड्यूलर" के समूह के तहत विंडोज शेड्यूलर है या यह सुनिश्चित करने के लिए कुछ सावधानी बरतनी चाहिए कि शेड्यूलिंग "स्मार्ट" है? – mphair

+0

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

3

एमएसडीएन में कुछ लेख हैं जो शायद कुछ चीजों को स्पष्ट करने में मदद करेंगे: Scheduling Priorities और Multiple Processors

अंश (निर्धारण प्राथमिकताएं):

धागे निर्धारित हैं उनकी शेड्यूलिंग प्राथमिकता के आधार पर चलते है। प्रत्येक थ्रेड को शेड्यूलिंग प्राथमिकता असाइन की जाती है। प्राथमिकता स्तर शून्य (सबसे कम प्राथमिकता) से 31 तक (उच्चतम प्राथमिकता) से है। केवल शून्य-पेज धागा शून्य की प्राथमिकता हो सकती है। ( शून्य पेज धागा एक प्रणाली धागा किसी भी नि: शुल्क पृष्ठ शून्यीकरण को जब वहाँ कोई अन्य सूत्र चलाने की आवश्यकता हैं के लिए जिम्मेदार है।)

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

और संबंध में एकाधिक प्रोसेसर के लिए:

कंप्यूटर के साथ कई प्रोसेसर आम तौर पर दो आर्किटेक्चर में से एक के लिए तैयार कर रहे हैं: अ-समतल मेमोरी एक्सेस (NUMA) या सममित बहु प्रक्रमण (SMP)।

एक NUMA कंप्यूटर में, प्रत्येक प्रोसेसर दूसरों के मुकाबले स्मृति के कुछ हिस्सों के करीब है, जिससे अन्य भागों की तुलना में स्मृति के कुछ हिस्सों में मेमोरी एक्सेस तेज हो जाता है। NUMA मॉडल के तहत, सिस्टम प्रोसेसर पर थ्रेड शेड्यूल करने का प्रयास करता है जो उपयोग की जा रही स्मृति के करीब हैं। NUMA के बारे में अधिक जानकारी के लिए, NUMA समर्थन देखें।

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

+0

अच्छे लिंक, हालांकि, वास्तव में थ्रेड माइग्रेशन के मुद्दे को संबोधित नहीं करते हैं। जब मैं धागा बनाता हूं, प्राथमिकता या थ्रेड एफ़िनिटी या थ्रेड आदर्श प्रोसेसर को बदलने से मुझे थ्रेड को चलाने के लिए कौन सा कोर चुनने की अनुमति मिलती है, लेकिन क्या होता है यदि कोर के कुछ अन्य थ्रेड ब्लॉक होते हैं। क्या शेड्यूलर तब उस खाते का खाता लेता है और मैंने उपलब्ध कोर में बनाए गए धागे को स्थानांतरित कर दिया है? – mphair

1

विंडोज स्थापित करने के लिए एपीआई प्रदान करता है thread affinity (अर्थात सीपीयू इस सूत्र के लिए निर्धारित किया जाना चाहिए निर्धारित करने के लिए)। यदि थ्रेड हमेशा एक कोर पर निष्पादित होता है तो ऐसी एपीआई की आवश्यकता नहीं होगी।

2

है यह शेड्यूलर की तरह धागे की एक सूची है जिसमें प्रोसेसिंग समय और की आवश्यकता होती है क्योंकि यह एक और एक डालता है?

लगभग। आप जो वर्णन करते हैं उसे cooperative multi-tasking कहा जाता है, जहां धागे नियमित रूप से शेड्यूलर पर निष्पादन उत्पन्न करने की अपेक्षा की जाती हैं (उदाहरण के लिए केवल थोड़ी देर के लिए रहकर, या नियमित रूप से Thread.Current.Sleep(0) पर कॉल करके)। ऐसा नहीं है कि एक आधुनिक उपभोक्ता ऑपरेटिंग सिस्टम कैसे काम करता है, क्योंकि एक दुष्ट असंगत धागा ऐसे सिस्टम में सीपीयू को हॉग कर सकता है।

इसके बजाय क्या होता है कि नियमित समय अंतराल पर, context switch होता है। चलने वाला थ्रेड, चाहे वह इसे पसंद करता है या नहीं, निलंबित कर दिया गया है। इसमें स्मृति में सीपीयू रजिस्टरों की स्थिति का एक स्नैपशॉट संग्रहीत करना शामिल है। कर्नेल के शेड्यूलर को फिर स्थिति चलाने और फिर से मूल्यांकन करने का मौका मिलता है, और कुछ समय के लिए एक और थ्रेड चलाने का फैसला कर सकता है। इस तरह सीपीयू समय के स्लाइस (मिलीसेकंड या उससे कम में मापा जाता है) विभिन्न धागे को दिए जाते हैं। इसे pre-emptive multitasking कहा जाता है।

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