2013-02-19 91 views
5

हाइपोटेटिक रूप से, मान लीजिए कि मैं संभावित रूप से बहुत बड़ी फ़ाइल में अनुक्रमिक लेखन करना चाहता हूं।क्या मैडवाइस (___, ___, MADV_DONTNEED) ओएस को आलसी रूप से डिस्क पर लिखने का निर्देश देता है?

यदि मैं उस पूरे क्षेत्र में एक विशाल क्षेत्र और पागलपन (MADV_SEQUENTIAL) को mmap() करता हूं, तो मैं स्मृति को अपेक्षाकृत कुशल तरीके से लिख सकता हूं। यह मुझे ठीक काम करने के लिए मिल गया है।

अब, के रूप में मैं लिख रहा हूँ, मैं कभी कभी स्मृति के छोटे-छोटे टुकड़ों कि पहले से ही करने के लिए लिखा गया है पर एक munmap() प्रदर्शन विभिन्न ओएस संसाधनों को मुक्त करने के क्रम में। मेरी चिंता यह है कि munmap() और msync() मेरे धागे को अवरुद्ध कर देगा, डेटा को भौतिक रूप से डिस्क के लिए प्रतिबद्ध होने का इंतजार कर रहा है। मैं अपने लेखक को धीमा नहीं कर सकता, इसलिए मुझे एक और तरीका खोजने की ज़रूरत है।

यह छोटे, स्मृति के पहले से ही लिखा हिस्सा पर madvise (MADV_DONTNEED) का उपयोग करने के लिए बेहतर होगा? मैं ओएस को उस स्मृति को आलसी रूप से डिस्क पर लिखना चाहता हूं, और मेरे कॉलिंग थ्रेड को अवरुद्ध नहीं करना चाहता हूं।

madvise पर मैनपेज() इस में क्या कहना है, जो बल्कि अस्पष्ट है:

MADV_DONTNEED 
Do not expect access in the near future. (For the time being, the 
application is finished with the given range, so the kernel can free 
resources associated with it.) Subsequent accesses of pages in this 
range will succeed, but will result either in re-loading of the memory 
contents from the underlying mapped file (see mmap(2)) or 
zero-fill-on-demand pages for mappings without an underlying file. 
+0

मैं यह कोशिश नहीं करता; फ़ाइल मैपिंग पर 'MADV_DONTNEED' का अर्थ इस अर्थ के रूप में किया जा सकता है कि आप चाहते हैं कि ओएस * फाइल में परिवर्तन * फेंक दें। – zwol

+0

@Zack, क्या आपके पास MADV_DONTNEED को किसी फ़ाइल में परिवर्तनों को छोड़ने का संदर्भ है? – Anton

+1

@antonm http://man7.org/tlpi/code/online/dist/vmem/madvise_dontneed.c.html में एक प्रोग्राम है जो इसे प्रदर्शित करता है (दुर्भाग्यवश, स्वयं को निहित नहीं, बल्कि संशोधित करने में आसान)। । क्षेत्र अब जरूरत है कर्नेल मुक्त कर सकते हैं इन पृष्ठों, * में कोई भी परिवर्तन के कारण: भी https://www.gnu.org/software/libc/manual/html_node/Memory_002dmapped-I_002fO.html ("' MADV_DONTNEED' देखें पेज खो जाएंगे * "(जोर मेरा)) और 2005 से यह एलकेएमएल धागा: https://lkml.org/lkml/2005/6/28/188। – zwol

उत्तर

0

पहले madv_sequential, आक्रामक Readahead सक्षम बनाता है, तो आप इसे ज़रूरत नहीं है। दूसरा, ओएस आलसी फ़ाइल-बेक्ड मेमोरी को डिस्क पर वैसे भी लिखेंगे, भले ही आप कुछ भी नहीं करेंगे। लेकिन madv_dontneed इसे तुरंत स्मृति मुक्त करने के लिए निर्देश देगा (जिसे आप "विभिन्न os संसाधन" कहते हैं)। तीसरा, यह स्पष्ट नहीं है कि अनुक्रमिक लेखन के लिए एमएमएपी फाइलों का कोई फायदा है। आप शायद लिखकर (2) (लेकिन बफर का उपयोग करें - या तो मैनुअल या स्टडीओ) द्वारा बेहतर सेवा दी जाएगी।

+1

यह उत्तर सिर्फ गलत है, क्यों जवाब के लिए ऊपर देखें। – Eloff

+0

सही madv_dontneed भाग – pal

11

नहीं!

अपने स्वयं के अच्छे के लिए, MADV_DONTNEED से दूर रहना। लिनक्स नहीं इसे वापस लिखने के बाद पृष्ठों को फेंकने के संकेत के रूप में ले जाएं, लेकिन उन्हें तुरंत फेंकने के लिए। यह एक बग नहीं माना जाता है, लेकिन एक जानबूझकर निर्णय है।

विडंबना यह है कि तर्क है कि एक गैर विनाशकारी MADV_DONTNEED की कार्यक्षमता को पहले से ही दूसरी ओर msync(MS_INVALIDATE|MS_ASYNC), MS_ASYNC द्वारा दिया जाता है शुरू नहीं करता है मैं/हे (वास्तव में, यह कुछ भी नहीं सब पर तर्क है कि गंदा निम्नलिखित करता है, पेज writeback ठीक काम करता है वैसे भी), fsync हमेशा ब्लॉक, और sync_file_range ब्लॉक कर सकते हैं अगर आप कुछ अस्पष्ट सीमा से अधिक और प्रलेखन, जो कुछ भी तरह से माना जाता है "बेहद खतरनाक"।

किसी भी तरह से, आप msync(MS_SYNC) चाहिए, या fsync (दोनों अवरुद्ध), या sync_file_range (संभवतः अवरुद्ध) fsync द्वारा पीछा किया, या आप MADV_DONTNEED साथ डेटा खो देंगे। यदि आप संभवतः ब्लॉक करने का जोखिम नहीं उठा सकते हैं, तो आपके पास कोई विकल्प नहीं है, दुख की बात है, लेकिन इसे किसी अन्य धागे में करने के लिए।

+2

मुझे लगता है कि आपका मतलब है 'msync (MS_INVALIDATE ...' 'madvise()' – Hasturkun

+0

के बजाय यह सही है, धन्यवाद। – Damon

+0

@ डैमन आपके दृढ़ उत्तर [संदर्भित] [https://www.youtube। कॉम/घड़ी? v = bg6-LVCHmGM और सुविधा = youtu.be & t = 4426) [ब्रायन कैंटिल के 2015 सर्ज रेंट में लिनक्स के MADV_DONTNEED व्यवहार के बारे में] [https://www.youtube.com/watch?v=bg6-LVCHmGM&feature=youtu.be&t = 3518)। – Anon