आप पीछे हटना चाहते हैं और देख सकते हैं कि वे मौजूदा मॉडल कहाँ और क्यों आते हैं। जब एक प्रक्रिया बनाई जाती है, तो इसे बस एक फ्लैट स्टोरेज एरिया दिया जाता है, जिसे केवल 0 से N तक अनुक्रमित किया जाता है। क्योंकि यह स्टोरेज एरिया (रैम के बारे में बात करना) एक समर्पित हार्डवेयर द्वारा समर्थित है और कुछ फैंसी सेमीकंडक्टर्स के लिए यह बहुत तेजी से होता है, लेकिन यह अपनी तरह का अकेला नहीं है। अन्य डिवाइस जैसे कि हार्ड ड्राइव अनिवार्य रूप से एक ही चीज है, एक इंडेक्स द्वारा पता लगाने योग्य फ्लैट स्पेस, लेकिन परिमाण धीमी के कई आदेश।
"हीप" क्यों मौजूद है इसका कारण यह है कि यह प्रत्येक एप्लिकेशन के लिए स्वयं द्वारा रैम के उपयोग को प्रबंधित करने का प्रयास करने के लिए अव्यावहारिक होगा। दिन में वापस, ठीक यही है कि यह कैसे हुआ, प्रोग्रामरों ने समय से पहले योजना बनाई कि वास्तव में प्रत्येक रैम स्थान का क्या उपयोग किया जाएगा। जैसा कि सॉफ्टवेयर ने किसी को और अधिक जटिल बताया, यह अच्छा नहीं होगा यदि मैं सिर्फ कुछ ब्लैक बॉक्स में जा सकता हूं और कह सकता हूं कि "मुझे 10 बाइट्स की आवश्यकता है" तो मुझे और उन 10 बाइट्स के सभी जटिल विवरणों की चिंता नहीं करनी चाहिए से आते हैं या उन्हें कैसे पुनः प्राप्त किया जाता है। यही कारण है कि एक ढेर है, वास्तव में अधिक बुनियादी तो नहीं मिलता है कि।
हर बार जब एक धागा बनाया जाता है, तो कुछ डेटा संरचनाएं (और एक स्टैक) होती हैं, जो कि केवल वर्णित "गिम्मे ऑपरेशन" का उपयोग करके हासिल की जाती हैं। यूनिवर्सल स्टैक के बारे में सिर्फ एक स्टैक क्योंकि यह फंक्शन कॉल स्टैक फ्रेम और उनके LIFO प्रकृति के साथ पूरी तरह से फिट बैठता है। सिद्धांत रूप में, प्रत्येक फ़ंक्शन के आह्वान और स्थानीय चर को ढेर पर आवंटित किया जा सकता है, लेकिन यह बस कुछ विधानसभा निर्देशों के साथ तुलना में बहुत महंगा होगा, यह स्टैक पॉइंटर (x86 पर ESP) रजिस्टर को अपडेट करने के लिए लेता है।
थ्रेड लोकल स्टोरेज (TLS) भी ढेर के ऊपर बनाया गया है। जब एक धागा बनाया जाता है, तो प्रबंधन संरचनाओं के लिए स्मृति आवंटित करने के लिए ढेर की यात्रा के हिस्से के रूप में, टीएलएस के लिए एक अलग स्थान भी ढेर से आवंटित किया जाता है।
तो अंत में, आपके पास वास्तव में एक सामान्य मेमोरी एलोकेटर (यानी ढेर) है और बाकी सब कुछ उसके ऊपर एक विशेष रूप है। दूसरे शब्दों में, यदि आप "मैं जितना चाहता हूं (या जितना कम हो) आवंटित करना चाहता हूं, उसके कुछ पहलू को छोड़ना चाहता हूं, जब तक मैं चाहता हूं, तब तक इसे जारी रखें और जब भी मैं चाहता हूं, तब आप व्यापार से दूर हो सकते हैं।" एक और मॉडल के लिए जेनेरिक हीप एलोकेटर जो गति प्रदान करता है लेकिन कुछ अन्य सीमा की कीमत पर।
स्टैक लें। यह ढेर की तुलना में अविश्वसनीय रूप से तेज़ है, लेकिन दो ट्रेड ऑफ़ 1 हैं) जब आप मेमोरी मुक्त हो जाते हैं तो आप नियंत्रित नहीं करते हैं; इसके बजाय एक बार फ़ंक्शन से बाहर निकलने के बाद, जो भी आपने आवंटित किया है वह चला गया है और 2) क्योंकि स्टैक आमतौर पर आकार में सीमित हैं, आपको स्टैक पर सीधे बड़ी मात्रा में डेटा आवंटित करने में सावधानी बरतनी चाहिए।
एक अन्य प्रकार का "मेमोरी मॉडल" वर्चुअल मेमोरी मैनेजर (वीएमएम) है जो सिस्टम कॉल के माध्यम से हर प्रमुख ओएस के बारे में बताता है। वीएमएम एक अर्थ में ढेर के समान है जिसे आप किसी भी मात्रा में मेमोरी के लिए पूछ सकते हैं और जब तक चाहें तब तक इसे रख सकते हैं। हालाँकि, सीमा यह है कि आप केवल पृष्ठ आकार गुणकों (जैसे 4KB) में मेमोरी आवंटित कर सकते हैं, इसलिए VMM का सीधे उपयोग करने से एक विशिष्ट अनुप्रयोग में बहुत अधिक ओवरहेड हो जाता है जो अक्सर एक समय में 8-24 बाइट आवंटित करता है। वास्तव में, बस हर ढेर कार्यान्वयन के बारे में VMM के शीर्ष पर विशेष रूप से एक बहुत ही सामान्य, गैर-विशिष्ट, छोटे - आवंटन आवंटन की अनुमति देने के उद्देश्य से बनाया गया है । हीम जब भी अधिक मेमोरी की जरूरत होती है तो वीएमएम में जाती है और फिर उस मेमोरी के कई छोटे-छोटे हिस्से को एप्लिकेशन में डाल देती है।
यदि आपके पास एक ऐप है, जिसमें बड़े ब्लॉक आवंटित करने की आवश्यकता है, तो आप सीधे वीएमएम पर जाने पर विचार कर सकते हैं, हालांकि कुछ ढेरों में मॉलोक () के अंदर इफ-स्टेटमेंट है और यदि ब्लॉक का आकार कुछ सीमा से अधिक है, तो वे सीधे वीएमएम पर जाते हैं। तुम्हारे लिए।
सीधे ढेर का उपयोग करने के बजाय आवंटनकर्ताओं का एक और रूप, पूल होगा। एक पूल एक विशेष आबंटक है, जहाँ सभी ब्लॉक समान आकार के होते हैं। ताल (स्टैक और टीएलएस की तरह) ढेर या वीएमएम के शीर्ष पर बने होते हैं। ताल उन स्थानों पर उपयोगी होते हैं जहां आप एक ही आकार के छोटे-छोटे, बहुत से पिंडों (लाखों) का आवंटन करते हैं। आवक अनुरोधों को संसाधित करने वाली नेटवर्क सेवा के बारे में सोचें। प्रत्येक ग्राहक अनुरोधों के परिणामस्वरूप उस अनुरोध को संभालने के लिए उसी एन बाइट संरचना को आवंटित किया जा सकता है। पूल का उपयोग करने के साथ व्यापार बंद है कि प्रत्येक पूल केवल एक ब्लॉक आकार को संभालता है (लेकिन आप कई पूल बना सकते हैं)। पूल का लाभ यह है कि क्योंकि सभी ऑब्जेक्ट समान आकार के होते हैं, इसके लिए जटिल तर्क की आवश्यकता नहीं होती है। इसके बजाय, जब भी आपको एक नए ब्लॉक की आवश्यकता होती है, तो यह आपको वही देता है जो हाल ही में मुक्त किया गया था।
और अंत में, याद रखें कि हार्ड ड्राइव की बात मैंने ऊपर बताई थी। आपके पास एक मेमोरी मॉडल हो सकता है जो एक फाइल सिस्टम की तरह व्यवहार करता है और निर्देशिका प्रविष्टियों और आई-नोड्स के समान विचार को डुप्लिकेट करता है ताकि आप डेटा ब्लॉक के पदानुक्रमित आवंटन की अनुमति दे सकें जहां प्रत्येक डेटा ब्लॉक एक पथ के साथ संबोधित किया जाता है। ठीक यही tmpfs करता है।
मेरे द्वारा बताए गए सामान के अलावा, मुझे यकीन है कि अन्य विशिष्ट मॉडल हैं, लेकिन अंत में सब कुछ फ्लैट एड्रेस स्पेस पर आधारित है (जब तक कि कुछ उपसर्ग किसी तरह का अजीब-$ $ नॉन-फ्लैट स्पेस नहीं आता है ), यह सब उस सामान्य "जिमी" आवंटनकर्ता को वापस जाता है जो या तो वीएमएम या ढेर है।