2011-01-16 8 views
10

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

धन्यवाद

+5

सबसे अधिक संभावना है कि वे स्मृति के एक बड़े ब्लॉक (एक "मेमोरी एरिना") को पूर्व-आवंटित कर रहे हैं जो विखंडन से बचाता है और बेहतर आवंटन प्रदर्शन – BrokenGlass

+0

युप के लिए अनुमति देता है, आप ओएस से संगत स्मृति मिलो के बड़े हिस्से के लिए पूछ सकते हैं। यह सिस्टम दुनिया में काफी आम है। –

+0

हाँ, वे सबसे अधिक संभावना है कि वे मॉलोक के चारों ओर एक रैपर लिखते हैं जो कि सीधे मॉलोक को कॉल करने के बजाय उपयोग करते हैं, जो कुछ मामलों में गति बढ़ाता है, लेकिन ओएस स्तर की सामग्री –

उत्तर

8

एक सामान्य उद्देश्य से एक आवंटक को अधिक कुशल लिखना निश्चित रूप से संभव है।

यदि आप अपने आवंटन के गुणों को जानते हैं, तो आप सामान्य उद्देश्य आवंटकों को पानी से बाहर निकाल सकते हैं।

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

बेशक, यदि आपने और अधिक पूछा, तो यह वापस लौटा।

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

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

+0

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

+1

एक सामान्य उद्देश्य आवंटक लगभग हमेशा होगा (मुझे लगता है कि यह हमेशा हमेशा होता है, लेकिन मैं उस घमंडी नहीं होगा) जिसे एक अतिरिक्त ज्ञान का लाभ होता है। रेडक्टियो विज्ञापन बेतुका रेखा के साथ जाकर, यदि आप जानते हैं कि केवल एक आवंटन एक समय में सक्रिय हो सकता है और यह हमेशा 1K से कम होगा, तो आपके पास अपने मॉलोक में एक स्थिर बफर हो सकता है :-) _no_ binning आवंटक है जो कर सकता है उस से बेहतर प्रदर्शन करें। आप सही हैं कि यह एक व्यापार-बंद है, गति के खिलाफ लचीलापन है, लेकिन यही वह जगह है जहां से सवाल आ रहा था - गेम को शायद उस लचीलेपन की आवश्यकता नहीं है। – paxdiablo

+4

मैंने इस विषय पर एक व्यापक अध्ययन लिखा था। ले-होम प्वाइंट यह है कि कस्टम मेमोरी आवंटकों के प्रदर्शन लाभ अक्सर अत्याधुनिक स्मृति आवंटक के मुकाबले विज्ञापन के मुकाबले कम होते हैं। देखें http://www.cs.umass.edu/~emery/pubs/berger-oopsla2002.pdf – EmeryBerger

2

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

3

सिर्फ इसलिए कि malloc() एक मानक सी फ़ंक्शन का मतलब यह नहीं है कि यह स्मृति प्रणाली के लिए सबसे कम स्तर तक पहुंच है। वास्तव में, malloc() शायद निम्न स्तर की ऑपरेटिंग सिस्टम कार्यक्षमता के मामले में लागू किया गया है। इसका मतलब है कि आप उन निचले स्तर के इंटरफेस भी कॉल कर सकते हैं। वे ओएस-विशिष्ट हो सकते हैं, लेकिन malloc() इंटरफ़ेस से आपको बेहतर प्रदर्शन करने की अनुमति मिल सकती है। यदि ऐसा होता है, तो आप अपनी खुद की मेमोरी आवंटन प्रणाली को किसी भी तरह से कार्यान्वित कर सकते हैं, और शायद इसके बारे में और भी अधिक कुशल हो सकते हैं - उदाहरण के लिए आकार और आवंटन की आवृत्ति के लिए एल्गोरिदम अनुकूलित करना, उदाहरण के लिए ।

3

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

मॉलोक लाइब्रेरी में नि: शुल्क ब्लॉक की एक सूची (या सूचियां) भी होंगी, इसलिए यह ओएस को अधिक स्मृति के लिए पूछे बिना अनुरोध को अक्सर मिल सकती है। निर्धारित करने के लिए कि कितने अलग ब्लॉक आकार हैं, यह निर्णय लेते हैं कि आसन्न मुक्त ब्लॉक को गठबंधन करने का प्रयास करना है या नहीं, मॉलोक लाइब्रेरी कार्यान्वयन करने वाले विकल्पों को चुनना है।

आपके लिए मॉलोक लाइब्रेरी को बाईपास करना संभव है और ओएस-स्तर को सीधे "मुझे कुछ मेमोरी दें" फ़ंक्शन दें और ओएस से प्राप्त स्मृति के भीतर अपना स्वयं का आवंटन/मुक्त करें। ऐसे कार्यान्वयन ओएस-विशिष्ट होने की संभावना है। एक और विकल्प प्रारंभिक आवंटन के लिए मॉलोक का उपयोग करना है, लेकिन मुक्त वस्तुओं की अपनी कैश को बनाए रखना है।

2

अगर मैं सही ढंग से याद है, malloc वास्तव में एक OS विशेष समारोह

नहीं काफी कहता है। अधिकांश हार्डवेयर में 4 केबी पृष्ठ का आकार होता है। ऑपरेटिंग सिस्टम आम तौर पर पेज आवंटित (और पेज-गठबंधन) भाग से छोटे कुछ भी एक स्मृति आवंटन इंटरफ़ेस का पर्दाफाश नहीं करते हैं।

malloc खर्च करता है अपने समय के सबसे आभासी स्मृति अंतरिक्ष कि पहले से ही आबंटित किया गया है, और कभी कभी ही ओएस से अधिक स्मृति का अनुरोध करता प्रबंध (स्पष्ट रूप से इस और आइटम आप आवंटित के आकार कि आप कितनी बार free पर निर्भर करता है)।

एक आम गलत धारणा है कि जब आप free कुछ इसे तुरंत ऑपरेटिंग सिस्टम में वापस कर दिया जाता है। हालांकि यह कभी-कभी होता है (विशेष रूप से बड़े मेमोरी ब्लॉक के लिए) आमतौर पर यह मामला है कि free डी स्मृति प्रक्रिया के लिए आवंटित बनी हुई है और फिर बाद में malloc एस द्वारा फिर से उपयोग की जा सकती है।

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

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

उदाहरण के लिए, आप बराबर आकार वाली वस्तुओं को आवंटित कर सकते हैं, जो इष्टतम आवंटन पैरामीटर बदल सकते हैं। या आप हमेशा एक ही समय में बड़ी मात्रा में वस्तुओं को मुक्त कर सकते हैं, इस मामले में आप free नहीं चाहते हैं कि वे फैंसी चीजें कर सकें।

memory pools और obstacks पर एक नज़र डालें।