तैयारी बनाम पूर्णता Async IO मेमोरी उपयोग?


12

मैं Rust और कार्ल में दो संभावित मॉडल का उल्लेख करते हुए Async IO को लागू करने के बारे में यह बात देख रहा था । तत्परता और पूर्णता।

तत्परता मॉडल:

  • आप उस सॉर्ट को बताते हैं जिसे आप सॉकेट से पढ़ना चाहते हैं
  • थोड़ी देर के लिए अन्य चीजें करें ...
  • सॉकेट तैयार होने पर कर्नेल आपको बताता है
  • आप पढ़ते हैं (एक बफर भरें)
  • आपको जो कुछ भी चाहिए
  • बफर मुक्त (जंग के साथ स्वचालित रूप से होता है)

समापन मॉडल:

  • भरने के लिए आप कर्नेल के लिए एक बफर आवंटित करते हैं
  • थोड़ी देर के लिए अन्य चीजें करें ...
  • कर्नेल आपको बताता है कि बफर कब भरा गया है
  • डेटा के साथ आपको जो कुछ भी करना है वह करें
  • बफर को मुक्त करें

तत्परता मॉडल का उपयोग करने के कार्ल के उदाहरण में आप तैयार सॉकेट को भरने और एक वैश्विक बफर को मुक्त करने में मदद कर सकते हैं जिससे ऐसा लगता है कि यह बहुत कम मेमोरी का उपयोग करेगा ।

अब मेरी धारणाएँ:

हुड (कर्नेल स्थान में) के तहत जब एक सॉकेट को "तैयार" कहा जाता है, तो डेटा पहले से मौजूद है। यह नेटवर्क पर सॉकेट में आ गया है (या जहां से भी) और ओएस डेटा पर पकड़ बनाए हुए है।

ऐसा नहीं है कि स्मृति आवंटन जादुई रूप से तत्परता मॉडल में नहीं होता है। यह सिर्फ इतना है कि ओएस इसे आप से सार कर रहा है। कंप्लीशन मॉडल में, ओएस आपको डेटा को वास्तव में प्रवाहित होने से पहले मेमोरी आवंटित करने के लिए कह रहा है और यह स्पष्ट है कि क्या हो रहा है।

यहाँ मेरा संशोधित मॉडल का संस्करण है:

  • आप उस सॉर्ट को बताते हैं जिसे आप सॉकेट से पढ़ना चाहते हैं
  • थोड़ी देर के लिए अन्य चीजें करें ...
  • AMENDMENT: डेटा OS में आता है (कर्नेल मेमोरी में कुछ जगह)
  • कर्नेल आपको बताता है कि सॉकेट तैयार है
  • आप पढ़ते हैं (abover कर्नेल बफर से अलग एक और बफर भरें (या आपको इसके लिए एक संकेतक मिलता है?)
  • आपको जो कुछ भी चाहिए
  • बफर मुक्त (जंग के साथ स्वचालित रूप से होता है)

/ मेरी धारणाएँ

मैं उपयोगकर्ता-अंतरिक्ष कार्यक्रम को छोटा रखना पसंद करता हूं, लेकिन मैं अभी कुछ स्पष्ट करना चाहता हूं कि वास्तव में, यहां क्या हो रहा है। मैं नहीं देखता कि एक मॉडल स्वाभाविक रूप से कम मेमोरी का उपयोग करेगा या समवर्ती IO के उच्च स्तर का समर्थन करेगा। मुझे इस बारे में विचार और गहन विवरण सुनना अच्छा लगेगा।


मैं उस YouTube टॉक से भी यहां पहुंचा। किसी के लिए यह सीखने के लिए कि async IO या ईवेंट लूप को कैसे लागू किया जाए, Rust टीम के पास "Aysnc Interviews" की यह प्लेलिस्ट है, यहाँ समुदाय से बहुत जानकार लोगों का साक्षात्कार लिया गया है
cacoder

जवाबों:


5

Readiness मॉडल में मेमोरी खपत डेटा की मात्रा के लिए आनुपातिक है जो अनुप्रयोग द्वारा अनजाने में है।

पूर्णता मॉडल में मेमोरी की खपत बकाया सॉकेट कॉल की मात्रा के लिए आनुपातिक है।

अगर कई सॉकेट्स हैं जो ज्यादातर बेकार हैं, तो रेडीनेस मॉडल कम मेमोरी का उपभोग करता है।

कंप्लीशन मॉडल के लिए एक आसान तय है: 1 बाइट की एक रीडिंग शुरू करें। यह केवल एक छोटे बफर का उपभोग करता है। जब रीड पूरा हो जाता है तो एक और समस्या (शायद सिंक्रोनस) पढ़ी जाती है जो बाकी डेटा प्राप्त करती है।

कुछ भाषाओं में कंप्लीशन मॉडल लागू करने के लिए बेहद सरल है। मैं इसे एक अच्छा डिफ़ॉल्ट विकल्प मानता हूं।


1

कंप्लीशन मॉडल में, ओएस आपको डेटा को वास्तव में प्रवाहित होने से पहले मेमोरी आवंटित करने के लिए कह रहा है और यह स्पष्ट है कि क्या हो रहा है।

लेकिन अगर आपके द्वारा आवंटित स्थान से अधिक डेटा आता है तो क्या होगा? कर्नेल को अभी भी अपना स्वयं का बफर आवंटित करना है ताकि डेटा को न छोड़ा जाए। (उदाहरण के लिए, इस कारण usr के उत्तर कार्यों में उल्लिखित 1-बाइट रीड ट्रिक है।)

ट्रेडऑफ़ यह है कि जबकि कंप्लीशन मॉडल अधिक मेमोरी की खपत करता है, तो यह (कभी-कभी) कम कॉपी ऑपरेशन भी कर सकता है, क्योंकि बफ़र को रखने का मतलब है कि हार्डवेयर सीधे डीएमए या इसमें से बाहर निकल सकता है। मुझे यह भी संदेह है (लेकिन मुझे कम यकीन है) कि कंप्लीशन मॉडल वास्तविक कॉपी ऑपरेशन (जब यह मौजूद है) दूसरे धागे पर, कम से कम विंडोज 'IOCP के लिए करता है, जबकि Readiness मॉडल इसे गैर-अवरोधक के भाग के रूप में करता है read()या write()कहते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.