2008-11-01 10 views
8

मैं समझता हूं कि किसी एप्लिकेशन में बहुत सारे धागे बनाने से आप अन्य चल रही प्रक्रियाओं के लिए "अच्छा पड़ोसी" कह सकते हैं, क्योंकि सीपीयू और मेमोरी संसाधनों का उपभोग किया जाता है, भले ही ये धागे एक कुशल नींद की स्थिति में हों।पहली बार बनाए गए थ्रेड का कितना मेमोरी खपत करता है?

मुझे इसमें क्या रूचि है यह है: नींद के धागे से कितनी मेमोरी (win32 प्लेटफार्म) का उपभोग किया जा रहा है?

सैद्धांतिक रूप से, मैं कहीं 1 एमबी के क्षेत्र में मानता हूं (क्योंकि यह डिफ़ॉल्ट स्टैक आकार है), लेकिन मुझे पूरा यकीन है कि यह इससे कम है, लेकिन मुझे यकीन नहीं है कि क्यों।

इस पर किसी भी मदद की सराहना की जाएगी।

(कारण मैं पूछ रहा हूं कि मैं थ्रेड-पूल पेश करने पर विचार कर रहा हूं, और मैं समझना चाहता हूं कि मैन्युअल रूप से बनाए गए 20 की तुलना में 5 धागे का पूल बनाकर मैं कितनी मेमोरी बचा सकता हूं धागे)

+0

त्वरित संभावित सुधार - जैसा कि मैं इसे समझता हूं, 1 एमबी डिफ़ॉल्ट आरक्षित स्टैक आकार का आकार है। किसी भी एकल ढेर फ्रेम की तुलना में बहुत छोटा होने की संभावना है। –

+0

इसके लिए धन्यवाद - यह सुनिश्चित नहीं है कि जब मैंने लिखा था तो मैं क्या सोच रहा था! – Alan

+1

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

उत्तर

7

मैं एक सर्वर अनुप्रयोग जो धागा उपयोग में भारी है, यह एक विन्यास थ्रेड पूल जो ग्राहक द्वारा की स्थापना की है का उपयोग करता है, और कम से कम एक साइट में यह 1000 से अधिक धागे है, और जब तक शुरू कर दिया इसे इस्तेमाल करता है केवल 50 एमबी इसका कारण यह है कि विंडोज स्टैक के लिए 1 एमबी आरक्षित करता है (यह इसकी पता स्थान मानचित्र करता है), लेकिन यह आवश्यक नहीं है कि भौतिक स्मृति में आवंटित किया जाए, केवल इसका एक छोटा सा हिस्सा। यदि स्टैक उस से अधिक बढ़ता है तो पेज गलती उत्पन्न होती है और अधिक भौतिक स्मृति आवंटित की जाती है। मुझे नहीं पता कि प्रारंभिक आवंटन क्या है, लेकिन मुझे लगता है कि यह सिस्टम की पृष्ठ ग्रैन्युलरिटी (आमतौर पर 64 केबी) के बराबर है। बेशक, जब थ्रेड (टीएलएस, टीएसएस, इत्यादि) बनाया गया था, तो थ्रेड अन्य चीजों के लिए थोड़ी अधिक मेमोरी का उपयोग करेगा, लेकिन कुल के लिए मेरा अनुमान लगभग 200 केबी होगा। और ध्यान रखें कि किसी भी स्मृति जिसे अक्सर उपयोग नहीं किया जाता है वर्चुअल मेमोरी मैनेजर द्वारा अनलोड किया जाएगा।

+0

x86 और x64 के लिए पृष्ठ का आकार 4KB है, ia64 के लिए यह आमतौर पर 8KB है लेकिन कॉन्फ़िगर करने योग्य है। –

+0

