प्रति कोर धागे की इष्टतम संख्या


281

मान लीजिए कि मेरे पास 4-कोर सीपीयू है, और मैं न्यूनतम समय में कुछ प्रक्रिया चलाना चाहता हूं। प्रक्रिया आदर्श रूप से समांतर है, इसलिए मैं इसे अनंत संख्या में थ्रेड्स पर चला सकता हूं और प्रत्येक थ्रेड में समान समय लगता है।

चूंकि मेरे पास 4 कोर हैं, इसलिए मैं कोर की तुलना में अधिक थ्रेड्स चलाकर किसी भी स्पीडअप की उम्मीद नहीं करता हूं, क्योंकि एक कोर केवल एक निश्चित समय पर एक ही थ्रेड चलाने में सक्षम है। मुझे हार्डवेयर के बारे में ज्यादा जानकारी नहीं है, इसलिए यह केवल एक अनुमान है।

क्या कोर की तुलना में अधिक थ्रेड्स पर एक समानांतर प्रक्रिया चलाने का लाभ है? दूसरे शब्दों में, क्या मेरी प्रक्रिया तेजी से, धीमी गति से, या लगभग उसी समय समाप्त हो जाएगी यदि मैं इसे 4 धागे के बजाय 4000 थ्रेड का उपयोग करके चलाता हूं?

जवाबों:


254

यदि आपके धागे I / O, सिंक्रोनाइज़ेशन आदि नहीं करते हैं, और कुछ और नहीं चल रहा है, तो प्रति कोर 1 धागा आपको सबसे अच्छा प्रदर्शन मिलेगा। हालाँकि यह बहुत संभव नहीं है। अधिक धागे जोड़ना आमतौर पर मदद करता है, लेकिन कुछ बिंदु के बाद, वे कुछ प्रदर्शन गिरावट का कारण बनते हैं।

कुछ समय पहले, मैं एक बहुत अच्छे लोड के तहत मोनो पर एक ASP.NET अनुप्रयोग चलाने वाले 2 क्वाड-कोर मशीन पर प्रदर्शन परीक्षण कर रहा था। हमने थ्रेड्स की न्यूनतम और अधिकतम संख्या के साथ खेला और अंत में हमें पता चला कि उस विशेष कॉन्फ़िगरेशन में उस विशेष एप्लिकेशन के लिए सबसे अच्छा थ्रूपुट कहीं 36 और 40 थ्रेड्स के बीच था। उन सीमाओं के बाहर कुछ भी बुरा प्रदर्शन किया। सबक सीखा? यदि मैं आप थे, तो मैं आपके आवेदन के लिए सही संख्या खोजने तक विभिन्न थ्रेड्स के साथ परीक्षण करूंगा।

सुनिश्चित करने के लिए एक बात: 4k धागे अधिक समय लेंगे। यह बहुत सारे संदर्भ स्विच है।


21
मुझे लगता है कि गोंजालो का जवाब अच्छा है। मैं सिर्फ इतना कहना चाहूंगा कि आपको प्रयोग करना चाहिए और मापना चाहिए। आपका कार्यक्रम उसके, या मेरे, या किसी और के और आपके कार्यक्रम के व्यवहार के केवल माप से आपके प्रश्नों का उत्तर देगा। समानांतर (या समवर्ती) कार्यक्रमों का प्रदर्शन ऐसा क्षेत्र नहीं है जहां अकेले पहले सिद्धांतों से अच्छे निष्कर्ष निकाले जा सकते हैं।
उच्च प्रदर्शन मार्क

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

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

4
प्रति कोर 1 धागा इष्टतम नहीं है। इसे थोड़ा और अधिक करने की आवश्यकता है, अधिमानतः दो बार कि यह एक और धागा को चलाने की अनुमति देगा यदि एक धागा अस्थायी रूप से अवरुद्ध है। भले ही केवल स्मृति पर। यदि आप सिस्टम (P4, I7, Sun Rock आदि) SMT / HT में रखते हैं तो यह अधिक महत्वपूर्ण है
Marco van de Voort

