मैं निम्नलिखित समस्या है के साथ एक बड़े स्मृति मानचित्रण:शून्य `madvise`
मैं MAP_ANONYMOUS
साथ mmap
के माध्यम से स्मृति (कई GiB) की एक बड़ी हिस्सा आवंटित। उस हिस्से में एक बड़ा हैश नक्शा होता है जिसे हर समय और फिर शून्य करने की आवश्यकता होती है। पूरे मैपिंग का उपयोग प्रत्येक दौर में नहीं किया जा सकता है (प्रत्येक पृष्ठ में गलती नहीं होती है), इसलिए memset
एक अच्छा विचार नहीं है - बहुत लंबा लगता है।
इसे जल्दी से करने की सबसे अच्छी रणनीति क्या है?
विल
madvise(ptr, length, MADV_DONTNEED);
गारंटी मुझे उस किसी भी बाद पहुंच नया रिक्त पृष्ठ प्रदान करते हैं?
लिनक्स man madvise
इस पृष्ठ से:
इस कॉल (MADV_DONTNEED के मामले को छोड़कर) आवेदन के शब्दों को प्रभावित नहीं करता है, लेकिन इसके प्रदर्शन को प्रभावित कर सकते हैं। कर्नेल सलाह को अनदेखा करने के लिए स्वतंत्र है।
...
MADV_DONTNEED
इस रेंज सफल होगा में पृष्ठों के बाद पहुंच, लेकिन या तो अंतर्निहित मैप की फ़ाइल से स्मृति सामग्री के फिर से लोड करने में परिणाम होगा (mmap को देखने के (2)) या अंतर्निहित फ़ाइल के बिना मैपिंग के लिए शून्य-भर-ऑन-डिमांड पेज।
...
वर्तमान लिनक्स कार्यान्वयन (2.4.0) विचार इस प्रणाली कॉल सलाह के रूप में की तुलना में एक आदेश के रूप में अधिक ...
या मैं munmap
करने के लिए है और इस क्षेत्र को पुन: मैप करना नए सिरे से?
यह लिनक्स पर काम करते हैं और आदर्श ओएस एक्स
मेरे पास इसका परीक्षण करने का कोई तरीका नहीं है, लेकिन एफडब्ल्यूआईडब्ल्यू, [ओएसएक्स] (https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man2/madvise.2। एचटीएमएल) मैन पेज में 'madvise'd पेज शून्य होने के बारे में कुछ भी उल्लेख नहीं है। [Posix] (http://pubs.opengroup.org/onlinepubs/009695399/functions/posix_madvise.html) संस्करण या तो नहीं है। मेमोरी स्पेस को फिर से मैप करने के लिए ओवरहेड विशाल है? – Collin
@ कोलिन यह अत्यधिक प्रदर्शन के रूप में नहीं है, लेकिन मुझे अपने धागे को निलंबित करने की आवश्यकता होगी और यदि आवश्यक हो तो पॉइंटर को नए मैपिंग में अपडेट करें। यह अधिक समानांतर कोड है जो गलत हो सकता है ... और मैं उत्सुक हूं कि यह कॉल वास्तव में कैसे काम करता है। –