कस्टम हीप एलोकेटर


9

अधिकांश कार्यक्रम ढेर आवंटन के बारे में काफी आकस्मिक हो सकते हैं, यहां तक ​​कि कार्यात्मक प्रोग्रामिंग भाषाएं पुरानी वस्तुओं की तुलना में नई वस्तुओं को आवंटित करना पसंद करती हैं, और कचरा संग्रहकर्ता को मुक्त चीजों के बारे में चिंता करने दें।

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

गेम प्रोग्रामिंग (कम से कम उन खेलों के साथ जो हार्डवेयर को आगे बढ़ाने के बारे में महत्वाकांक्षी हैं) कभी-कभी बीच में आते हैं: आप गतिशील आवंटन का उपयोग कर सकते हैं, लेकिन पर्याप्त मेमोरी और सॉफ्ट रियल-टाइम बाधाएं हैं जो आप एक ब्लैक बॉक्स के रूप में आवंटनकर्ता का इलाज नहीं कर सकते हैं , अकेले कचरा संग्रहण का उपयोग करें, इसलिए आपको कस्टम आवंटनकर्ताओं का उपयोग करना होगा। यह उन कारणों में से एक है जो C ++ अभी भी खेल उद्योग में व्यापक रूप से उपयोग किए जाते हैं; यह आपको http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2271.html जैसी चीजें करने देता है

उस बीच के क्षेत्र में अन्य कौन से डोमेन हैं? जहां, खेल के अलावा, कस्टम एलोकेटर भारी उपयोग किए जाते हैं?


1
कुछ OS एक स्लैब आबंटक का उपयोग करते हैं जो ऑब्जेक्ट कैशिंग प्रदान करता है, लेकिन एक मोडुलो 2 ** एन अनुक्रमित कैश के लिए एक ऑब्जेक्ट के सदस्यों को मैप करके प्रोसेसर कैश संघर्ष को कम करने के लिए भी इस्तेमाल किया जा सकता है स्लैब के भीतर चर पैडिंग द्वारा)। कुछ मामलों में आवंटन / मुफ्त गति या मेमोरी उपयोग की तुलना में कैश व्यवहार अधिक महत्वपूर्ण हो सकता है।
पॉल ए। क्लेटन

जवाबों:


4

किसी भी समय आपके पास एक एप्लिकेशन है जिसमें एक प्रदर्शन-गहन महत्वपूर्ण पथ है, आपको चिंतित होना चाहिए कि आप स्मृति का इलाज कैसे करते हैं। अधिकांश एंड-यूज़र क्लाइंट-साइड एप्लिकेशन इस श्रेणी में नहीं आते हैं क्योंकि वे प्राथमिक इवेंट-चालित हैं और अधिकांश इवेंट उपयोगकर्ता के साथ इंटरैक्शन से आते हैं, और इसमें बहुत सारे (यदि कोई हो) प्रदर्शन की कमी है।

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

आपको कुछ उदाहरण देने के लिए ... अपनी पहली कंपनी में मैंने एक इतिहासकार पैकेज पर काम किया, प्रक्रिया नियंत्रण डेटा एकत्र करने / भंडारण / संग्रह करने के लिए ज़िम्मेदार सॉफ़्टवेयर, 10 मिलियन सेंसर के साथ एक कारखाने, परमाणु ऊर्जा संयंत्र या तेल रिफाइनरी के बारे में सोचें, हम उस डेटा को स्टोर करेंगे)। किसी भी समय हमने किसी भी प्रदर्शन की अड़चन का विश्लेषण किया जिसने इतिहासकार को अधिक डेटा संसाधित करने से रोका, ज्यादातर समय यह समस्या थी कि स्मृति को कैसे संभाला जाए। हम यह सुनिश्चित करने के लिए महान लंबाई के माध्यम से गए हैं कि जब तक वे पूरी तरह से आवश्यक नहीं थे, तब तक मॉलोक / मुक्त नहीं कहा जाता था।

