अभ्यास में, स्टैक विकसित करना मुश्किल (और कभी-कभी असंभव) है। यह समझने के लिए कि वर्चुअल मेमोरी की कुछ समझ की आवश्यकता क्यों है।
एक-पिरोया अनुप्रयोगों और सन्निहित स्मृति के ये ओल्डे दिनों में, तीन एक प्रक्रिया पता स्थान के तीन घटक थे: कोड, हीप और स्टैक। कैसे उन तीनों को ओएस पर निर्भर किया गया, लेकिन आम तौर पर कोड पहले आया, स्मृति के तल पर शुरू हुआ, ढेर आगे आया और ऊपर की तरफ बढ़ गया, और मेमोरी के शीर्ष पर स्टैक शुरू हुआ और नीचे की तरफ बढ़ गया। ऑपरेटिंग सिस्टम के लिए कुछ मेमोरी आरक्षित थी, लेकिन हम इसे अनदेखा कर सकते हैं। उन दिनों के कार्यक्रमों में कुछ अधिक नाटकीय स्टैक ओवरफ्लो होता था: स्टैक ढेर में दुर्घटनाग्रस्त हो जाता था, और इस पर निर्भर करता था कि पहले अपडेट किया गया था या तो आप खराब डेटा के साथ काम करेंगे या स्मृति के कुछ मनमाने हिस्से में सबरूटीन से लौटेंगे।
मेमोरी प्रबंधन ने इस मॉडल को कुछ हद तक बदल दिया: कार्यक्रम के दृष्टिकोण से आपके पास अभी भी एक प्रक्रिया मेमोरी मैप के तीन घटक थे, और वे आम तौर पर उसी तरह से व्यवस्थित होते थे, लेकिन अब प्रत्येक घटक एक स्वतंत्र खंड के रूप में प्रबंधित किया गया था और एमएमयू संकेत देगा। यदि प्रोग्राम किसी सेगमेंट के बाहर मेमोरी एक्सेस करने की कोशिश करता है तो ओएस। एक बार जब आपके पास वर्चुअल मेमोरी थी, तो प्रोग्राम को उसके पूरे एड्रेस स्पेस तक पहुँच देने की कोई आवश्यकता या इच्छा नहीं थी । इसलिए खंडों को निश्चित सीमाएँ सौंपी गईं।
तो एक कार्यक्रम को इसके पूर्ण पता स्थान तक पहुँच देना क्यों वांछनीय नहीं है? क्योंकि उस मेमोरी में स्वैप के खिलाफ "कमिट चार्ज" होता है; किसी भी समय या किसी एक प्रोग्राम की मेमोरी के लिए किसी अन्य प्रोग्राम की मेमोरी के लिए जगह बनाने के लिए स्वैप करने के लिए लिखना पड़ सकता है। यदि हर प्रोग्राम संभावित रूप से 2GB स्वैप का उपभोग कर सकता है, तो या तो आपको अपने सभी कार्यक्रमों के लिए पर्याप्त स्वैप प्रदान करना होगा या मौका लेना होगा कि दो कार्यक्रमों को जितना वे प्राप्त कर सकते हैं उससे अधिक की आवश्यकता होगी।
इस बिंदु पर, पर्याप्त वर्चुअल एड्रेस स्पेस मानते हुए, आप इन सेगमेंट को ज़रूरत पड़ने पर बढ़ा सकते हैं, और डेटा सेगमेंट (हीप) वास्तव में समय के साथ बढ़ता है: आप एक छोटे डेटा सेगमेंट के साथ शुरू करते हैं, और जब मेमोरी एलोकेटर अधिक स्थान का अनुरोध करता है जब इसकी जरूरत है। इस बिंदु पर, एक एकल स्टैक के साथ, स्टैक सेगमेंट का विस्तार करना शारीरिक रूप से संभव होगा: ओएस सेगमेंट के बाहर कुछ धक्का देने और अधिक मेमोरी जोड़ने के प्रयास में फंस सकता है। लेकिन यह विशेष रूप से वांछनीय नहीं है।
मल्टी-थ्रेडिंग दर्ज करें। इस स्थिति में, प्रत्येक थ्रेड में एक स्वतंत्र स्टैक खंड होता है, फिर से निश्चित आकार। लेकिन अब वर्चुअल एड्रेस स्पेस में सेगमेंट्स को एक के बाद एक बाहर रखा गया है, इसलिए एक सेगमेंट को दूसरे में जाने के बिना विस्तारित करने का कोई तरीका नहीं है - जो आप नहीं कर सकते क्योंकि प्रोग्राम में संभवतः स्टैक में रहने वाले मेमोरी के लिए पॉइंटर्स होंगे। आप वैकल्पिक रूप से खंडों के बीच कुछ स्थान छोड़ सकते हैं, लेकिन लगभग सभी मामलों में वह स्थान बर्बाद हो जाएगा। एक बेहतर तरीका यह था कि आप एप्लिकेशन डेवलपर पर बोझ डालें: यदि आपको वास्तव में गहरे स्टैक की आवश्यकता है, तो आप थ्रेड बनाते समय निर्दिष्ट कर सकते हैं।
आज, 64-बिट वर्चुअल एड्रेस स्पेस के साथ, हम प्रभावी रूप से अनंत संख्या में थ्रेड्स के लिए प्रभावी रूप से अनंत ढेर बना सकते हैं। लेकिन फिर से, यह विशेष रूप से वांछनीय नहीं है: लगभग सभी मामलों में, एक स्टैक ओवरलो आपके कोड के साथ बग को इंगित करता है। आपको 1 जीबी स्टैक प्रदान करना बस उस बग की खोज को ख़राब करता है।