मैं कच्चे ब्लॉक डिवाइस फ़ाइल से सीधे पढ़कर एक एसएसडी ड्राइव से डेटा पढ़ने के लिए एक सी प्रोग्राम लिख रहा हूं।लिनक्स कर्नेल असीमित I/O (एआईओ) अनुरोधों को कैसे संभालता है?
मैं लिनक्स एआईओ (मैं लिनक्स एआईओ एपीआई के बारे में बात कर रहा हूं, यानी linuxaio.h
, io_submit(...)
आदि द्वारा प्रदान किए गए कार्यों, POSIX एआईओ एपीआई नहीं) की कोशिश कर रहा हूं। मैं O_DIRECT
ध्वज का उपयोग कर ब्लॉक डिवाइस फ़ाइल खोलता हूं और मैं सुनिश्चित करता हूं कि मैं बफर को लिखने के लिए ब्लॉक आकार के साथ गठबंधन कर रहा हूं।
मैंने देखा कि लिनक्स एआईओ यह O_DIRECT
ध्वज के साथ सिंक्रोनस आईओ का उपयोग करने से काफी तेज है।
जो चीज़ मुझे सबसे ज्यादा हैरान करती है वह यह है कि लिनक्स एआईओ के साथ प्रत्येक केबी के कई छोटे यादृच्छिक पढ़ने को प्राप्त करने वाले थ्रूपुट को सिंक्रोनस I का उपयोग करके कुछ एमबी के बड़े (क्रमिक) पढ़ने के माध्यम से उल्लेखनीय रूप से अधिक होता है।/ओ और O_DIRECT
।
तो, मैं जानना चाहता हूं: लिनक्स एआईओ कैसे सिंक्रोनस I/O से बेहतर है? जब एआईओ का उपयोग किया जाता है तो कर्नेल क्या करता है? क्या कर्नेल अनुरोध को पुन: व्यवस्थित करता है? क्या लिनक्स एआईओ का उपयोग सिंक्रोनस I/O का उपयोग करने से अधिक CPU उपयोग में होता है?
धन्यवाद अग्रिम में एक बहुत
एआईओ तेज़ है क्योंकि इसका नाम है। इसके असीमित, मूल रूप से सभी आईओ स्मृति के लिए किया जाता है और अंतर्निहित डिस्क नहीं। –
@ मिलिने: यह बिल्कुल बिल्कुल समझ में नहीं आता है। डिस्क से यादृच्छिक पढ़ने के लिए पूरी तरह से डिस्क से भौतिक I/O की आवश्यकता होती है। डिस्क से स्मृति में उन बाइट्स को जादू करने का कोई तरीका नहीं है। – MSalters
मेरा मतलब था कि आईओ ज्यादातर स्मृति से किया जाता है जहां डेटा कैश किया जाता है। लिखा जाने वाला डेटा स्मृति में लोड किया गया है और फिर io को एप्लिकेशन में वापस कर दिया गया है। और स्मृति में वह पृष्ठ गंदा चिह्नित है। तो इसकी फाइल सिस्टम को उस पृष्ठ को डिस्क पर फ़्लश करने के लिए .. डायरेक्टियो के मामले में .. io तब तक वापस नहीं किया जाता है जब तक डेटा डिस्क पर लिखा नहीं जाता है –