जब आप मल्टी कोर प्रोसेसर पर कई थ्रेड शुरू करते हैं, तो क्या वे विभिन्न कोर द्वारा संसाधित होने की गारंटी देते हैं?


24

मेरे पास एक पेंटियम कोर i5 प्रोसेसर है, जिसमें 4 कोर हैं। अगर मैं C # कंसोल प्रोग्राम में ऐसा करता हूं

var t1 = new Thread(Thread1);
var t2 = new Thread(Thread2);
t1.Start();
t2.Start();

क्या अलग कोर पर चलने के लिए t1 और t2 धागे की गारंटी है?


1
यह मानते हुए कि C # रनटाइम किसी अन्य थ्रेड को स्पॉन करने के लिए समतुल्य देशी सिस्टम कॉल का उपयोग करता है (और इस प्रकार वास्तव में समानांतर है; यह सब कुछ के लिए ऐसा नहीं है, जैसे CPython का बदनाम ग्लोबल इंटरप्रेटर लॉक ), यह केवल ऑपरेटिंग सिस्टम की प्रक्रिया / कार्य अनुसूचक पर निर्भर करेगा । सामान्य तौर पर, यदि आप मान लेते हैं कि कोड वास्तव में थ्रेड सुरक्षित है t1और t2एक अनियंत्रित क्रम में अलग-अलग समय पर निष्पादित किया जाता है (जैसे कि यह संभव t2है कि t1 कुछ मॉडलों में पहले शुरू होता है )।
ब्रेकथ्रू

2
मुझे नहीं पता था कि पेंटियम i5 प्रोसेसर थे। शायद आप कोर i5 का मतलब है? नकचढ़े। मुझे पता है: D
JosephGarrone

जवाबों:


18

आप .Net में गारंटी नहीं दे सकते कि Threadदो अलग-अलग कोर पर दो एस चलाते हैं। वास्तव में, आप यह भी गारंटी नहीं दे सकते कि कोई Threadकेवल एक कोर (!) पर चलेगा

ऐसा इसलिए है क्योंकि प्रबंधित थ्रेड OS थ्रेड्स के समान नहीं हैं - एक एकल प्रबंधित थ्रेड इसका समर्थन करने के लिए कई OS थ्रेड्स का उपयोग कर सकता है। C # में, आप केवल सीधे प्रबंधित Threads के साथ सौदा करते हैं (कम से कम, WinAPI थ्रेडिंग फ़ंक्शन को कॉल करने के लिए पी / आह्वान का सहारा लिए बिना, जो आपको कभी नहीं करना चाहिए)

हालाँकि, .Net और Windows थ्रेड शेड्यूलर्स वे जो करते हैं, उसमें बहुत अच्छे हैं - वे एक ही कोर पर दो धागे नहीं चलाएंगे, जबकि दूसरा कोर पूरी तरह से बेकार बैठता है। तो, सामान्य तौर पर, आपको इसके बारे में चिंता करने की आवश्यकता नहीं है।


अभ्यास में, नेट Threadरों हैं ओएस धागे। लेकिन यही कारण है कि कोई भी गारंटी नहीं है कि एक ही धागा हमेशा एक ही कोर पर निष्पादित होगा।
svick

2
@ शविक: व्यवहार में, x86 पर , यह सच है। हालाँकि, मानक स्पष्ट रूप से बताता है कि आप इस व्यवहार पर भरोसा नहीं कर सकते हैं, इसलिए यह भविष्य में बदल सकता है। वास्तव में, यह .net CLR के अन्य संस्करणों पर सच नहीं है, जैसे XBox 360 का।
ब्लूराजा - डैनी पफ्लुगुफ्ट

@BlueRaja - सवाल विशिष्ट है कि हम किस CLR के संस्करण के बारे में बात कर रहे हैं। आप गारंटी दे सकते हैं कि कुछ अलग-अलग कोर पर async थ्रेड्स का उपयोग करके मौजूद होंगे क्योंकि इसका मतलब होगा कि वे एक दूसरे से async होते हैं। वर्तमान उदाहरण कोड तकनीकी रूप से एक सिंक कॉल है। बेशक ऑपरेटिंग सिस्टम यह तय करता है कि कोर का क्या उपयोग किया जाएगा।
रामऔंध

@Rhhound "आप गारंटी दे सकते हैं कि दो अलग-अलग कोर पर async थ्रेड्स का उपयोग करके मौजूद होगा" - यह गलत है। asyncकीवर्ड (जो मैं क्या मान लें कि आपके, के बारे में बात कर रहे हैं के रूप में "async धागे 'अनावश्यक है) एक प्रयोग करने के लिए सिर्फ वाक्य-चीनी है BackgroundWorkerधागा है, जो किसी भी अन्य नेट धागे की तरह है - आप नहीं गारंटी है कि यह एक पर चलेगा कि क्या कर सकते हैं अलग कोर या नहीं।
ब्लूराजा - डैनी पफ्लुगुएफ्ट

@BlueRaja - यदि दो async धागे शुरू किए गए थे तो वे दोनों एक ही समय में चलेंगे, बशर्ते कि 2 CPU कोर थे। यदि केवल एक ही था तो ऑपरेटिंग सिस्टम शेड्यूल करेगा जब प्रत्येक थ्रेड को प्राथमिकता मिलेगी और चला जाएगा और आपकी विशिष्ट एकल थ्रेडेड थ्रशिंग स्थिति होगी। यह कैसे मुझे सिखाया गया था कि कैसे एक सीपीयू बहु-थ्रेड को संभालता है।
रामहाउंड

15

नहीं, ओएस और सीपीयू तय करेगा कि क्या और कब चलना है। अन्य कार्यों के बहिष्कार के लिए आपके द्वारा दिखाए गए सरल उदाहरण में, हाँ, जो अलग-अलग कोर पर समानांतर रूप से चलेंगे, लेकिन शायद ही कोई गारंटी होगी कि ऐसा ही होगा।

आप किसी दिए गए धागे को कोर के आवंटन पर कुछ नियंत्रण लेने का प्रयास करने के लिए थ्रेड एफिनिटी का उपयोग कर सकते हैं ।

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


1
मैं यह भी जोड़ना चाहता हूं कि वर्चुअलाइजेशन तकनीकों के साथ आपके प्रोग्राम और हार्डवेयर के बीच एक और परत है। क्या OS आवेदन के लिए प्रस्तुत शारीरिक रूप से सटीक नहीं हो सकता है।
कल्टारी

1
वे OS थ्रेड्स के लिए WinAPI फ़ंक्शन हैं, प्रबंधित थ्रेड्स के लिए नहीं। उन्हें कभी भी C # से नहीं बुलाया जाना चाहिए, क्योंकि वे .Net थ्रेड शेड्यूलर के साथ गंभीर रूप से हस्तक्षेप कर सकते हैं।
ब्लूराजा - डैनी पफ्लुगुफ्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.