2010-02-19 25 views
13

मैक ओएस के तहत कच्चे (कभी-कभी प्रत्यक्ष कहा जाता है) i/o करने के लिए मैं जा रहा हूं। एप्लिकेशन को डिस्क पर अधिक सीधी पहुंच देने के लिए ऑपरेटिंग सिस्टम पेज कैश का कच्चा I/O मोड़। यह उपयोगी है क्योंकि मैं उपयोग कर रहा कुछ फाइल संरचना एलआरयू पेज प्रतिस्थापन का उपयोग कर कुशल नहीं हैं। पेज की प्रतिस्थापन एल्गोरिदम को लागू करने के लिए यह काफी सीधे आगे है, लेकिन पहले हमें ओएस एक्स डिफ़ॉल्ट बफरिंग को बंद करने की आवश्यकता है। फ़ाइलों को खोलते समय हमने O_DIRECT ध्वज का उपयोग करके लिनक्स के तहत इसे पहले ही कर लिया है। क्या किसी को पता है कि मैक ओएस के तहत पेज बफरिंग कैसे बंद करें?मैक ओएस एक्स पर रॉ आईओ कैसे करता है? (यानी लिनक्स के O_DIRECT ध्वज के बराबर)

चीयर्स टिम

उत्तर

11

मैन पेजों के माध्यम से कुछ और पढ़ने के बाद मुझे अंततः आदर्श उत्तर मिला। यह मैक ओएस वास्तव में O_DIRECT के लिए बहुत ही समान तंत्र है, हालांकि यह fcntl के माध्यम से खुले फ़ंक्शन के माध्यम से नहीं है। विशेष रूप से F_NOCACHE नामक एक विकल्प होता है जो आपको किसी विशेष फ़ाइल डिस्क्रिप्टर के लिए कैश को चालू या बंद करने की अनुमति देता है जो कि वही है जो मैं चाहता था। Fcntl के मैक वर्जन के साथ अन्य चीजों के पूर्ण रन डाउन के लिए http://developer.apple.com/mac/library/documentation/Darwin/Reference/ManPages/man2/fcntl.2.html देखें, और इसके सटीक उपयोग की व्याख्या। मुझे उम्मीद है कि यह जवाब किसी और की मदद करेगा।


http://lists.apple.com/archives/filesystem-dev/2007/Sep/msg00010.html एक अच्छा धागा बताते हैं कि कैसे F_NOCACHE झंडा अपने मैक ओएस संस्करण संख्या के आधार पर बर्ताव करता है।


अंतिम संहिता (बार में):

r1, r2, err := syscall.Syscall(syscall.SYS_FCNTL, uintptr(self.file.Fd()), syscall.F_NOCACHE, 1) 
    if err != 0 { 
     fmt.Printf("Syscall to SYS_FCNTL failed\n\tr1=%v, r2=%v, err=%v\n", r1, r2, err) 
     self.Close() 
     return false 
    } 
1

आप fopen के बजाय open उपयोग करने की आवश्यकता है और मेरा मानना ​​है कि वास्तव में कच्चे पहुँच आप से /dev/rdisk को पढ़ने के लिए है करने के लिए? सीधे

+1

मैं जानता हूँ कि जब linux के तहत इस दृष्टिकोण का उपयोग कर आप पहली बार "कच्चे" कमांड जो एक कच्चे चरित्र में ब्लॉक डिवाइस बदल जाता है का उपयोग कर डिवाइस माउंट करना होगा डिवाइस। क्या आपको ओएस एक्स के तहत समान खेल खेलना है? –

+0

ऐसा नहीं है कि मैं सोच सकता हूं। प्रत्येक ब्लॉक डिवाइस के लिए सिस्टम में दो डिवाइस होते हैं, एक उदाहरण है। */dev/disk0 * और अन्य */dev/rdisk0 * –

+2

खुले (फॉपेन के बजाए) का उपयोग सी लाइब्रेरी में बफरिंग से बचाता है, लेकिन क्या यह पूरी तरह से अलग करता है कि ओएस का पेज कैश कैसे काम करता है। जैसा कि नीचे बताया गया है F_NOCACHE जाने का तरीका है। – benno

2

आप madvise सिस्टम कॉल का उपयोग करना चाह सकते हैं। आप कर्नेल को संकेत दे सकते हैं कि MADV_DONTNEED या MADV_WILLNEED का उपयोग करके कौन से पृष्ठ पहले फ्लश करना चाहते हैं। ओएस एक्स mmap ध्वज MAP_NOCACHE का भी समर्थन करता है, जो कर्नेल को परिणामी पृष्ठों को पहले छोड़ने के लिए निर्देश देता है।

+0

+1, O_DIRECT ने इसे लगभग लिनक्स में नहीं बनाया क्योंकि लिनस चिंतित था कि उचित पोसिक्स सलाहकार हुक को कोई एक्सपोजर नहीं मिलेगा, जो समाप्त हो रहा है। अधिकांश लोग सिर्फ पागल/fadvise का उपयोग करने के बजाय O_DIRECT के लिए सही हो जाते हैं। O_DIRECT का उपयोग करने का एकमात्र कारण कारण है जब एक आरडीबीएमएस लिखना, या इसी तरह, जो अपने स्वयं के बफरिंग का 100% संभालता है। –

+2

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

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