1
इसलिए "मेरे मामले में ऐसा नहीं होने की संभावना है"। सही संख्या का पता लगाना आवेदन और उस पर चलने वाली वास्तुकला पर निर्भर करता है।
गोंजालो

129

मैं @ गोंजालो के जवाब से सहमत हूं। मेरे पास एक ऐसी प्रक्रिया है जो I / O नहीं करती है, और यहाँ वही है जो मैंने पाया है:

यहां छवि विवरण दर्ज करें

ध्यान दें कि सभी थ्रेड्स एक सरणी पर काम करते हैं, लेकिन अलग-अलग रेंज (दो थ्रेड्स एक ही इंडेक्स तक नहीं पहुंचते हैं), इसलिए परिणाम भिन्न हो सकते हैं यदि उन्होंने अलग-अलग सरणियों पर काम किया हो।

1.86 मशीन एक एसएसडी के साथ मैकबुक एयर है। अन्य मैक सामान्य HDD के साथ एक iMac है (मुझे लगता है कि यह 7200 आरपीएम है)। विंडोज़ मशीन में 7200 आरपीएम एचडीडी भी है।

इस परीक्षण में, इष्टतम संख्या मशीन में कोर की संख्या के बराबर थी।


14
ग्राफ के लिए +1। स्पष्ट रूप से प्रति कोर 1 धागा सबसे अच्छा है, लेकिन यह दिलचस्प है कि क्वाड कोर सिस्टम उच्च थ्रेड नंबरों (<100 वैसे भी) पर नहीं लगता है जिस तरह से अन्य करते हैं।
जिम गैरिसन

46
-1 ग्राफ के लिए! पूर्णांक-मूल्यवान x- निर्देशांक के माध्यम से चिकना घटता है? 1 2 3 से 10 20 30 से 50 100 तक एक जंगली छलांग? और y- निर्देशांक जो अच्छे माप के लिए 10 प्लस 2 के गुणक हैं। यह एक्सेल का कर रहा है, है ना?

5
@Spacedman हाँ यह है। चिकनी घटता एक बहुत अच्छा लग रहा है IMHO है। : डी
मोटासिम

22
@PascalvKooten, समस्या यह नहीं है कि यह सुंदर लग रहा है, यह पहली नज़र में धोखा दे रहा है। सबसे पहले y- अक्ष 42 पर शुरू होता है, जो कि परीक्षणित मशीनों के बीच स्पष्ट अंतर को बढ़ाता है। दूसरे, एक्स-एक्सिस मानों की अजीब प्रगति बताती है कि 'टाइम-लेयर्ड' रैखिक रूप से 'थ्रेड्स की संख्या' के साथ स्केल नहीं करता है, यह विशेष रूप से ब्लू लाइन के लिए सच है। मुझे लगता है कि दूसरों को (अपने सहित) यह समस्या है कि यह डेटा को गलत तरीके से प्रस्तुत करता है।
pauluss86

13
@Spacedman ग्राफ पर आलोचक सबसे हास्यास्पद बात है जो मैं पिछले 24 घंटों में आया हूं। ग्राफ मदद करता है। बहुत। अवधि। क्या इसे और बेहतर किया जा सकता था? कोई परवाह नहीं करता है। असतत के बजाय चिकना वक्र? यही आपकी समस्या है ???? मुझे लगता है, आप सभी इस तरह के ग्राफ को कभी भी अपने उत्तर में शामिल नहीं करेंगे क्योंकि आपके पास अच्छा दिखने के लिए अतिरिक्त समय / ऊर्जा नहीं है। वह मेरी बात है।
टाइरेक्स

50

मुझे पता है कि यह सवाल पुराना है, लेकिन चीजें 2009 से विकसित हुई हैं।

अब ध्यान में रखने वाली दो चीजें हैं: कोर की संख्या, और प्रत्येक कोर के भीतर चलने वाले थ्रेड्स की संख्या।