आवंटन ग्रैन्युलरिटी (जैसा कि GetSystemInfo() से लौटाया गया है x86 और x64 पर 64 KB है। वर्चुअलअलोक() दस्तावेज कहता है कि आरक्षण आवंटन ग्रैन्युलरिटी द्वारा प्रतिबंधित हैं, लेकिन आरक्षित स्मृति के ब्लॉक में पृष्ठों को व्यक्तिगत रूप से प्रतिबद्ध किया जा सकता है। – bk1e

+0

इसके अलावा, रेमंड चेन ने कुछ साल पहले थ्रेड स्टैक आकार के बारे में ब्लॉग किया: http://blogs.msdn.com/oldnewthing/archive/2005/07/29/444912.aspx – bk1e

0

मुझे लगता है कि आपको इस तरह के कामकाजी कोड में परिवर्तन करने के किसी भी प्रभाव का पता लगाने में कठिनाई होगी - 20 धागे नीचे 5 तक। और फिर प्रबंधन के अतिरिक्त जटिलता (और ओवरहेड) को जोड़ें धागा पूल। शायद एम्बेडेड सिस्टम पर विचार करने लायक है, लेकिन Win32?

और आप जो कुछ भी चाहते हैं उसे स्टैक आकार सेट कर सकते हैं।

0

इस प्रणाली पर अत्यधिक निर्भर करता है:

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

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

मुझे संदेह है कि सोने के धागे में सिस्टम पर कोई भी (बहुत कम) प्रभाव पड़ता है।

  • यह किसी भी सीपीयू
  • किसी भी स्मृति एक माध्यमिक डिवाइस के लिए बाहर पृष्ठांकित किया जा सकता है यह उपयोग कर रहा है का उपयोग नहीं कर रहा है।
1

यदि आप Vista या Win2k8 का उपयोग कर रहे हैं तो बस मूल Win32 थ्रेडपूल API का उपयोग करें। इसे आकार देने का पता लगाएं। मैं वर्कलोड के विभाजन प्रकारों पर भी विचार करता हूं उदा। विभिन्न पूल में सीपीयू गहन बनाम डिस्क I/O।

MSDN ThreadPool एपीआई डॉक्स

http://msdn.microsoft.com/en-us/library/ms686766(VS.85).aspx

0

मैं इस काफी आसानी से मापा जा सकता है लगता है।

  1. एक धागा बनाने के बाद एक धागा
  2. डिफ़ॉल्ट सिस्टम मान (डिफ़ॉल्ट ढेर आकार और अन्य)
  3. संसाधनों की राशि प्राप्त के साथ एक धागा बनाने के लिए बनाने से पहले सिस्टम द्वारा प्रयुक्त संसाधनों की राशि प्राप्त करें और बनाने के अंतर (चरण 1 के साथ)।

ध्यान दें कि कुछ थ्रेड को डिफ़ॉल्ट मानों से अलग मान निर्दिष्ट करने की आवश्यकता है।

आप विभिन्न प्रकार के धागे (चरण 2) बनाकर औसत स्मृति उपयोग को आजमा सकते हैं और ढूंढ सकते हैं।

स्मृति ओएस द्वारा आवंटित जब एक धागा बनाने धागे के होते हैं स्थानीय डेटा: TCBTLS ...

wikipedia से: "धागे एक ढेर के अलावा नहीं स्वयं के संसाधनों से करते हैं, सहित रजिस्टरों की एक प्रति कार्यक्रम काउंटर, और धागा-स्थानीय भंडारण (यदि कोई है)। "

4

Fabios टिप्पणी करने के लिए जोड़ा जा रहा है:

मेमोरी अपनी दूसरी चिंता, अपना पहला नहीं है। थ्रेडपूल का उद्देश्य आम तौर पर सीपीयू कोर उपलब्ध होने की संख्या के साथ चलने वाले धागे के बीच संदर्भ स्विचिंग ओवरहेड को बाधित करना है।

एक संदर्भ स्विच बहुत महंगा है, अक्सर कुछ हज़ार से 10,000+ CPU चक्रों पर उद्धृत किया जाता है।

लगभग 15k निजी बाइट प्रति थ्रेड (999 धागे बनाए गए) में WinXP (32 बिट) घड़ियों पर एक छोटा परीक्षण। यह प्रारंभिक प्रतिबद्ध स्टैक आकार है, साथ ही ओएस द्वारा प्रबंधित कोई अन्य डेटा भी है।

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