2009-08-06 12 views
36

एक बार एक बार मैं Introduction to Indy आलेख में घुस गया और तब से गैर-अवरुद्ध आईओ बनाम अवरुद्ध करने के बारे में सोचना बंद नहीं कर सकता।ब्लॉकिंग आईओ बनाम गैर-अवरुद्ध आईओ; अच्छे लेखों की तलाश

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

उत्तर

15

सकारात्मक और नकारात्मक बहुत स्पष्ट कटौती कर रहे हैं:

अवरोधित करना - रेखीय प्रोग्रामिंग, कोड के लिए आसान, कम नियंत्रण।
गैर-अवरुद्ध - समांतर प्रोग्रामिंग, कोड के लिए अधिक कठिन, अधिक नियंत्रण।

44

अच्छी तरह से अवरुद्ध आईओ का मतलब है कि दिया गया धागा आईओ पूरी तरह से प्राप्त होने तक और कुछ नहीं कर सकता है (सॉकेट के मामले में यह प्रतीक्षा लंबे समय तक हो सकती है)।

गैर-अवरुद्ध आईओ का अर्थ है कि आईओ अनुरोध सीधे कतारबद्ध है और फ़ंक्शन वापस आता है। वास्तविक आईओ को तब कर्नेल द्वारा कुछ बाद के पॉइंटर पर संसाधित किया जाता है।

आईओ को अवरुद्ध करने के लिए आपको या तो यह स्वीकार करने की आवश्यकता है कि आप प्रत्येक आईओ अनुरोध के लिए इंतजार कर रहे हैं या आपको प्रति अनुरोध धागे को आग लगाना होगा (जो बहुत जटिल हो जाएगा)।

गैर-अवरुद्ध आईओ के लिए आप एकाधिक अनुरोध भेज सकते हैं लेकिन आपको यह ध्यान में रखना होगा कि डेटा कुछ "बाद में" बिंदु तक उपलब्ध नहीं होगा। यह जांच रहा है कि डेटा वास्तव में पहुंचा है शायद सबसे जटिल हिस्सा है।

99% अनुप्रयोगों में आपको अपने आईओ ब्लॉक की देखभाल करने की आवश्यकता नहीं होगी। कभी-कभी आपको आईओ अनुरोध शुरू करने की अनुमति देने के अतिरिक्त प्रदर्शन की आवश्यकता होती है और फिर वापस आने से पहले कुछ और करना पड़ता है और उम्मीद है कि आईओ अनुरोध पूरा हो गया है।

वैसे भी, बस मेरी tuppence।

+1

आईओ ब्लॉक होने पर प्रपत्र अनुप्रयोगों की देखभाल काफी 100% होती है। उपयोगकर्ताओं को लगी जीयूआई पसंद नहीं है। –

+7

आपको एक अलग थ्रेड चलाने से रोक नहीं रहा है जो सभी आईओ क्रमशः और अवरुद्ध करता है ... – Goz

0

मुझे अच्छे लेख नहीं मिला है।

मैं कैसे आईओ कोड async बाहर बिछाने के लिए पर सुझाव के लिए यहाँ अनुरोध किया है: tidy code for asynchronous IO

जवाब वास्तव में बहुत वार्मिंग नहीं थे।

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

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