2012-03-19 9 views
5

मैंने अभी एक article पढ़ा है जो शून्य-प्रतिलिपि तंत्र बताता है।स्केटर/इकट्ठा ऑपरेशंस के साथ और बिना शून्य प्रतिलिपि

यह स्कैटर/गदर समर्थन के साथ और बिना शून्य प्रतिलिपि के बीच के अंतर के बारे में बात करता है।

एसजी समर्थन बिना एनआईसी, डेटा प्रतियां के रूप में इस प्रकार एसजी समर्थन साथ

enter image description here

एनआईसी कर रहे हैं, डेटा प्रतियां के रूप में

enter image description here

एक में इस प्रकार हैं शब्द, एसजी समर्थन के साथ शून्य प्रतिलिपि एक सीपीयू प्रति को खत्म कर सकते हैं।

मेरा प्रश्न यह है कि क्यों कर्नेल बफर में डेटा बिखराया जा सकता है?

उत्तर

12

क्योंकि डिफ़ॉल्ट रूप से लिनक्स कर्नेल की मैपिंग/मेमोरी आवंटन सुविधाएं वस्तुतः-संगत लेकिन संभावित रूप से शारीरिक रूप से विघटित स्मृति क्षेत्रों को बनाएगी।
इसका मतलब है कि फाइल सिस्टम से पढ़ा गया है जो sendfile() आंतरिक रूप से कर्नेल वर्चुअल मेमोरी में बफर पर जाता है, जिसे डीएमए कोड को "ट्रांसमोग्रिफाइफ़" (बेहतर शब्द की कमी के लिए) में नेटवर्क कार्ड का डीएमए इंजन कुछ ऐसा करना पड़ सकता है grok।

के बाद से डीएमए (अक्सर लेकिन हमेशा नहीं) भौतिक पते का उपयोग करता है, कि आप का मतलब है या तो, वरना (स्मृति के एक विशेष रूप से आवंटित शारीरिक रूप से-contigous क्षेत्र, अपने सॉकेट बफर ऊपर में) डेटा बफर नकल इसे एक-भौतिक-पृष्ठ-पर-एक-समय स्थानांतरित करें।

यदि आपका डीएमए इंजन, दूसरी तरफ, एक भौतिक रूप से अलग-अलग स्मृति क्षेत्रों को एक डेटा ट्रांसफर (जिसे "स्कैटर-इकट्ठा" कहा जाता है) में एकत्र करने में सक्षम है, तो बफर की प्रतिलिपि बनाने के बजाय, आप बस एक पास कर सकते हैं भौतिक पतों की सूची (कर्नेल बफर के शारीरिक रूप से संगत उप-खंडों को इंगित करते हुए, यह आपके कुल वर्णक ऊपर है) और अब आपको प्रत्येक भौतिक पृष्ठ के लिए एक अलग डीएमए स्थानांतरण शुरू करने की आवश्यकता नहीं है। यह आमतौर पर तेज़ होता है, लेकिन क्या यह किया जा सकता है या नहीं, डीएमए इंजन की क्षमताओं पर निर्भर करता है।

3

पुन: मेरा सवाल यह है कि क्यों कर्नेल बफर में डेटा बिखराया जा सकता है?

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

सुविधा के साथ, आप नेटवर्क कार्ड को एक डेटाग्राम दे सकते हैं जो स्मृति में विभिन्न पते पर टुकड़ों में तोड़ दिया जाता है, जो मूल सॉकेट बफर के संदर्भ हो सकता है। कार्ड इसे उन स्थानों से पढ़ेगा और इसे एक इकाई के रूप में भेज देगा।

बिना इकट्ठा (हार्डवेयर सरल, रैखिक बफ़र्स की आवश्यकता है) एक आंकड़ारेख एक समीपवर्ती आवंटित बाइट स्ट्रिंग के रूप में तैयार किया जाना है, और सभी डेटा अंतर्गत आता है जो यह है करने के लिए बफ़र्स हैं कि से memcpy -d जगह में होना करने के लिए सॉकेट पर संचरण के लिए कतारबद्ध।

2

क्योंकि जब आप सॉकेट में लिखते हैं, तो पैकेट के शीर्षलेख आपके उपयोगकर्ता-डेटा से अलग जगह पर इकट्ठे होते हैं, इसलिए नेटवर्क पैकेट में एकत्रित होने के लिए, डिवाइस को कम से कम प्राप्त करने के लिए "इकट्ठा" क्षमता की आवश्यकता होती है शीर्षलेख और डेटा।

सीपीयू को डेटा पढ़ने के लिए भी बचने के लिए (और इस प्रकार, बेकार सामानों के साथ अपने कैश को भरें, इसे कभी भी फिर से आवश्यकता नहीं है), नेटवर्क कार्ड को भी अपना आईपी और टीसीपी चेकसम उत्पन्न करना होगा (मैं हूं यहां टीसीपी मानते हैं, क्योंकि 99% थोक डेटा स्थानान्तरण टीसीपी होने जा रहे हैं)। यह ठीक है, क्योंकि आजकल वे सभी कर सकते हैं।

मुझे यकीन नहीं है कि यह सब TCP_CORK के साथ कैसे इंटरैक्ट करता है।

अधिकांश प्रोटोकॉल अपने स्वयं के हेडर हो जाते हैं, तो एक काल्पनिक प्रोटोकॉल की तरह दिखता है:

ग्राहक: अनुरोध भेजें सर्वर: कुछ मेटाडेटा भेजें; फ़ाइल डेटा

तो हमारे पास स्मृति में कुछ शीर्षलेखों को इकट्ठा करने, एक लिखने() जारी करने के लिए एक सर्वर अनुप्रयोग होता है, जिसके बाद एक sendfile() - ऑपरेशन की तरह। मुझे लगता है कि हेडर अभी भी इस मामले में कर्नेल बफर में कॉपी हो गए हैं।

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