इंटेल प्रोसेसर के साथ, थ्रेड्स की संख्या को हाइपरथ्रेडिंग द्वारा परिभाषित किया गया है जो कि सिर्फ 2 (उपलब्ध होने पर) है। लेकिन हाइपरथ्रेडिंग आपके निष्पादन समय में दो की कटौती करता है, तब भी जब 2 थ्रेड का उपयोग नहीं किया जाता है! (यानी 1 पाइपलाइन दो प्रक्रियाओं के बीच साझा की जाती है - यह अच्छा है जब आपके पास अधिक प्रक्रियाएं हों, अन्यथा बहुत अच्छा नहीं। अधिक कोर बेहतर तरीके से बेहतर हैं!)

अन्य प्रोसेसर पर आपके पास 2, 4 या 8 धागे हो सकते हैं। इसलिए यदि आपके पास 8 कोर हैं, जिनमें से प्रत्येक 8 थ्रेड्स का समर्थन करता है, तो आप संदर्भ स्विचिंग के बिना समानांतर चलने वाली 64 प्रक्रियाएं कर सकते हैं।

"कोई संदर्भ स्विचिंग" स्पष्ट रूप से सच नहीं है यदि आप एक मानक ऑपरेटिंग सिस्टम के साथ चलते हैं जो आपके नियंत्रण से बाहर अन्य सभी प्रकार के लिए संदर्भ स्विचिंग करेगा। लेकिन यह मुख्य विचार है। कुछ OS आपको प्रोसेसर आवंटित करते हैं इसलिए केवल आपके आवेदन में उक्त प्रोसेसर का उपयोग / उपयोग होता है!

मेरे अपने अनुभव से, यदि आपके पास बहुत सारे I / O हैं, तो कई धागे अच्छे हैं। यदि आपके पास बहुत भारी मेमोरी सघन कार्य है (स्रोत 1 पढ़ें, स्रोत 2 पढ़ें, तेज़ संगणना, लिखें) तो अधिक सूत्र होने से मदद नहीं मिलती है। फिर, यह इस बात पर निर्भर करता है कि आप एक साथ कितना डेटा पढ़ते / लिखते हैं (अर्थात यदि आप SSE 4.2 का उपयोग करते हैं और 256 बिट मानों को पढ़ते हैं, जो उनके चरण में सभी थ्रेड्स को रोक देता है ... दूसरे शब्दों में, 1 थ्रेड संभवतः लागू करने के लिए बहुत आसान है और वास्तव में तेज़ नहीं होने पर लगभग उतना ही तेज़। यह आपकी प्रक्रिया और मेमोरी आर्किटेक्चर पर निर्भर करेगा, कुछ उन्नत सर्वर अलग कोर के लिए अलग-अलग मेमोरी रेंज का प्रबंधन करते हैं इसलिए अलग-अलग थ्रेड्स तेजी से मान लेंगे कि आपका डेटा ठीक से दायर किया गया है ... यही वजह है कि, कुछ पर आर्किटेक्चर, 4 प्रक्रियाएं 4 थ्रेड्स के साथ 1 प्रक्रिया से अधिक तेज़ी से चलेंगी।)


4
शायद अन्य हैं, लेकिन मुझे पता है कि आईबीएम से पावर प्रोसेसर है। उनके पास प्रोसेसर के साथ 4 या 8 धागे वाले सिस्टम थे। अब वे अधिक कोर में क्रैंक कर सकते हैं, इसलिए वे प्रति के बजाय 2 धागे प्रदान करते हैं ...
एलेक्सिस विलके

यह पुराना है, लेकिन अधिकांश इंटेल i5 में, i7 में मल्टी थ्रेड सीपीयू है, उदाहरण के लिए i7 सीपीयू के आमतौर पर 4 कोर हैं, लेकिन 8 धागे हैं।
एडगर.ए।

