दिलचस्प पोस्ट
स्विफ्ट में एक फ़ंक्शन से दूसरी सूची को पास करना "अंतर्निहित कनेक्शन बंद कर दिया गया था: भेजने पर एक अनपेक्षित त्रुटि आई।" SSL प्रमाणपत्र के साथ Matlab में जुड़े घटकों को कैसे खोजें? कैसे एक JUnit एक लकड़हारा में एक संदेश पर जोर दिया सी #: लैम्ब्डा के साथ पुनरावर्ती कार्य ASP.NET MVC रूटिंग – मार्गों के लिए .html एक्सटेंशन जोड़ें एक सरणी में अंतिम आइटम प्राप्त करें वेब अनुप्रयोग संदर्भ / रूट अनुप्रयोग संदर्भ और लेनदेन प्रबंधक सेटअप ऑरेकल पर हाइबरनेट अनुक्रम, @ जनरेटेड वैल्यू (रणनीति = जनरेशन टाइप। एओटीओ) java: फ़्लोट को फ्लोट में स्ट्रिंग और स्ट्रिंग में कनवर्ट करें कैसे एक div अंदर एक तत्व को स्क्रॉल करने के लिए? HTML5: "रेडियो" इनपुट फ़ील्ड के साथ "अपेक्षित" विशेषता का उपयोग कैसे करें जावा स्विंग में एक छवि प्रदर्शित करना जावा में एक यूटीएफ -8 बीओएम कैसे जोड़ें सत्र समयबाह्य पर asp.NET पुश रीडायरेक्ट

पॉसिक्स अतुल्यकालिक I / O (एआईओ) की स्थिति क्या है?

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

मैं जानना चाहता हूं:

  • पॉसिक्स एआईओ का उद्देश्य क्या है? यह देखते हुए कि कार्यान्वयन का सबसे स्पष्ट उदाहरण मुझे मिल सकता है, यह कहता है कि यह सॉकेट्स का समर्थन नहीं करता है, पूरी बात मेरे लिए अजीब लगती है क्या यह सिर्फ async डिस्क I / O के लिए है? यदि हां, तो हाइपर-सामान्य एपीआई क्यों? यदि नहीं, तो डिस्क आई / ओ पहली चीज जिस पर हमला हुआ है?
  • वहां कहाँ पूर्ण POSIX AIO प्रोग्राम हैं, जिन्हें मैं देख सकता हूं?
  • क्या कोई वास्तव में इसका इस्तेमाल करता है, असली के लिए?
  • क्या प्लेटफॉर्म POSIX AIO समर्थन करते हैं? वे किस हिस्से का समर्थन करते हैं? क्या कोई वास्तव में निहित "किसी भी I / O को किसी भी एफडी" का समर्थन करता है जो कि <aio.h> वादा करता है?

मेरे लिए उपलब्ध अन्य मल्टीप्लेज़िंग तंत्र पूरी तरह से अच्छे हैं, लेकिन जानकारी के यादृच्छिक टुकड़े ने मुझे उत्सुक बना दिया है।

Solutions Collecting From Web of "पॉसिक्स अतुल्यकालिक I / O (एआईओ) की स्थिति क्या है?"

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

डिस्क लिखना I / O पहले से बफ़र्ड है और पढ़ा जाने वाला डिस्क I / O को बफ़र में posix_fadvise जैसे फ़ंक्शन का उपयोग करके प्रीफ़ेच किया जा सकता है। वह एआईओ के लिए एकमात्र उपयोगी उद्देश्य के रूप में सीधी, बिना सीडी डिस्क आई / ओ को छोड़ देता है

डायरेक्ट, अनबर्फ I / O ट्रांसेक्शनल डेटाबेस के लिए वास्तव में उपयोगी है, और वे अपनी डिस्क I / O का प्रबंधन करने के लिए अपने थ्रेड या प्रक्रिया लिखते हैं।

इसलिए, अंत में जो पॉसिक्स एआईओ को किसी भी उपयोगी उद्देश्य की सेवा नहीं करने की स्थिति में छोड़ देता है। इसका उपयोग न करें

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

यदि आप सॉकेट I / O करने की तलाश कर रहे हैं, तो आप संभवतः उपर्युक्त तंत्र में से किसी एक का उपयोग कर बेहतर हैं।

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

लिखने के संचालन को आमतौर पर कर्नेल द्वारा कैश किया जाता है और बाद के समय में फ़्लेम किया जाता है। उदाहरण के लिए, जब ड्राइव का पढ़ा जाने वाला सिर उस स्थान से पारित होता है जहां ब्लॉक लिखा जाना है

