2010-01-20 17 views
43

इसमें .NET में कार्यकर्ता की विस्तृत लेकिन सरल विवरण और मैं/हे धागे को खोजने के लिए बहुत मुश्किल हैकार्यकर्ता की सरल वर्णन और मैं/हे धागे

क्या मेरे लिए स्पष्ट इस विषय के बारे में (है, लेकिन नहीं हो सकता है तकनीकी रूप से सटीक):

  • कार्यकर्ता धागे धागे हैं कि चाहिए अपने काम के लिए काम सीपीयू;
  • आई/ओ धागे (जिसे "समापन बंदरगाह धागे" भी कहा जाता है) उनके काम के लिए डिवाइस ड्राइवरों को नियोजित करना चाहिए और अनिवार्य रूप से "कुछ भी नहीं", केवल गैर-सीपीयू संचालन को पूरा करने की निगरानी करें।

क्या स्पष्ट नहीं है:

  • हालांकि विधि ThreadPool.GetAvailableThreads दोनों प्रकार के उपलब्ध थ्रेड की संख्या देता है, ऐसा लगता है मैं/हे धागा के लिए काम करते शेड्यूल करने के लिए कोई सार्वजनिक एपीआई है। आप मैन्युअल रूप से .NET में वर्कर थ्रेड बना सकते हैं?
  • ऐसा लगता है कि एकल I/O थ्रेड एकाधिक I/O संचालन की निगरानी कर सकता है। क्या यह सच है? यदि हां, तो क्यों थ्रेडपूल में डिफ़ॉल्ट रूप से इतने सारे उपलब्ध I/O थ्रेड हैं?
  • कुछ ग्रंथों में मैंने कॉलबैक पढ़ा, आई/ओ ऑपरेशन पूरा होने के बाद आई/ओ थ्रेड द्वारा ट्रिगर किया गया। क्या यह सच है? क्या यह कार्यकर्ता धागे के लिए कोई काम नहीं है, क्योंकि यह कॉलबैक सीपीयू ऑपरेशन है?
  • अधिक विशिष्ट होने के लिए - एएसपी.NET एसिंक्रोनस पेज उपयोगकर्ता I/O धागे करें? कार्यकर्ता धागे की अधिकतम संख्या बढ़ाने के बजाय थ्रेड को अलग करने के लिए I/O कार्य को स्विच करने में प्रदर्शन लाभ वास्तव में क्या है? क्या ऐसा इसलिए है क्योंकि एकल I/O थ्रेड एकाधिक परिचालनों की निगरानी करता है? या I/O धागे का उपयोग करते समय विंडोज अधिक कुशल संदर्भ स्विचिंग करता है?

उत्तर

47

.net/CLR में 'वर्कर थ्रेड' शब्द आमतौर पर मुख्य धागे के अलावा किसी भी धागे को संदर्भित करता है जो थ्रेड को उत्पन्न करने वाले अनुप्रयोग की ओर से कुछ 'काम' करता है। 'कार्य' का अर्थ वास्तव में कुछ भी हो सकता है, जिसमें कुछ I/O को पूरा करने की प्रतीक्षा भी शामिल है। थ्रेडपूल कार्यकर्ता धागे की कैश रखता है क्योंकि धागे बनाने के लिए महंगे होते हैं।

.net/CLR में 'I/O थ्रेड' शब्द को "ओवरलैप्ड" win32 कॉल (जिसे "पूर्णता पोर्ट I/O" भी कहा जाता है) से मूल ओवरलैप किए गए कॉलबैक को प्रेषित करने के लिए थ्रेडपूल रिजर्व को संदर्भित करता है। सीएलआर अपना स्वयं का आई/ओ पूरा करने वाला बंदरगाह रखता है, और इसे किसी भी हैंडल को बांध सकता है (थ्रेडपूल.बिंडहैंडल एपीआई के माध्यम से)। उदाहरण यहां: http://blogs.msdn.com/junfeng/archive/2008/12/01/threadpool-bindhandle.aspx। कई .NET एपीआई नेटिव ओवरलैप्ड कॉलबैक प्राप्त करने के लिए आंतरिक रूप से इस तंत्र का उपयोग करते हैं, हालांकि ठेठ .NET डेवलपर इसे कभी भी सीधे उपयोग नहीं करेगा।

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