अपनी वर्तमान नौकरी में, मैं निगरानी वीडियो डिजिटल रिकॉर्डर और विश्लेषण पैकेज पर काम करता हूं। 30 एफपीएस पर, प्रत्येक चैनल को हर 33 मिलीसेकंड में एक वीडियो फ्रेम प्राप्त होता है। हमारे द्वारा बेचे जाने वाले हार्डवेयर पर, हम आसानी से वीडियो के 100 चैनल रिकॉर्ड कर सकते हैं। इसलिए यह सुनिश्चित करने के लिए एक और मामला है कि महत्वपूर्ण पथ (नेटवर्क कॉल => कैप्चर घटकों => रिकॉर्डर प्रबंधन सॉफ़्टवेयर => भंडारण घटकों => डिस्क) में कोई गतिशील मेमोरी आवंटन नहीं है। हमारे पास एक कस्टम फ्रेम एलोकेटर है, जिसमें बफ़र्स की निश्चित आकार की बाल्टियाँ हैं और पहले से आवंटित बफ़र्स का पुन: उपयोग करने के लिए LIFO का उपयोग करता है। यदि आपको 600Kb संग्रहण की आवश्यकता है, तो आप 1024Kb बफर के साथ समाप्त हो सकते हैं, जो अंतरिक्ष को बर्बाद करता है, लेकिन क्योंकि यह हमारे उपयोग के लिए विशेष रूप से सिलवाया गया है, जहां प्रत्येक आवंटन बहुत अल्पकालिक है, यह बहुत अच्छी तरह से काम करता है क्योंकि बफर का उपयोग किया जाता है,

मैंने जिस प्रकार के अनुप्रयोगों का वर्णन किया है (ढेर सारे डेटा को ए से बी तक ले जाना और बड़ी संख्या में क्लाइंट रिक्वेस्ट को संभालना) ढेर पर जा रहा है और पीछे सीपीयू प्रदर्शन बाधाओं का एक प्रमुख स्रोत है। एक न्यूनतम करने के लिए ढेर विखंडन रखना एक माध्यमिक लाभ है, हालांकि जहां तक ​​मैं बता सकता हूं कि अधिकांश आधुनिक ओएस पहले से ही कम-विखंडन ढेर को लागू करते हैं ( कम से कम मुझे पता है कि विंडोज करता है, और मुझे उम्मीद है कि अन्य भी ऐसा करेंगे)। व्यक्तिगत रूप से, इन प्रकार के वातावरणों में काम करने वाले 12+ वर्षों में, मैंने सीपीयू के उपयोग के मुद्दों को ढेर से संबंधित देखा है, जबकि कभी भी मैंने कभी ऐसा सिस्टम नहीं देखा है जो वास्तव में खंडित हीप से पीड़ित हो।


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

4

वीडियो प्रोसेसिंग, वीएफएक्स, ऑपरेटिंग सिस्टम, आदि अक्सर लोग हालांकि उन्हें अति प्रयोग करते हैं। कुशल आवंटन प्राप्त करने के लिए डेटा संरचना और आवंटनकर्ता को अलग नहीं किया जाना चाहिए।

उदाहरण के लिए, यह ऑक्ट्री से दूर एक ऑक्ट्री में कुशल ट्री नोड आवंटन को विभाजित करने के लिए बहुत सी अतिरिक्त जटिलता का परिचय दे रहा है और एक बाहरी एलोकेटर पर भरोसा करता है। यह जरूरी नहीं कि एसआरपी का उल्लंघन हो, इन दो चिंताओं को एक साथ जोड़कर एक बार संदर्भ में कई नोड्स आवंटित करने के लिए ऑक्ट्री की जिम्मेदारी बनती है, क्योंकि ऐसा करने से परिवर्तन के कारणों की संख्या में वृद्धि नहीं होती है। यह, व्यावहारिक रूप से, इसे कम कर सकता है।

