मैं Rust और कार्ल में दो संभावित मॉडल का उल्लेख करते हुए Async IO को लागू करने के बारे में यह बात देख रहा था । तत्परता और पूर्णता।
तत्परता मॉडल:
- आप उस सॉर्ट को बताते हैं जिसे आप सॉकेट से पढ़ना चाहते हैं
- थोड़ी देर के लिए अन्य चीजें करें ...
- सॉकेट तैयार होने पर कर्नेल आपको बताता है
- आप पढ़ते हैं (एक बफर भरें)
- आपको जो कुछ भी चाहिए
- बफर मुक्त (जंग के साथ स्वचालित रूप से होता है)
समापन मॉडल:
- भरने के लिए आप कर्नेल के लिए एक बफर आवंटित करते हैं
- थोड़ी देर के लिए अन्य चीजें करें ...
- कर्नेल आपको बताता है कि बफर कब भरा गया है
- डेटा के साथ आपको जो कुछ भी करना है वह करें
- बफर को मुक्त करें
तत्परता मॉडल का उपयोग करने के कार्ल के उदाहरण में आप तैयार सॉकेट को भरने और एक वैश्विक बफर को मुक्त करने में मदद कर सकते हैं जिससे ऐसा लगता है कि यह बहुत कम मेमोरी का उपयोग करेगा ।
अब मेरी धारणाएँ:
हुड (कर्नेल स्थान में) के तहत जब एक सॉकेट को "तैयार" कहा जाता है, तो डेटा पहले से मौजूद है। यह नेटवर्क पर सॉकेट में आ गया है (या जहां से भी) और ओएस डेटा पर पकड़ बनाए हुए है।
ऐसा नहीं है कि स्मृति आवंटन जादुई रूप से तत्परता मॉडल में नहीं होता है। यह सिर्फ इतना है कि ओएस इसे आप से सार कर रहा है। कंप्लीशन मॉडल में, ओएस आपको डेटा को वास्तव में प्रवाहित होने से पहले मेमोरी आवंटित करने के लिए कह रहा है और यह स्पष्ट है कि क्या हो रहा है।
यहाँ मेरा संशोधित मॉडल का संस्करण है:
- आप उस सॉर्ट को बताते हैं जिसे आप सॉकेट से पढ़ना चाहते हैं
- थोड़ी देर के लिए अन्य चीजें करें ...
- AMENDMENT: डेटा OS में आता है (कर्नेल मेमोरी में कुछ जगह)
- कर्नेल आपको बताता है कि सॉकेट तैयार है
- आप पढ़ते हैं (abover कर्नेल बफर से अलग एक और बफर भरें (या आपको इसके लिए एक संकेतक मिलता है?)
- आपको जो कुछ भी चाहिए
- बफर मुक्त (जंग के साथ स्वचालित रूप से होता है)
/ मेरी धारणाएँ
मैं उपयोगकर्ता-अंतरिक्ष कार्यक्रम को छोटा रखना पसंद करता हूं, लेकिन मैं अभी कुछ स्पष्ट करना चाहता हूं कि वास्तव में, यहां क्या हो रहा है। मैं नहीं देखता कि एक मॉडल स्वाभाविक रूप से कम मेमोरी का उपयोग करेगा या समवर्ती IO के उच्च स्तर का समर्थन करेगा। मुझे इस बारे में विचार और गहन विवरण सुनना अच्छा लगेगा।