स्मृति के संबंध में अखाड़ा शब्द का क्या अर्थ है?


100

मैं स्मृति पर एक प्रोग्रामिंग अवधारणा के रूप में एक किताब पढ़ रहा हूं। बाद के अध्यायों में से एक में, लेखक अखाड़े शब्द का भारी उपयोग करता है, लेकिन इसे कभी भी परिभाषित नहीं करता है। मैंने शब्द के अर्थ की खोज की है और यह कैसे मेमोरी से संबंधित है, और कुछ नहीं मिला। यहाँ कुछ संदर्भ दिए गए हैं जिनमें लेखक शब्द का उपयोग करता है:

"क्रमांकन का अगला उदाहरण एक विशिष्ट क्षेत्र से स्मृति आवंटन नामक एक रणनीति शामिल है ।"

"... यह स्मृति लीक से निपटने या एक विशिष्ट क्षेत्र से आवंटित करते समय उपयोगी है ।"

"... अगर हम स्मृति को हटाना चाहते हैं तो हम पूरे क्षेत्र को निपटा देंगे ।"

लेखक एक अध्याय में 100 बार से अधिक शब्द का उपयोग करता है। शब्दावली में एकमात्र परिभाषा है:

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

किसी को भी परिभाषित कर सकता हूँ के मैदान मेरे लिए इन संदर्भों दिया?


पुस्तक का नाम क्या है?
योबिन

1
Frantisek Franek द्वारा C और C ++ में एक प्रोग्रामिंग कॉन्सेप्ट के रूप में @yaobin मेमोरी।
नोक्टर्नो

जवाबों:


111

एक अखाड़ा सिर्फ स्मृति का एक बड़ा, सन्निहित टुकड़ा है जिसे आप एक बार आवंटित करते हैं और फिर उस मेमोरी के कुछ हिस्सों को मैन्युअल रूप से मेमोरी को प्रबंधित करने के लिए उपयोग करते हैं। उदाहरण के लिए:

char * arena = malloc(HUGE_NUMBER);

unsigned int current = 0;

void * my_malloc(size_t n) { current += n; return arena + current - n; }

मुद्दा यह है कि मेमोरी आवंटन कैसे काम करता है, इस पर आपको पूरा नियंत्रण मिलता है। आपके नियंत्रण के बाहर एकमात्र चीज प्रारंभिक आवंटन के लिए एकल पुस्तकालय कॉल है।

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

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


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

11
@AndreasHaferburg: मानक पुस्तकालय से स्मृति आबंटक का अपने आप ही कस्टम-लेखन पर भारी लाभ होता है, अर्थात आपको लिखना / परीक्षण / डिबग / रखरखाव आदि नहीं करना है, भले ही आप बिना किसी सबूत के साथ निश्चित हों। अपने स्वयं के आवंटन को प्रबंधित करके प्रदर्शन में सुधार कर सकते हैं, आपको यह तय करने से पहले अच्छे सबूत की आवश्यकता है कि यह सुधार ट्रेडऑफ के लायक है।
रुख

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

8
@AndreasHaferburg: निश्चित रूप से, tcmalloc कुछ विशेष एल्गोरिथ्म का उपयोग करता है, और इसके पीछे का विचार समझाने के लिए काफी आसान है, लेकिन कार्यान्वयन अभी भी जटिल और गैर-तुच्छ है। सबसे महत्वपूर्ण बात, मेमोरी को सही करने के लिए प्लेटफ़ॉर्म-विशिष्ट ज्ञान की आवश्यकता होती है। मैं उन चीजों के लिए "जादू" का उपयोग करता हूं जो या तो उपयोगकर्ता द्वारा बिल्कुल भी नहीं लिखा जा सकता है (जैसे कि एक कुशल म्यूटेक्स, या tcmalloc, या एक लैम्ब्डा का प्रकार), या केवल चरम नायकों के साथ (जैसे std :: function); मेरा मतलब यह नहीं है कि "समझा नहीं जा सकता"।
केरेक एसबी

12
@AndreasHaferburg: और मेरी अंतिम सलाह इतनी अधिक नहीं है कि यह सिद्धांत रूप में मुश्किल है कि "डिफ़ॉल्ट से बेहतर पता है", बल्कि यह है कि कस्टम समाधान को बनाए रखने की लागत अधिक है (किसी को इसे लिखना है, इसे दस्तावेज़ करना है, इसे प्राप्त करें) सही, और किसी और को बग्स को ठीक करना है, और हर किसी को मूल मान्यताओं की समीक्षा करना और पुन: उपयोग करना है जैसे कि उपयोग फैलता है), और आपको उस लागत का औचित्य साबित करने के लिए सबूत की आवश्यकता है।
केरेक एसबी

10

मैं एक संभावित उत्तर के रूप में इसके साथ जाऊंगा