हालांकि, पढ़ने के कार्य के लिए, यदि आप कर्नेल को अपनी पढ़ाई को प्राथमिकता और ऑर्डर करना चाहते हैं, तो एआईओ वास्तव में एकमात्र विकल्प है। यही कारण है कि कर्लन (सैद्धांतिक रूप से) किसी भी उपयोगकर्ता स्तर के अनुप्रयोग से बेहतर कर सकता है:

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

उस ने कहा, posix एआईओ एक काफी अजीब इंटरफ़ेस है, उदाहरण के लिए:

  • इवेंट कॉलबैक का एकमात्र कुशल और अच्छी तरह से समर्थित माध्य सिग्नल के माध्यम से होता है, जो लाइब्रेरी में उपयोग करना कठिन बनाता है, चूंकि यह प्रक्रिया-वैश्विक सिग्नल नेमस्पेस से संकेत संख्याओं का उपयोग करने का मतलब है। यदि आपका ओएस वास्तविक समय संकेतों का समर्थन नहीं करता है, तो इसका मतलब यह है कि आपको अपने सभी बकाया अनुरोधों के माध्यम से पाश करना होगा कि वास्तव में समाप्त हो गया (उदाहरण के लिए मैक ओएस एक्स के मामले में, लिनक्स नहीं)। बहु-थ्रेडेड परिवेश में सिग्नल को पकड़ने में कुछ मुश्किल प्रतिबंध भी हैं। आप आमतौर पर सिग्नल हैंडलर के भीतर ईवेंट पर प्रतिक्रिया नहीं दे सकते हैं, लेकिन आपको एक सिग्नल उठाना होगा, एक पाइप पर लिखना होगा या लिनक्स पर () signalfd का उपयोग करना होगा।
  • lio_suspend () के समान समस्याएं चयन () करता है, यह नौकरियों की संख्या के साथ बहुत अच्छी तरह से पैमाने पर नहीं है
  • lio_listio (), जैसा कि लागू किया गया है काफी सीमित संख्या में नौकरियां जो आप पास कर सकते हैं, और इस सीमा को पोर्टेबल तरीके से खोजने के लिए तुच्छ नहीं है। आपको sysconf (_SC_AIO_LISTIO_MAX) को कॉल करना पड़ सकता है, जो असफल हो सकता है, जिस स्थिति में आप AIO_LISTIO_MAX परिभाषित कर सकते हैं, जो जरूरी नहीं है, लेकिन फिर आप 2 का उपयोग कर सकते हैं, जिसे समर्थित होने की गारंटी के रूप में परिभाषित किया गया है।

पॉज़िक्स एआईओ का इस्तेमाल करते हुए वास्तविक-विश्व अनुप्रयोग के लिए, आप हल्के (पीठ) पर एक नज़र डाल सकते हैं, जिसने समर्थन की शुरुआत करते समय एक प्रदर्शन मापन भी पोस्ट किया था।

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

मेरा मानना ​​है कि यह किसी भी एफडी के लिए पोज़िक्स एआईओ का समर्थन नहीं करने के लिए ओएस के बीच काफी सामान्य है, लेकिन इसे नियमित फाइलों पर सीमित करना

एक libtorrent डेवलपर इस पर एक रिपोर्ट प्रदान करता है: http://blog.libtorrent.org/2012/10/asynchronous-disk-io/

वहाँ aio_write है – glibc में कार्यान्वित; एओ_ब्रेड या एओआई_लिटेट फ़ंक्शन के पहले कॉल में कई यूजर मोड थ्रेड्स, एओ_लिट या एओआईड पोस्ट की थ्रेड पर अनुरोध होता है, थ्रेड प्रीड / पीलाइट होता है और जब यह समाप्त हो जाता है तो इसका जवाब अवरुद्ध कॉलिंग थ्रेड पर पोस्ट किया जाता है।

थर भी 'असली' है – कर्नेल स्तर द्वारा समर्थित (इसके लिए libaio की आवश्यकता है, Iio_submit कॉल http://linux.die.net/man/2/io_submit देखें ); इसके लिए भी O_DIRECT की आवश्यकता होती है (सभी फाइल सिस्टमों द्वारा भी समर्थित नहीं हो सकता है, लेकिन प्रमुख लोग इसका समर्थन करते हैं)

यहाँ देखें:

http://lse.sourceforge.net/io/aio.html

http://linux.die.net/man/2/io_submit

Linux पर POSIX AIO और libaio के बीच का अंतर?