4
प्रोसेसर में धागे नहीं हैं। उनके पास भौतिक और तार्किक कोर हैं। हाइपरथ्रेडिंग के साथ, एक एकल भौतिक कोर दो तार्किक कोर के रूप में कार्य करता है। मेरे पास एक ऐसी तकनीक थी जो इस बात पर जोर देती थी कि थ्रेड्स बनाने वाले प्रोसेसर एक वास्तविक चीज है, इसलिए मैंने प्रोसेसर के व्हाइटबोर्ड पर एक तस्वीर खींची जिसमें थ्रेड के धागे चिपके हुए थे।

@TechnikEmpire इस पर एक नज़र डालें intel.com/content/www/us/en/processors/core/... , हो सकता है तो आप इंटेल संपर्क करें और आकर्षित उन्हें भी धागे कर सकते हैं।
g7k

24

वास्तविक प्रदर्शन इस बात पर निर्भर करेगा कि प्रत्येक थ्रेड कितना स्वैच्छिक रूप से उपज देता है। उदाहरण के लिए, यदि थ्रेड्स कोई I / O बिल्कुल नहीं करते हैं और सिस्टम सिस्टम का उपयोग नहीं करते हैं (अर्थात वे 100% सीपीयू-बाउंड हैं) तो प्रति कोर 1 धागा इष्टतम है। यदि थ्रेड्स को प्रतीक्षा के लिए कुछ भी करना है, तो आपको थ्रेड्स की अधिकतम संख्या निर्धारित करने के लिए प्रयोग करना होगा। 4000 धागे महत्वपूर्ण शेड्यूलिंग ओवरहेड को उकसाएंगे, इसलिए शायद यह इष्टतम नहीं है।


21

उत्तर कार्यक्रम में उपयोग किए जाने वाले एल्गोरिदम की जटिलता पर निर्भर करता है। मैं दो बार थ्रेड्स 'n' और 'm' की संख्या के लिए Tn और Tm प्रसंस्करण समय के दो माप करके थ्रेड्स की इष्टतम संख्या की गणना करने के लिए एक विधि के साथ आया था। रैखिक एल्गोरिदम के लिए, थ्रेड्स की इष्टतम संख्या N = sqrt ((m n) होगी (Tm * (n-1) - Tn * (m-1))) / (n Tn-m Tm) होगी।

कृपया विभिन्न एल्गोरिदम के लिए इष्टतम संख्या की गणना के बारे में मेरा लेख पढ़ें: pavelkazenin.wordpress.com


4
इसे क्यों उतारा जाता है? मुझे खेद है लेकिन इस सवाल का सबसे अच्छा जवाब है। gonzalo प्रश्न के बोल्ड भाग को संबोधित करता है, और pkazen शीर्षक को संबोधित करता है। दोनों उत्तर बहुत उपयोगी हैं, लेकिन pkazen उत्तर प्रासंगिक है क्योंकि हमारे पास थ्रेड की संख्या को अनुमानित करने के लिए एक व्यवस्थित तरीका है। यहां तक ​​कि वह रैखिक एल्गोरिदम के लिए सूत्र भी देता है।
तोबियाक to to

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

इसके अलावा, मेरा मानना ​​है कि यह गणना मानती है कि आपके पास CPU कोर की अनंत संख्या है। हालांकि यह निश्चित रूप से मूल्यवान जानकारी है, प्रश्न कम संख्या में कोर के साथ वास्तविक मशीनों का उल्लेख कर रहा है।
नवनीत

9

मैंने सोचा कि मैं यहां एक और परिप्रेक्ष्य जोड़ूंगा। उत्तर इस बात पर निर्भर करता है कि प्रश्न कमजोर स्केलिंग या मजबूत स्केलिंग मान रहा है या नहीं।

से विकिपीडिया :

कमजोर स्केलिंग: समाधान समय प्रोसेसर की निश्चित समस्या आकार के लिए प्रोसेसर की संख्या के साथ कैसे बदलता है।

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

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

यह तब भी सही है जब धागे की संख्या कोर की संख्या से अधिक हो। उदाहरण के लिए मान लें कि कार्यक्रम में 8 मनमाना इकाई (या एयू) है जो 4 कोर मशीन पर निष्पादित किया जाएगा।

