"उपयोगकर्ता-स्थान" धागे को लागू करने के लिए कई समाधान तैयार किए गए हैं। यह golang.org goroutines, पायथन के हरे धागे, सी # एएसआईएनसी, एरलांग की प्रक्रिया आदि हो। विचार यह है कि समवर्ती प्रोग्रामिंग को एक या सीमित संख्या में धागे के साथ भी अनुमति देना है।
यह एक अमूर्त परत है। कई लोगों के लिए इस अवधारणा को समझना और कई परिदृश्यों में इसे अधिक प्रभावी ढंग से उपयोग करना आसान है। कई मशीनों (एक अच्छा अमूर्त मानते हुए) के लिए यह भी आसान है, क्योंकि मॉडल कई मामलों में चौड़ाई से खींचने के लिए चलता है। Pthreads के साथ (एक उदाहरण के रूप में), आप सभी नियंत्रण है। अन्य थ्रेडिंग मॉडल के साथ, विचार सस्ता होने के लिए एक समवर्ती कार्य बनाने की प्रक्रिया के लिए, और एक पूरी तरह से अलग थ्रेडिंग मॉडल का उपयोग करने के लिए धागे का पुन: उपयोग करना है। इस मॉडल को पचाना कहीं आसान है; सीखने और मापने के लिए कम है, और परिणाम आम तौर पर अच्छे होते हैं।
जो मुझे समझ में नहीं आता है, ओएस धागे इतने महंगे क्यों हैं? जैसा कि मैंने इसे देखा है, किसी भी तरह से आपको कार्य के ढेर (ओएस थ्रेड, या यूजरलैंड थ्रेड) को सहेजना है, जो कुछ दस किलो किलोबाइट है, और आपको दो कार्यों के बीच स्थानांतरित करने के लिए शेड्यूलर की आवश्यकता है।
धागा बनाना महंगा है, और ढेर को स्मृति की आवश्यकता होती है। साथ ही, यदि आपकी प्रक्रिया कई धागे का उपयोग कर रही है, तो संदर्भ स्विचिंग प्रदर्शन को मार सकती है। तो हल्के थ्रेडिंग मॉडल कई कारणों से उपयोगी हो गए। ओएस थ्रेड बनाना मध्यम से बड़े कार्यों के लिए आदर्श रूप से कम संख्या में एक अच्छा समाधान बन गया। यह प्रतिबंधित है, और बनाए रखने के लिए काफी समय ले रहा है।
एक कार्य/थ्रेड पूल/उपयोगकर्तालैंड थ्रेड को संदर्भ स्विचिंग या थ्रेड निर्माण के बारे में चिंता करने की आवश्यकता नहीं है। यह अक्सर उपलब्ध होने पर संसाधन का पुन: उपयोग करता है, अगर यह अब तैयार नहीं है - यह भी, इस मशीन के लिए सक्रिय धागे की संख्या निर्धारित करें "।
अधिक आम तौर पर (आईएमओ), ओएस स्तर धागे महंगी हैं क्योंकि इन्हें इंजीनियरों द्वारा सही ढंग से उपयोग नहीं किया जाता है - या तो बहुत सारे हैं और संदर्भ स्विचिंग का एक टन है, संसाधनों के एक ही सेट के लिए प्रतिस्पर्धा है, कार्य बहुत छोटे हैं। ओएस थ्रेड का सही तरीके से उपयोग करने के तरीके और प्रोग्राम के निष्पादन के संदर्भ में सर्वोत्तम तरीके से आवेदन करने के तरीके को समझने में अधिक समय लगता है।
ओएस इन दोनों कार्यों को मुफ्त में प्रदान करता है।
वे उपलब्ध हैं, लेकिन वे स्वतंत्र नहीं हैं। वे जटिल हैं, और अच्छे प्रदर्शन के लिए बहुत महत्वपूर्ण हैं। जब आप ओएस थ्रेड बनाते हैं, तो इसे 'जल्द ही' दिया जाता है - सभी प्रक्रिया 'समय धागे के बीच विभाजित होता है। यह उपयोगकर्ता धागे के साथ आम मामला नहीं है। जब संसाधन उपलब्ध नहीं होता है तो कार्य अक्सर प्रायोजित होता है। इससे संदर्भ स्विचिंग, मेमोरी और थ्रेड की कुल संख्या कम हो जाती है जिसे बनाया जाना चाहिए। जब कार्य निकलता है, धागा एक और दिया जाता है।
आप डीलरों से कार्ड वितरित करने के लिए कैसे कहेंगे?
ओएस शेड्यूलर के तहत, यह (थ्रेड) प्राथमिकता पर आधारित होगा। प्रत्येक व्यक्ति को एक समय में एक कार्ड दिया जाएगा (सीपीयू समय), और प्राथमिकता का निरंतर मूल्यांकन किया जाएगा।
लोग कार्य या धागे के काम का प्रतिनिधित्व करते हैं। कार्ड समय और संसाधनों का प्रतिनिधित्व करते हैं। डीलरों धागे और संसाधनों का प्रतिनिधित्व करते हैं।
यदि 2 डीलर और 3 लोग थे तो आप सबसे तेजी से कैसे निपटेंगे? और यदि 5 डीलर और 500 लोग थे? सौदे करने के लिए कार्ड से बाहर निकलने से आप कैसे कम कर सकते हैं? धागे के साथ, कार्ड जोड़ने और डीलरों को जोड़ने का कोई समाधान नहीं है जिसे आप 'मांग पर' दे सकते हैं। सीपीयू जोड़ना डीलरों को जोड़ने के बराबर है। थ्रेड जोड़ना एक समय में अधिक लोगों को कार्ड से निपटने वाले डीलरों के बराबर है (संदर्भ स्विचिंग बढ़ता है)। कार्ड को अधिक तेज़ी से निपटाने के लिए कई रणनीतियां हैं, खासकर जब आप निश्चित समय में कार्ड की लोगों की आवश्यकता को खत्म कर देते हैं। क्या एक टेबल पर जाने के लिए तेज़ नहीं होगा और जब तक कि लोगों के अनुपात में डीलर 1/50 नहीं था, तब तक उनका खेल पूरा होने तक किसी व्यक्ति या लोगों से निपटना नहीं होगा? प्राथमिकता के आधार पर प्रत्येक तालिका पर जाने और सभी डीलरों (ओएस दृष्टिकोण) के बीच विज़िट समन्वय करने के लिए इसकी तुलना करें। इसका मतलब यह नहीं है कि ओएस बेवकूफ है - इसका तात्पर्य है कि ओएस थ्रेड बनाना एक इंजीनियर है जो अधिक लोगों और अधिक तालिकाओं को जोड़ता है, संभावित रूप से डीलरों से अधिक उचित रूप से संभाल सकता है। सौभाग्य से, अन्य मल्टीथ्रेडिंग मॉडल और उच्च abstractions का उपयोग करके कई मामलों में बाधाओं को उठाया जा सकता है।
ओएस थ्रेड "हरे" धागे से अधिक महंगा क्यों होना चाहिए? प्रत्येक "कार्य" के लिए समर्पित ओएस थ्रेड होने के कारण अनुमानित प्रदर्शन में गिरावट का कारण क्या है?
आप एक प्रदर्शन महत्वपूर्ण निम्न स्तर सूत्रण पुस्तकालय (जैसे pthreads पर) विकसित हैं, तो आप पुन: उपयोग के महत्व को समझते हैं (और एक मॉडल उपयोगकर्ताओं के लिए उपलब्ध के रूप में अपने पुस्तकालय में इसे लागू)। उस कोण से, उच्च स्तरीय मल्टीथ्रेडिंग मॉडल का महत्व वास्तविक दुनिया के उपयोग के आधार पर एक सरल और स्पष्ट समाधान/अनुकूलन है, साथ ही यह आदर्श है कि मल्टीथ्रेडिंग को अपनाने और प्रभावी ढंग से उपयोग करने के लिए प्रवेश बार को कम किया जा सकता है।
ऐसा नहीं है कि वे महंगी हैं - हल्के धागे के मॉडल और पूल कई समस्याओं के लिए एक बेहतर समाधान है, और उन इंजीनियरों के लिए एक अधिक उपयुक्त अमूर्तता है जो धागे को अच्छी तरह समझ नहीं पाते हैं। मल्टीथ्रेडिंग की जटिलता इस मॉडल के तहत बहुत सरल (और वास्तविक दुनिया के उपयोग में अक्सर अधिक सक्षम) है। ओएस धागे के साथ, आपके पास अधिक नियंत्रण होता है, लेकिन जितना संभव हो उतना प्रभावी रूप से उनका उपयोग करने के लिए कई और विचार किए जाने चाहिए - इन विचारों पर ध्यान देना नाटकीय रूप से किसी प्रोग्राम के निष्पादन/कार्यान्वयन को दोहरा सकता है। उच्च स्तरीय abstractions के साथ, इन जटिलताओं में से कई को कार्य निष्पादन (चौड़ाई बनाम खींच) के प्रवाह को पूरी तरह से बदलकर कम किया जाता है।
वे महंगे नहीं मानते हैं, वे हैं। मेरा मानना है कि कुछ हरे धागे (हास्केल का?) वजन केवल कुछ किलोबाइट वजन है, यानी सौ गुना छोटा है। एक और मुद्दा: मानक पायथन धागे हरे नहीं हैं - जीआईएल के कारण उन्हें बहुप्रचार के साथ कुछ समस्याएं हैं, लेकिन फिर भी वे वास्तविक ओएस धागे हैं (शायद आप 'हरितलेट' के बारे में सोच रहे हैं? ये एक अलग कहानी हैं, और वास्तव में हरे रंग की तरह धागे)। – delnan
@ डेलन ठीक है, मैंने सुना है। लेकिन मुझे अभी भी यकीन नहीं है कि वे और अधिक महंगा क्यों होना चाहिए। दोनों को ढेर को बचाने और संदर्भ स्विच करने की आवश्यकता है (जीआईएल को अनदेखा करें, कई गैर-अजगर उदाहरण हैं)। –