डेवलपर को आई/ओ कॉलबैक को संभालने के दौरान कुछ देखभाल करने की आवश्यकता होती है ताकि यह सुनिश्चित किया जा सके कि I/O थ्रेड थ्रेडपूल पर वापस आ गया है - यानी, I/O कॉलबैक कोड को आवश्यक न्यूनतम कार्य करना चाहिए कॉलबैक की सेवा करने के लिए और फिर थ्रेड के नियंत्रण को सीएलआर थ्रेडपूल पर वापस कर दें। यदि अधिक काम की आवश्यकता है, तो वह कार्य एक कार्यकर्ता धागे पर निर्धारित किया जाना चाहिए। अन्यथा, एप्लिकेशन को सामान्य वर्कर थ्रेड के रूप में उपयोग के लिए आरक्षित I/O समापन धागे के सीएलआर के पूल को 'अपहरण' का जोखिम उठता है, जिससे ऊपर वर्णित डेडलॉक स्थिति होती है।

आगे पढ़ने के लिए कुछ अच्छी संदर्भ: Win32 I/O पूर्णता बंदरगाहों: http://msdn.microsoft.com/en-us/library/aa365198(VS.85).aspx कामयाब ThreadPool: BindHandle की http://msdn.microsoft.com/en-us/library/0ka9477y.aspx उदाहरण: http://blogs.msdn.com/junfeng/archive/2008/12/01/threadpool-bindhandle.aspx

+1

तो कुछ एपीआई, जो एपीएम पैटर्न (उदाहरण के लिए - WebRequest) का पर्दाफाश, उपयोग ThreadPool.BindHandle विधि आंतरिक रूप से। BeginXXX विधि उपयोगकर्ता कॉलबैक प्रतिनिधि को ले जाएगा, कुछ डिवाइस ड्राइवर को काम देगी और थ्रेडपूल I/O थ्रेड को पूरा करने के लिए बाहरी डिवाइस के काम को पूरा करने के लिए पूरा करने के लिए "प्रतीक्षा" करने के लिए आरक्षित करें। जब अधिसूचना प्राप्त होती है, I/O थ्रेड उठता है और उपयोगकर्ता कॉलबैक प्रतिनिधि कोड चलाता है (जो पूल में I/O थ्रेड को तुरंत वापस करने के लिए तेज़ होना चाहिए)। – Konstantin

+1

तो कार्यकर्ता थ्रेड आमतौर पर उपयोगकर्ता कोड द्वारा निर्धारित कार्य चलाते हैं। और I/O थ्रेड आमतौर पर फ्रेमवर्क कोड द्वारा निर्धारित कार्य चलाते हैं, जो बाहरी उपकरणों के साथ इंटरैक्ट करता है और अपने काम को पूरा करने के लिए इंतजार करने की आवश्यकता होती है और उपयोगकर्ता कॉलबैक तर्क चलाती है, जब यह "बाहरी" काम पूरा हो जाता है। क्या यह सब सही समझ है? – Konstantin

+2

लगभग, लेकिन कैसे ओएस शेड्यूल वास्तविक I/O सीएलआर के लिए अपारदर्शी है। सीएलआर के आई/ओ धागे पूरा होने के लिए इंतजार नहीं कर रहे हैं; बल्कि ओएस ओ/ओ पूर्णता पोर्ट के माध्यम से सीएलआर को अलर्ट करता है जब काम पूरा हो जाता है। – alexdej

2