केस 1: चार थ्रेड्स के साथ चलाएं जहां प्रत्येक थ्रेड को 2AU को पूरा करना होगा। प्रत्येक थ्रेड को पूरा करने के लिए 10s लगते हैं ( बहुत सारी कैश मिस के साथ )। चार कोर के साथ समय की कुल राशि 10s (10s * 4 धागे / 4 कोर) होगी।

केस 2: आठ थ्रेड्स के साथ चलाएं जहां प्रत्येक थ्रेड को 1AU पूरा करना है। प्रत्येक थ्रेड केवल 2s लेता है ( कैश की कमी की मात्रा के कारण 5s के बजाय )। चार कोर के साथ समय की कुल राशि 4s (2s * 8 धागे / 4 कोर) होगी।

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


7

एक समय में ४००० धागे बहुत अधिक होते हैं।

जवाब हां और नहीं है। यदि आप प्रत्येक थ्रेड में बहुत सारे I / O को अवरुद्ध कर रहे हैं, तो हाँ, आप प्रति स्पीड 3 या 4 थ्रेड्स को तार्किक कोर तक कर सकते हैं।

यदि आप हालांकि बहुत सी अवरुद्ध चीजें नहीं कर रहे हैं, तो थ्रेडिंग के साथ अतिरिक्त ओवरहेड इसे धीमा कर देगा। तो एक प्रोफाइलर का उपयोग करें और देखें कि प्रत्येक संभावित समानांतर टुकड़े में अड़चनें कहां हैं। यदि आप भारी गणना कर रहे हैं, तो प्रति सीपीयू 1 से अधिक थ्रेड मदद नहीं करेगा। यदि आप बहुत अधिक मेमोरी ट्रांसफर कर रहे हैं, तो यह मदद नहीं करेगा। यदि आप बहुत सारे I / O कर रहे हैं, जैसे कि डिस्क एक्सेस या इंटरनेट एक्सेस के लिए, तो हाँ कई थ्रेड्स कुछ हद तक मदद करेंगे, या कम से कम एप्लिकेशन को अधिक उत्तरदायी बनाएंगे।


7

बेंचमार्क।

मैं एक एप्लिकेशन के लिए थ्रेड्स की संख्या को 1 से शुरू कर रहा हूं, और फिर 100 की तरह कुछ पर जाऊंगा, प्रत्येक थ्रेड के लिए तीन-पांच परीक्षण चलाऊंगा, और अपने आप को ऑपरेशन की गति बनाम थ्रेड्स की संख्या का एक ग्राफ बनाऊंगा। ।

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

आप परीक्षण नहीं कर सकते जब तक आप नहीं जान सकते।


3

आपको पता चलेगा कि आपके मशीन पर कितने थ्रेड हो सकते हैं जो htop या ps कमांड चलाकर आपके मशीन पर प्रक्रिया की संख्या लौटाते हैं।

आप 'ps' कमांड के बारे में मैन पेज का उपयोग कर सकते हैं।

man ps

यदि आप सभी उपयोगकर्ताओं की संख्या की गणना करना चाहते हैं, तो आप इनमें से किसी एक कमांड का उपयोग कर सकते हैं:

  1. ps -aux| wc -l
  2. ps -eLf | wc -l

एक उपयोगकर्ता प्रक्रिया की संख्या की गणना:

  1. ps --User root | wc -l

इसके अलावा, आप "htop" का उपयोग कर सकते हैं [संदर्भ] :

उबंटू या डेबियन पर स्थापित:

sudo apt-get install htop

Redhat या CentOS पर स्थापित करना:

yum install htop
dnf install htop      [On Fedora 22+ releases]

यदि आप स्रोत कोड से htop संकलित करना चाहते हैं, तो आप इसे यहां पाएंगे


2

आदर्श 1 थ्रेड प्रति कोर है, जब तक कि थ्रेड्स में से कोई भी ब्लॉक नहीं करेगा।

एक मामला जहां यह सच नहीं हो सकता है: कोर पर चलने वाले अन्य धागे हैं, ऐसे में अधिक धागे आपके प्रोग्राम को निष्पादन समय का एक बड़ा टुकड़ा दे सकते हैं।


