सॉकेट आई / ओ को कुशलता से केक्यू, एपोल, आईओ पूर्ण बंदरगाहों और पसंद के साथ हल किया गया है। एसिंक्रोनस फ़ाइल I / O करना एक देर से आने वाले कॉमरेड के अलावा है (विंडोज़ के अतिरिक्त I / O और सोलिस पॉज़िक्स AIO के लिए प्रारंभिक समर्थन)।
यदि आप सॉकेट I / O करने की तलाश कर रहे हैं, तो आप शायद उपरोक्त तंत्रों में से किसी एक का उपयोग करके बेहतर हैं।
AIO का मुख्य उद्देश्य अतुल्यकालिक डिस्क I / O की समस्या को हल करना है। यह सबसे अधिक संभावना है कि मैक ओएस एक्स केवल नियमित फ़ाइलों के लिए एआईओ का समर्थन करता है, न कि सॉकेट्स (क्योंकि केकेयू वैसे भी इतना बेहतर होता है)।
लिखने के संचालन को आमतौर पर कर्नेल द्वारा कैश किया जाता है और बाद में समय पर निकाल दिया जाता है। उदाहरण के लिए, जब ड्राइव का रीड हेड उस स्थान से होकर गुजरता है, जहां ब्लॉक लिखा जाना है।
हालाँकि, रीड ऑपरेशंस के लिए, यदि आप चाहते हैं कि कर्नेल आपके रीड्स को प्राथमिकता और ऑर्डर करे, तो AIO वास्तव में एकमात्र विकल्प है। यहां बताया गया है कि कर्नेल किसी भी उपयोगकर्ता स्तर के आवेदन से बेहतर (सैद्धांतिक रूप से) क्यों कर सकता है:
- कर्नेल सभी डिस्क I / O को देखता है, न कि आपके एप्लिकेशन डिस्क जॉब्स को, और वैश्विक स्तर पर उन्हें ऑर्डर कर सकता है
- कर्नेल (हो सकता है) यह जानता है कि डिस्क कहां पढ़ा गया है, और आप उस पर से गुजरने वाले पढ़े हुए कामों को चुन सकते हैं, ताकि सबसे कम दूरी तय की जा सके।
- कर्नेल आपके रीड ऑपरेशंस को और बेहतर बनाने के लिए देशी कमांड कतार का लाभ उठा सकता है
- आप रीडओव () की तुलना में lio_listio () का उपयोग करके प्रति सिस्टम कॉल पर अधिक रीड ऑपरेशंस जारी करने में सक्षम हो सकते हैं, खासकर यदि आपका रीड्स (तार्किक रूप से) संक्रामक नहीं है, तो सिस्टम कॉल ओवरहेड का एक छोटा सा बचत करना।
- आपका कार्यक्रम AIO के साथ थोड़ा सरल हो सकता है क्योंकि आपको पढ़ने या लिखने के लिए कॉल करने के लिए अतिरिक्त थ्रेड की आवश्यकता नहीं है।
उदाहरण के लिए, पॉज़िक्स AIO में एक बहुत ही अजीब इंटरफ़ेस है:
- ईवेंट कॉलबैक के एकमात्र कुशल और अच्छी तरह से समर्थित साधन सिग्नल के माध्यम से होते हैं, जो लाइब्रेरी में उपयोग करना कठिन बनाता है, क्योंकि इसका मतलब है प्रक्रिया-ग्लोबल सिग्नल नेमस्पेस से सिग्नल नंबर का उपयोग करना। यदि आपका ओएस रियलटाइम सिग्नल का समर्थन नहीं करता है, तो इसका मतलब यह भी है कि आपको अपने सभी बकाया अनुरोधों के माध्यम से यह पता लगाना होगा कि वास्तव में कौन समाप्त हुआ है (उदाहरण के लिए मैक ओएस एक्स के लिए यह मामला है, लिनक्स नहीं)। बहु-थ्रेडेड वातावरण में सिग्नल पकड़ना कुछ मुश्किल प्रतिबंधों के लिए भी बनाता है। आप आमतौर पर सिग्नल हैंडलर के अंदर की घटना पर प्रतिक्रिया नहीं दे सकते हैं, लेकिन आपको एक सिग्नल उठाना होगा, एक पाइप को लिखना होगा या सिग्नलफेड () (लिनक्स पर) का उपयोग करना होगा।
- lio_suspend () में सेलेक्ट () के समान ही मुद्दे हैं, यह नौकरियों की संख्या के साथ बहुत अच्छा नहीं है।
- lio_listio (), जैसा कि कार्यान्वित किया गया है काफी सीमित संख्या में नौकरियां हैं जो आप पास कर सकते हैं, और इस सीमा को पोर्टेबल तरीके से ढूंढना तुच्छ नहीं है। आपको sysconf (_SC_AIO_LISTIO_MAX) को कॉल करना होगा, जो विफल हो सकता है, इस स्थिति में आप AIO_LISTIO_MAX परिभाषित का उपयोग कर सकते हैं, जो आवश्यक रूप से परिभाषित नहीं हैं, लेकिन फिर आप 2 का उपयोग कर सकते हैं, जिसे समर्थित होने की गारंटी के रूप में परिभाषित किया गया है।
पॉज़िक्स एआईओ का उपयोग करके वास्तविक दुनिया के आवेदन के लिए, आप लाइटटैप (लाइटी) पर एक नज़र डाल सकते हैं, जिसने समर्थन शुरू करते समय एक प्रदर्शन माप भी पोस्ट किया ।
अधिकांश पॉज़िक्स प्लेटफ़ॉर्म अब तक पॉज़िक्स एआईओ (लिनक्स, बीएसडी, सोलारिस, एआईएक्स, ट्रू 64) का समर्थन करते हैं। विंडोज अपनी ओवरलैप की गई फ़ाइल I / O के माध्यम से इसका समर्थन करता है। मेरी समझ यह है कि केवल सोलारिस, विंडोज और लिनक्स वास्तव में एसिंक्स का समर्थन करते हैं। फ़ाइल I / O ड्राइवर के लिए नीचे सभी तरह से है, जबकि अन्य OSes async का अनुकरण करते हैं। कर्नेल थ्रेड्स के साथ I / O। लिनक्स अपवाद है, glibc में इसका पॉज़िक्स AIO कार्यान्वयन उपयोगकर्ता स्तर के थ्रेड्स के साथ async ऑपरेशंस का अनुकरण करता है, जबकि इसका मूल async I / O इंटरफ़ेस (io_submit () आदि) सही मायने में अतुल्यकालिक ड्राइवर के लिए नीचे है, यह मानते हुए कि ड्राइवर इसका समर्थन करता है। ।
मेरा मानना है कि OSS में किसी भी fd के लिए posix AIO का समर्थन नहीं करना, लेकिन इसे नियमित फ़ाइलों तक सीमित रखना सामान्य है।