•Memory Arena (also known as break space)--the area where dynamic runtime memory is stored. The memory arena consists of the heap and unused memory. The heap is where all user-allocated memory is located. The heap grows up from a lower memory address to a higher memory address.

मैं विकिपीडिया के पर्यायवाची शब्द जोड़ूंगा : क्षेत्र, क्षेत्र, क्षेत्र, क्षेत्र या स्मृति प्रसंग।

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


5

इसे 'हीप' का पर्यायवाची समझें। आमतौर पर, आपकी प्रक्रिया में केवल एक हीप / अखाड़ा होता है, और सभी मेमोरी आवंटन वहां से होता है।

लेकिन, कभी-कभी आपके पास ऐसी स्थिति होती है जहां आप एक साथ आवंटन की एक श्रृंखला को समूहित कर सकते हैं (उदाहरण के लिए, विखंडन से बचने के लिए, आदि)। उस स्थिति में, एक नया ढेर / क्षेत्र आवंटित करना बेहतर होता है, और फिर किसी भी आवंटन के लिए, आप यह तय कर सकते हैं कि किस ढेर से आवंटन करना है।

उदाहरण के लिए, आपके पास एक कण प्रणाली हो सकती है जहां एक ही आकार की बहुत सी वस्तुओं को बार-बार आवंटित और निपटाया जा रहा है। स्मृति के विखंडन से बचने के लिए, आप प्रत्येक कण को ​​एक ढेर से आवंटित कर सकते हैं जो केवल उन कणों के लिए उपयोग किया जाता है, और अन्य सभी आवंटन डिफ़ॉल्ट ढेर से आएंगे।


5

से http://www.bozemanpass.com/info/linux/malloc/Linux_Heap_Contention.html :

Libc.so.x साझा लाइब्रेरी में glibc घटक होता है और ढेर कोड इसके अंदर रहता है। ढेर का वर्तमान कार्यान्वयन कई स्वतंत्र उप-ढेर का उपयोग करता है जिसे अर्नस कहा जाता है। प्रत्येक क्षेत्र में संगामिति संरक्षण के लिए अपना स्वयं का म्यूटेक्स है। इस प्रकार यदि किसी प्रक्रिया के ढेर के भीतर पर्याप्त एरेनास हैं, और थ्रेड्स के ढेर को समान रूप से उन दोनों के बीच वितरित करने के लिए एक तंत्र है, तो म्यूटेक्स के लिए विवाद की संभावना न्यूनतम होनी चाहिए। यह पता चला है कि यह आवंटन के लिए अच्छी तरह से काम करता है। मॉलॉक () में, यह देखने के लिए एक परीक्षण किया जाता है कि क्या वर्तमान थ्रेड के लिए वर्तमान लक्ष्य क्षेत्र के लिए म्यूटेक्स मुफ़्त है (ट्रायलॉक)। यदि ऐसा है तो अखाड़ा अब बंद हो गया है और आवंटन आगे बढ़ गया है। यदि म्यूटेक्स व्यस्त है तो प्रत्येक शेष क्षेत्र को मोड़ने की कोशिश की जाती है और यदि म्यूटेक्स व्यस्त नहीं है तो इसका उपयोग किया जाता है। इस घटना में कि किसी भी क्षेत्र को अवरुद्ध किए बिना बंद नहीं किया जा सकता है, एक नया अखाड़ा बनाया जाता है। परिभाषा के अनुसार यह अखाड़ा पहले से ही बंद नहीं है, इसलिए अब आवंटन अवरुद्ध किए बिना आगे बढ़ सकता है। अंत में, एक धागे द्वारा अंतिम रूप से इस्तेमाल किए गए क्षेत्र की आईडी को थ्रेड लोकल स्टोरेज में बनाए रखा जाता है, और बाद में पहले थैले के रूप में इस्तेमाल किया जाता है जब उस थ्रेड द्वारा अगली बार मॉलोक () कहा जाता है। इसलिए सभी कॉल मैलोक () बिना रुके आगे बढ़ेंगे।

आप इस लिंक को भी देख सकते हैं:

http://www.codeproject.com/Articles/44850/Arena-Allocator-DTOR-and-Embedded-Preallocated-Buf


3
FYI करें जब लिंक पोस्ट करते हैं तो आपको एक सारांश पोस्ट करना चाहिए ताकि यदि लिंक किया हुआ लेख दूर हो जाए तो भी आपका पोस्ट उपयोगी हो।
स्टोनेमेटल

5
यह bozemanpass.com/info/linux/malloc/Linux_Heap_Contention.html से कॉपी-पेस्ट लगता है। कृपया अपने स्रोतों को क्रेडिट करें जब आप उन्हें शब्दशः उपयोग करते हैं।
jscs
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.