2010-11-11 15 views
5

मैं कुछ कोड लिख रहा हूं जो कुछ धागे पैदा करता है (इस समय लगभग 512, लेकिन भविष्य में यह अधिक हो सकता है)। प्रत्येक धागे केवल कुछ ही संचालन करता है, इसलिए मैं ओवरहेड चाहता हूं कि धागे को सिस्टम पर न्यूनतम रखा जाए।सुरक्षित धागा ढेर आकार?

मैं pthread_attr_setstacksize() का उपयोग करके स्टैक आकार सेट कर रहा हूं, और मुझे PTHREAD_STACK_MIN से न्यूनतम स्वीकार्य स्टैक आकार मिल सकता है। लेकिन मेरा सवाल है: क्या थ्रेड स्टैक आकार के लिए PTHREAD_STACK_MIN का उपयोग करना सुरक्षित है? मैं गणना करने के बारे में कैसे जा सकता हूं कि मुझे कितना ढेर चाहिए? क्या कोई छुपा ओवरहेड है जो मुझे अपनी गणना में जोड़ना होगा?

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

उत्तर

4

थ्रेड स्टैक आकार को कम करने से ओवरहेड कम नहीं होगा (सीपीयू, मेमोरी उपयोग या प्रदर्शन के मामले में नहीं)। इस संबंध में आपकी एकमात्र सीमा आपके मंच पर धागे को दी गई कुल उपलब्ध वर्चुअल एड्रेस स्पेस है।

मैं डिफ़ॉल्ट स्टैक आकार का उपयोग तब तक करता हूं जब तक कोई प्लेटफ़ॉर्म समस्याएं प्रस्तुत नहीं करता है (यदि यह बिल्कुल होता है)। फिर समस्या उत्पन्न होने पर और जब स्टैक उपयोग को कम करें। हालांकि इससे वास्तविक प्रदर्शन के मुद्दों का कारण बन जाएगा, क्योंकि आपको ढेर को मारने की आवश्यकता होगी, या devise thread-dependent allocation कहीं और।

हिडन ओवरहेड्स शामिल हो सकते हैं: इस तरह के VLA, alloca() या पूरी तरह से स्थिर स्वत: सरणियों आकार द्वारा के रूप में स्टैक पर बड़ी सरणियों, की

  • आवंटन।
  • कोड जो आप नियंत्रित नहीं करते हैं या टेम्पलेट्स, फैक्ट्री क्लासेस इत्यादि के उपयोग के परिणामों से अवगत नहीं हैं। हालांकि, आपने सी ++ निर्दिष्ट नहीं किया है, यह एक समस्या होने की संभावना कम है।
  • लाइब्रेरी हेडर आदि से आयातित कोड इत्यादि। ये संस्करणों के बीच बदल सकते हैं और उनके ढेर, या यहां तक ​​कि थ्रेड उपयोग को महत्वपूर्ण रूप से बदल सकते हैं।
  • रिकर्सन। यह उपरोक्त बिंदुओं के कारण भी होता है, boost::bind, वैरैडिक टेम्पलेट्स, पागल मैक्रोज़, और फिर केवल स्टैक पर बफर या बड़ी ऑब्जेक्ट्स का उपयोग करके सामान्य रिकर्सन जैसी चीजों पर विचार करें।

आप स्टैक आकार को सेट करने, थ्रेड प्राथमिकताओं में हेरफेर करने और उन्हें निलंबित करने और आवश्यकतानुसार फिर से शुरू करने के अलावा, जो शेड्यूलर और सिस्टम प्रतिक्रिया में महत्वपूर्ण सहायता करेंगे। Pthreads आपको विवाद स्कोप सेट करने की अनुमति देता है; LWP और दायरे में शेड्यूलिंग में उनकी प्रदर्शन विशेषताओं में व्यापक रूप से भिन्नता है।

+0

धन्यवाद मैट। मुझे लगता है कि यह जवाब के करीब है जो मैं बाद में था। मुझे उम्मीद थी कि किसी को कहने के लिए "ऊपर sizeof() अपने सभी स्थानीय चर के जोड़ने के लिए, धागा भूमि के ऊपर के लिए 42 बाइट्स जोड़ने और फिर अच्छे भाग्य के लिए 10% जोड़ें" जा रहा था, लेकिन ऐसा लगता है कि संभावित रूप में बहुत अधिक कारक हैं कि खेलने पर। प्राथमिकताओं और निलंबन पर युक्तियों के लिए धन्यवाद। –

+2

@ ltn100: नहीं, यह अधिक "। अच्छी तरह से एक डिबग संदर्भ में जो अतिप्रवाह की पहचान करेगा, एक निर्दिष्ट ढेर आकार के साथ अपने कोड का परीक्षण फिर अच्छे भाग्य के लिए 10% जोड़ने" की तरह है। –

+2

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

7

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

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

+1

+1:

यहाँ कुछ उपयोगी लिंक कर रहे हैं लेकिन आप कोर की तुलना में अधिक धागे चाहते हो सकता है अपने धागे नियमित रूप से आईओ बाध्य कर रहे हैं ... –

+0

@ ओली लेकिन 50x ज्यादा नहीं। –

+4

@ सी। रॉस: निर्भर करता है कि मैं कैसे/I बाध्य हैं। ठीक है, तो वहाँ कि संसाधनों में अधिक कुशल हैं एक अतुल्यकालिक आई/ओ प्रणाली के निर्माण के लिए अन्य तरीकों (और मेरा समय में शायद कम कुशल, निर्भर करता है कितना अच्छा मैं घटना कतार, 'select', आदि के साथ कर रहा हूँ) कर रहे हैं, लेकिन अगर मेरी धागे नेटवर्क I/O के लिए इंतजार कर रहे 99.8% समय व्यतीत करने जा रहे हैं, तो मैं 500 धागे चाहता हूं। कभी-कभी रैम प्रोग्रामर से सस्ता होता है, कभी-कभी यह नहीं होता ;-) –

5

ढेर फ्रेम के लिए आवश्यक आकार संकलक आप उपयोग पर निर्भर करते हैं, मूल रूप से आप रजिस्टर आदि

आप चाहे पर विचार करना चाहिए की बचत अपने ऑटो चर, मापदंडों के आकार और वापसी पता के लिए कुछ भूमि के ऊपर अनुमान लगाने का प्रयास कर सकता है, यह Thread Pool का उपयोग करने का विकल्प होगा। चूंकि धागे का निर्माण मुफ्त में नहीं है।

+1

मैं करने के लिए कि धागा पूल आधुनिक कार्यान्वयन पर महत्वपूर्ण लाभ है के रूप में उलझन में हूँ। कोई भी 'लिनक्स थ्रेड' का उपयोग नहीं करता है और अब इस तरह हैक्स। क्या आपके पास थ्रेड सृजन की सापेक्ष लागत पर एक अद्यतित संदर्भ है? वास्तव में –

+1

। थ्रेड निर्माण लागत में भिन्न होता है, लेकिन आमतौर पर यह इन दिनों सस्ता है। हालांकि मुझे लगता है कि थ्रेड पूल के बारे में बिंदु अभी भी खड़ा है। वे विचार करने के लिए एक उपयोगी उपकरण हैं, लेकिन मुझे लगता है कि ज्यादातर लोग बस उनका उपयोग करने का कारण ढूंढने का प्रयास करते हैं। –

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