2011-03-31 21 views
13

सी # .NET 2.0 में थ्रेड के लिए अधिकतम स्टैक आकार की अनुमति क्या है? साथ ही, क्या यह मान अंतर्निहित ओएस के सीएलआर और/या बिहार (32 या 64) के संस्करण पर निर्भर करता है? मैं निम्न संसाधनों पर ध्यान दिया है msdn1 और msdn2अधिकतम थ्रेड स्टैक आकार .NET?

public Thread( ThreadStart start, int maxStackSize )

केवल जानकारी मैं देख सकता हूँ कि डिफ़ॉल्ट आकार 1 मेगाबाइट और उपरोक्त विधि में, अगर maxStackSize है '0' डिफ़ॉल्ट अधिकतम ढेर है निष्पादन योग्य के लिए शीर्षलेख में निर्दिष्ट आकार का उपयोग किया जाएगा, अधिकतम मूल्य क्या है जिससे हम शीर्षलेख में मान बदल सकते हैं? ऐसा करने के लिए भी सलाह दी जाती है? धन्यवाद।

+0

[विंडोज़ की सीमाओं को धक्का देना: प्रक्रियाएं और थ्रेड] (http://blogs.technet.com/b/markrussinovich/archive/2009/07/08/3261309.aspx) दिलचस्प हो सकता है। हालांकि यह सीधे सवाल का जवाब नहीं देता है। वास्तव में, –

+0

। साझा करने के लिए धन्यवाद। – Oved

उत्तर

4

मैं क्या अधिकतम है के बारे में पता कर रहा हूँ, लेकिन MSDN कि क्या आप यह कर या नहीं करना चाहिए करने के लिए बोलता है:

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

मेरे पास सी # में स्टैक ओवरफ्लो नहीं हुआ है जो अनंत रिकर्सन के कारण नहीं था। यदि वास्तव में ऐसा कोई मामला था जहां उस गहराई में रिकर्सन गया, तो मैं इसे पुनरावृत्ति के साथ बदलने पर विचार करूंगा।

+0

धन्यवाद क्रिस। मेरे पास पृष्ठभूमि थ्रेड है जो फ़ाइलों के एक सेट पर लंबे समय तक ऑपरेशन करता है और 'प्रोग्राम के निष्पादन को जारी रखने के लिए अपर्याप्त स्मृति' त्रुटि में विफल रहता है। यह समस्या एक बार maxStackSize मान को बदलकर तय की गई थी। अब फाइलों के विभिन्न सेट के लिए यह एक ही त्रुटि के साथ विफल रहता है और मैं मान को अधिकतम संभव करने के लिए सेट करने की कोशिश कर रहा था और परिणाम देख रहा था .. इसके अलावा अधिकतम मूल्य के बारे में उत्सुकता के रूप में मैं इसे खोजने में सक्षम नहीं था। – Oved

24

रिकॉर्ड के लिए, यह रेमंड चेन की श्रेणी को फिट करता है "अगर आपको पता होना चाहिए तो आप कुछ गलत कर रहे हैं"।

64-बिट कोड चलाने वाले थ्रेड के लिए डिफ़ॉल्ट स्टैक आकार 4 मेगाबाइट्स, 32-बिट कोड के लिए 1 मेगाबाइट है। जबकि थ्रेड कन्स्ट्रक्टर आपको int.MaxValue तक एक पूर्णांक मान पास करने देता है, आपको इसे 32-बिट मशीन पर कभी नहीं मिलेगा। स्टैक को वर्चुअल मेमोरी एड्रेस स्पेस में उपलब्ध छेद में फिट होना चाहिए, जो आम तौर पर प्रक्रिया जीवनकाल में ~ 600 एमबी पर ऊपर जाता है। जब आप मेमोरी आवंटित करते हैं और एड्रेस स्पेस को विभाजित करते हैं तो तेज़ी से छोटे हो जाते हैं।

डिफ़ॉल्ट से अधिक आवंटित करना काफी अनावश्यक है। आप इस पर विचार कर सकते हैं जब आपके पास भारी रिकर्सिव विधि है जो ढेर को उड़ाती है। नहीं, एल्गोरिदम को ठीक करें या जब भी नौकरी बड़ी हो जाए तो आप इसे उड़ा देंगे।

सबसे छोटा ढेर जो .NET आपको 250 KB चुनने देता है। यदि आप एक मान को छोटा करते हैं तो यह चुपचाप इसे गोल करता है। जरूरी है क्योंकि जिटर और कचरा कलेक्टर दोनों को अपना काम पूरा करने के लिए स्टैक स्पेस की आवश्यकता होती है। फिर, ऐसा करना काफी अनावश्यक होना चाहिए। यदि आप ऐसा करने पर विचार करते हैं क्योंकि आपके पास बहुत सारे धागे हैं और सभी स्टैच के साथ वर्चुअल मेमोरी का उपभोग करते हैं तो आपके पास बहुत सारे धागे हैं। एक StackOverflowException आप प्राप्त कर सकते हैं सबसे nastiest रनटाइम अपवादों में से एक है। प्रक्रिया मृत्यु तत्काल और अप्रत्याशित है।

मुख्य धागे के लिए स्टैक आकार EXE शीर्षलेख में एक विकल्प द्वारा निर्धारित किया जाता है। कंपाइलर में इसे बदलने का विकल्प नहीं है, आपको .exe शीर्षलेख को पैच करने के लिए editbin.exe/stack का उपयोग करना होगा।

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