बस एक कार्यकर्ता धागा को काम की एक छोटी अवधि करने के लिए है और इसे पूरा होने पर खुद को हटा देगा। एक कॉलबैक का इस्तेमाल उस मूल प्रक्रिया को सूचित करने के लिए किया जा सकता है जिसे उसने पूरा कर लिया है या डेटा वापस पास किया है।

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

सभी प्रक्रियाएं धागे के रूप में चलती हैं। आपका एप्लिकेशन थ्रेड के रूप में चलता है। कोई भी धागा कार्यकर्ता धागे या I/O धागे को जन्म दे सकता है (जैसा कि आप उन्हें कॉल करते हैं)।

प्रदर्शन और संख्या या थ्रेड के प्रकार के बीच हमेशा एक अच्छा संतुलन होता है। एक प्रक्रिया द्वारा संभाले गए बहुत से कॉलबैक या घटनाएं इसके मुख्य प्रक्रिया पाश में बाधाओं की संख्या के कारण अपने प्रदर्शन को गंभीर रूप से खराब कर देगी क्योंकि यह उन्हें संभालती है।

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

0

कोई भी मेरे साथ अधिक कौशल के साथ यहां मदद करने के लिए कूदने जा रहा है।

श्रमिक धागे में बहुत सारे राज्य हैं, वे प्रोसेसर आदि द्वारा निर्धारित हैं और आप जो कुछ भी करते हैं उसे नियंत्रित करते हैं।

आईओ प्राप्ति बंदरगाह ऑपरेटिंग सिस्टम द्वारा बहुत ही विशिष्ट कार्यों के लिए प्रदान किए जाते हैं जो छोटे साझा राज्य से जुड़े होते हैं, और इस प्रकार उपयोग करने के लिए तेज़ होते हैं। .NET में एक अच्छा उदाहरण डब्ल्यूसीएफ ढांचा है। डब्ल्यूसीएफ सेवा में प्रत्येक "कॉल" वास्तव में एक आईओ प्राप्ति पोर्ट द्वारा निष्पादित किया जाता है क्योंकि वे लॉन्च करने के लिए सबसे तेज़ होते हैं और ओएस आपके लिए उनका ध्यान रखता है।

6

मैं एनटी में प्रोग्राम द्वारा एसिंक्रोनस I/O का उपयोग कैसे किया जाता है, इसके विवरण के साथ शुरू करूंगा।

आप Win32 एपीआई समारोह ReadFile (एक उदाहरण के रूप में) है, जो मूल निवासी एपीआई समारोह NtReadFile के चारों ओर एक आवरण है के साथ परिचित हो सकता है।

  • आप एक घटना वस्तु बनाने और इसे NtReadFile को पारित कर सकते हैं: इस समारोह आप अतुल्यकालिक आई/ओ के साथ दो काम करने की अनुमति देता है। जब पढ़ना ऑपरेशन पूरा हो जाता है तो इस घटना को तब संकेत दिया जाएगा।
  • आप NtReadFile पर एक एसिंक्रोनस प्रक्रिया कॉल (एपीसी) फ़ंक्शन पास कर सकते हैं। अनिवार्य रूप से इसका अर्थ यह है कि जब पढ़ना ऑपरेशन पूरा हो जाता है, तो फ़ंक्शन को उस थ्रेड पर कतारबद्ध किया जाएगा, जिसने ऑपरेशन शुरू किया था और जब थ्रेड अलर्ट करने योग्य प्रतीक्षा करता है तो इसे निष्पादित किया जाएगा।

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

एक सामान्य "कार्यकर्ता धागा" बहुत समान है; कतार से I/O परिणामों को हटाने के बजाय, यह कतार से कार्य आइटम हटा देता है। आप कार्य आइटम कतार (QueueUserWorkItem) कतारबद्ध कर सकते हैं और कार्यकर्ता धागे उन्हें निष्पादित कर सकते हैं। यह आपको हर बार एक थ्रेड को फेंकने से रोकता है जब आप एक कार्य को असंकालिक रूप से करना चाहते हैं।

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

  • कोई संबंधित समस्या नहीं^_^