jemalloc साझा स्मृति से आवंटित करने के लिए संशोधित किया जा सकता है? फ्रीबीएसडी फ़ंक्शन dallocx()
का तात्पर्य है कि आप आवंटन के लिए उपयोग करने के लिए एक पॉइंटर प्रदान कर सकते हैं, लेकिन को सभी उस स्मृति से आवंटन (न ही आकार सेट करें) प्रतिबंधित करने के लिए jemalloc
को बताने का एक स्पष्ट तरीका दिखाई नहीं देता है।jemalloc, mmap और साझा स्मृति?
dallocx()
समारोह स्मृतिptr
द्वारा संदर्भित करने के लिए भविष्य आवंटन के लिए उपलब्ध कराया जा कारण बनता है।
यदि नहीं, तो ऐसी सुविधा के लिए प्रयास का स्तर क्या है? मैं एक ऑफ-द-शेल्फ आवंटन योजना खोजने के लिए संघर्ष कर रहा हूं जो मैंने प्रदान किए गए साझा स्मृति अनुभाग से आवंटित कर सकते हैं।
इसी प्रकार, jemalloc
को स्वैपिंग रोकने के लिए स्मृति के लॉक क्षेत्र से आवंटित करने के लिए कॉन्फ़िगर किया जा सकता है?
मुझे प्रासंगिक कोड अनुभागों को इंगित करने के लिए स्वतंत्र महसूस करें जिन्हें संशोधन की आवश्यकता है और कोई विचार या सुझाव प्रदान करते हैं।
विचार मैं तलाश कर रहा हूँ - जब से तुम एक थ्रेडेड वातावरण में आवंटित करने के लिए एरेनास/ढेर बना सकते हैं क्योंकि jemalloc
विवाद को कम करने के करता है, अवधारणा एक बहु वातावरण में साझा स्मृति के क्षेत्रों के आवंटन के लिए स्केलेबल लगता है, यानी मैं बना mmap()
का उपयोग करके साझा मेमोरी के एन क्षेत्र, और मैं jemalloc
(या किसी भी आवंटन योजना) की शक्ति का लाभ उठाने के लिए जितना संभव हो उतना कुशलतापूर्वक आवंटित करना चाहता हूं, न्यूनतम थ्रेड विवाद, उन साझा क्षेत्रों में से एक, यानी थ्रेड/प्रक्रियाएं नहीं हैं समान साझा क्षेत्रों और क्षेत्रों तक पहुंचने के लिए, विवाद की संभावना न्यूनतम है और malloc
ऑपरेशन की गति में वृद्धि हुई है।
यह malloc()
एपीआई के साथ वैश्विक पूल आवंटन से अलग है क्योंकि आमतौर पर इन्हें वैश्विक लॉक को उपयोगकर्ता-स्थान को प्रभावी ढंग से क्रमबद्ध करने की आवश्यकता होती है। मैं इससे बचना चाहता हूं।
संपादित 2:
आदर्श रूप में इस तरह की एक एपीआई:
// init the alloc context to two shmem pools
ctx1 = alloc_init(shm_region1_ptr);
ctx2 = alloc_init(shm_region2_ptr);
(... bunch of code determines pool 2 should be used, based on some method
of pool selection which can minimize possibility of lock contention
with other processes allocating shmem buffers)
// allocate from pool2
ptr = malloc(ctx2, size)
यह मुझे XY समस्या के रूप में मारता है। क्या आप विशेष रूप से अपने साझा-स्मृति आवंटक के लिए जेमलोक के गुण चाहते हैं? जेमलोक का पूरा बिंदु यह है कि यह प्रदर्शन के लिए अनुकूलित करने के लिए एक ही प्रक्रिया में थ्रेड के बीच भी (स्मृति उपयोग के मामले में एक बड़ी कीमत पर) साझा करने से बचने का प्रयास करता है। यदि आप सिर्फ एक मॉलोक-जैसी एपीआई के साथ साझा-मेमोरी आवंटक चाहते हैं, तो यह एक बहुत ही सरल विषय है और इसमें जेमलोक शामिल नहीं है। –
AFAICT, 'dallocx()' 'free()' के बराबर है, इसलिए शायद आप जो चाहते हैं उसे नहीं। – Hasturkun
@ हस्तार्कुन - हाँ, मुझे लगता है कि मैं अत्यधिक आशावादी था कि मेरे बाद के लिए कुछ हुक प्रदान किया गया था। –