C ++ में, उदाहरण के लिए, मानक कंटेनर होने के मंद दुष्प्रभाव में से एक के लिए एक बाहरी संभाजक जुड़ा हुआ जैसी संरचनाएं बना दिया है पर भरोसा करते हैं std::mapऔर std::listसी ++ समुदाय द्वारा लगभग बेकार माना जाता है, क्योंकि वे उनके खिलाफ बेंचमार्किंग रहे हैंstd::allocatorजबकि ये डेटा संरचनाएं एक बार में एक नोड आवंटित करती हैं। बेशक आपके लिंक किए गए ढांचे उस मामले में खराब प्रदर्शन करने जा रहे हैं, लेकिन चीजें बहुत अलग तरीके से निकली होंगी अगर लिंक्ड संरचनाओं के लिए नोड्स के कुशल आवंटन को एक आवंटनकर्ता के बजाय डेटा संरचना की जिम्मेदारी माना जाता था। वे मेमोरी ट्रैकिंग / प्रोफाइलिंग जैसे अन्य कारणों के लिए अभी भी एक कस्टम आवंटन का उपयोग कर सकते हैं, लेकिन नोड को एक-बार-बार आवंटित करने की कोशिश करते समय लिंक किए गए संरचनाओं को कुशल बनाने के लिए आवंटनकर्ता पर भरोसा करना, उन सभी को डिफ़ॉल्ट रूप से, बेहद अक्षम बना देता है, जो ठीक होगा अगर यह एक प्रसिद्ध कैविट के साथ आता है जो लिंक किए गए संरचनाओं को अब एक कस्टम आवंटनकर्ता की आवश्यकता है, तो मुफ्त सूची की तरह, यथोचित रूप से कुशल होने के लिए और बाएं और दाएं कैश मिक्स ट्रिगर करने से बचें। बहुत अधिक व्यावहारिक रूप से लागू कुछ ऐसा हो सकता हैstd::list<T, BlockSize, Alloc>, जहां BlockSizeएक ही बार में नि: शुल्क सूची के लिए आवंटित करने के लिए सन्निहित नोड्स की संख्या को इंगित करता है (1 निर्दिष्ट करना प्रभावी ढंग से आगे बढ़ेगा std::listजैसा कि अब है)।

लेकिन ऐसा कोई चेतावनी नहीं है, जो तब एक पंथ मंत्र की गूंज के साथ ब्लॉकहेड्स के एक पूरे समुदाय की ओर जाता है जो कि लिंक की गई सूची बेकार हैं, उदा।


3

एक अन्य क्षेत्र है जहाँ आप चाहते हो सकते हैं कि एक कस्टम एलोकेटर हीप विखंडन को रोकने के लिए है । समय के साथ-साथ आपका ढेर ढेर सारी वस्तुओं को आवंटित कर सकता है। यदि आपका प्रोग्राम ढेर मेमोरी को एक साथ नहीं रख सकता है, जब आपका प्रोग्राम एक बड़ी वस्तु को आवंटित करने के लिए जाता है, तो उसे सिस्टम से अधिक मेमोरी का दावा करना पड़ता है क्योंकि यह आपके मौजूदा, खंडित हीप (बहुत छोटे) के बीच एक मुफ्त ब्लॉक नहीं पा सकता है वस्तुएं रास्ते में हैं)। आपके कार्यक्रम का कुल मेमोरी उपयोग समय के साथ बढ़ेगा, और आप अनावश्यक रूप से स्मृति के अतिरिक्त पृष्ठों का उपभोग करेंगे। तो यह उन कार्यक्रमों के लिए एक बहुत बड़ा मुद्दा है, जो लंबे समय तक चलने की उम्मीद है (डेटाबेस, सर्वर, आदि आदि के बारे में सोचें)।

जहां, खेल के अलावा, कस्टम एलोकेटर भारी उपयोग किए जाते हैं?

फेसबुक

की जाँच करें jemalloc कि फेसबुक उनके ढेर प्रदर्शन और कमी विखंडन सुधार करने के लिए उपयोग करने के लिए शुरू कर रहा है।


सही। हालाँकि, एक कॉपी कचरा कलेक्टर बड़े करीने से विखंडन की समस्या को हल करता है, है ना?
रिवालेस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.