यह इस बात पर निर्भर करता है कि क्या आप चाहते हैं कि उपयोगकर्ता पृष्ठभूमि प्रक्रियाएं बकवास की तरह चलें, जबकि आपका एप्लिकेशन तब चल रहा हो। उस बात के लिए आप प्रत्येक थ्रेड के लिए एक वास्तविक समय प्राथमिकता निर्धारित कर सकते हैं और अधिक से अधिक बिजली प्राप्त कर सकते हैं। लेकिन यूजर्स को मल्टीटास्किंग पसंद है।
२०:३५ पर अर्लज़ ११'०

2
खैर, हम एक जादुई आदर्श रूप से समानांतर अनुप्रयोग के साथ काम कर रहे हैं। अगर मैंने कभी ऐसी चीज बनाई तो मैं सीपीयू को हग करने का हकदार महसूस करूंगा।
संरक्षक

2

बहुत सारे थ्रेड्स ("थ्रेड पूल") बनाम एक प्रति कोर का एक उदाहरण लिनक्स या विंडोज में एक वेब-सर्वर को लागू करने का है।

चूंकि सॉकेट्स को लिनक्स में चुना जाता है, बहुत सारे थ्रेड्स सही समय पर सही सॉकेट को पोलिंग करने की संभावना को बढ़ा सकते हैं - लेकिन समग्र प्रसंस्करण लागत बहुत अधिक होगी।

विंडोज में सर्वर I / O कम्प्लीटेशन पोर्ट्स - IOCPs का उपयोग करके कार्यान्वित किया जाएगा - जो एप्लिकेशन इवेंट को संचालित करेगा: यदि I / O पूरा करता है तो OS इसे प्रोसेस करने के लिए स्टैंड-बाय थ्रेड लॉन्च करता है। जब प्रसंस्करण पूरा हो गया है (आमतौर पर एक और I / O ऑपरेशन के साथ एक अनुरोध-प्रतिक्रिया जोड़ी के रूप में) तो थ्रेड अगले पूर्ण होने तक प्रतीक्षा करने के लिए IOCP पोर्ट (कतार) पर लौटता है।

यदि कोई I / O पूरा नहीं हुआ है, तो कोई प्रसंस्करण नहीं किया जाना है और कोई धागा लॉन्च नहीं किया गया है।

दरअसल, Microsoft IOCP कार्यान्वयन में प्रति कोर एक से अधिक धागे की सिफारिश नहीं करता है। कोई भी I / O IOCP तंत्र से जुड़ा हो सकता है। यदि आवश्यक हो, तो IOC आवेदन द्वारा भी पोस्ट किया जा सकता है।


मुझे नहीं पता कि आप किस लिनक्स के बारे में बात कर रहे हैं, लेकिन कनेक्शन आने तक मेरे ब्लॉक। मेरा सुझाव है कि आप चुनिंदा () और FD_SET () और इसी तरह के कार्यों / मैक्रोज़ के बारे में कुछ बातें पढ़ें।
एलेक्सिस विलके

ठीक है, तो कोई अतुल्यकालिक रूप नहीं है जो तुरंत लौट आए?
ओलॉफ फोर्शेल

सेलेक्ट () मैन पेज से:timeout is an upper bound on the amount of time elapsed before select() returns. If both fields of the timeval structure are zero, then select() returns immediately. (This is useful for polling.) If timeout is NULL (no timeout), select() can block indefinitely.
एलेक्सिस विलके

0

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

लेकिन यह आपकी वास्तुकला पर भी निर्भर करता है। जहां से मैंने सुना है कि नियाग्रा प्रोसेसर किसी तरह की उन्नत पाइपलाइनिंग तकनीक का उपयोग करके एक ही कोर पर कई थ्रेड्स को संभालने में सक्षम होते हैं। हालाँकि मुझे उन प्रोसेसरों के साथ कोई अनुभव नहीं है।


0

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.