2012-05-10 11 views
14

जावा या सी # या कुछ अन्य भाषाओं में, गैर-अवरुद्ध आईओ सुविधाएं हैं, उदाहरण के लिए, सॉकेट के लिए।गैर-अवरुद्ध आईओ लागू कैसे किया जाता है?

तो मैं अपने कॉलबैक फ़ंक्शंस को गैर-अवरुद्ध आईओ को दे सकता हूं और एक बार जब गैर-अवरुद्ध आईओ कुछ प्राप्त करता है, तो यह मेरे कॉलबैक को कॉल करेगा।

मुझे आश्चर्य है कि वे कैसे कार्यान्वित किए जाते हैं। यदि मैं दृश्य के पीछे गैर-अवरुद्ध आईओ बना देता हूं, तो क्या जावा या सी # सिर्फ उनके लिए पृष्ठभूमि धागे बनाते हैं? या अंतर्निहित ओएस उनके लिए मूल समर्थन है?

+0

टिप्पणी यहाँ देखें: http://msdn.microsoft.com/en-us/library/dxkwh6zw.aspx। ऐसा लगता है कि एक पृष्ठभूमि थ्रेड का उपयोग होता है, जिसे कैश किया जाता है यदि एक ही संदर्भ का पुन: उपयोग किया जाता है। – mellamokb

+0

@mellamokb यह कहता है कि एक निष्पादन संदर्भ कैश किया गया है और फिर से उपयोग किया जाता है, यह धागे के बारे में कुछ भी नहीं कहता है। –

उत्तर

18

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

Win32-layer विवरणों पर कुछ विवरणों के लिए http://msdn.microsoft.com/en-us/library/windows/desktop/aa365683(v=vs.85).aspx देखें। इसके अलावा, मैं/O पूर्णता बंदरगाहों यहाँ के बारे में जानकारी:

  1. मैं कुछ आवेदन धागे पर एक async मैं/हे ऑपरेशन शुरू: http://msdn.microsoft.com/en-us/library/aa365198(VS.85).aspx

    मेरे समझ यह है।

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

चेतावनियां:

  1. मुझे यकीन है कि मैं इस गलत का हिस्सा हो गया हूँ, लेकिन मेरा मानना ​​है कि यह के समग्र सार सही है। एरिक या कोई अंदर आ सकता है और मुझे सही कर सकता है जहां मैं बंद हूं।

  2. .NET में एकाधिक I/O पूर्णता पोर्ट थ्रेड हैं। मुझे नहीं पता कि विभिन्न I/O समापन बंदरगाहों के बीच एसिंक I/O अनुरोध आवंटित किए गए हैं। यह एक ऑपरेटिंग सिस्टम सुविधा हो सकती है (जिसमें I/O किसी भी पोर्ट पर वापस आ सकता है जिसे एप्लिकेशन खोल दिया गया है)।

जावा के लिए मुझे यकीन है कि यह JVM कार्यान्वयन और विशेष ओएस पर निर्भर करता है। मुझे यह पता नहीं है कि इससे परे अनुमान लगाया जा सकता है।

संपादित करें: ऐतिहासिक अपडेट में कई और अधिक जानकारी के here

+0

आपका क्या मतलब है 'सी # के लिए अंतर्निहित ओएस समर्थन है ... '। ओएस को कोई ज्ञान नहीं है।नेट इसके शीर्ष पर चल रहा है और सिद्धांत रूप में .NET विंडोज और लिनक्स (मोनो के माध्यम से) दोनों पर चल सकता है। – Tudor

+0

@ ट्यूडर मैं –

+0

स्पष्टीकरण दूंगा – Jack

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