थ्रेड भुखमरी को रोकें – सर्वोत्तम अभ्यास


मैं किसी एप्लिकेशन या सेवा में थ्रेड भुखमरी/ब्लॉकिंग/रेसिंग को रोकने के तरीके के बारे में अधिक जानकारी ढूंढ रहा हूं जो संभवतः एकाधिक प्रोसेसर/कोर पर एक साथ 200 थ्रेड तक चल सकता है।

मुझे ऑनलाइन मिले अधिकांश उदाहरण दिखाते हैं कि अधिकतम 3 या 4 थ्रेड के बीच कैसे समन्वय किया जाए और मैं एक ऐसे ऐप की योजना बना रहा हूं जिसमें सैकड़ों थ्रेड होंगे।

मैंने ऐसे एप्लिकेशन बनाए हैं जो 30 थ्रेड तक चले हैं, लेकिन उससे आगे जाने पर मुझे चिंता है कि कुछ थ्रेड को कोई सीपीयू समय नहीं मिल रहा है, सिंक्रोनाइज़ेशन का तो जिक्र ही नहीं।

मुझे कुछ सचमुच अच्छे लेख और ब्लॉग कहां मिल सकते हैं?
इस विषय पर सबसे अच्छी किताबें कौन सी हैं?
इस विषय पर बहुत सारी किताबें और लेख हैं, मैं सबसे अधिक जानकारीपूर्ण और निर्देशात्मक की तलाश में हूं लेकिन मेरी समझ से ऊपर की इंजीनियरिंग भाषा में प्रस्तुत नहीं किया गया है।

सभी सुझावों की सराहना की जाती है.

समाधान 1

कवर करने के लिए बहुत सारे परिदृश्य हैं इसलिए आपके प्रश्न का उत्तर देना असंभव है।

लेकिन, कोर की संख्या से अधिक सक्रिय थ्रेड का उपयोग आमतौर पर प्रतिकूल होता है। आप कोर की संख्या से अधिक थ्रेड का उपयोग करने से तभी लाभ उठा सकते हैं जब अधिकांश थ्रेड आमतौर पर सोना चाहते हैं, उदाहरण के लिए कुछ आईओ ऑपरेशंस जैसे कि recv() कॉल पर प्रतीक्षा करके जो नेटवर्क से डेटा प्राप्त करता है। उस स्थिति में भी आप समानांतर में निष्पादित थ्रेड्स की संख्या को सक्रिय रूप से नियंत्रित करना चाहते हैं, इसलिए 200 थ्रेड्स शुरू करना यह उम्मीद करना कि उनमें से केवल 4 समानांतर में चलना *चाहेंगे*, यदि आपके पास 4 कोर हैं तो यह अच्छा अभ्यास नहीं है।

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

हरे धागों का उपयोग करके आप एक धागे को कई हरे धागों में विभाजित कर सकते हैं और आप उपयोगकर्ता स्थान में स्पष्ट रूप से इन हरे धागों के बीच स्विचिंग/सहयोग का कार्य कर सकते हैं। मान लीजिए कि आपके पास 4 कोर हैं। फिर आप 4 थ्रेड शुरू कर सकते हैं और यदि आप प्रत्येक थ्रेड को 100 हरे थ्रेड में विभाजित करते हैं तो आपके पास 400 हरे थ्रेड होंगे लेकिन उनमें से केवल 4 किसी भी समय समानांतर में निष्पादित हो रहे हैं और आप अपना स्वयं का शेड्यूलर लिख सकते हैं क्योंकि आपके पास नियंत्रण है हरे धागों के बीच स्विच करने का कार्य।

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

コメント

タイトルとURLをコピーしました