ในทางปฏิบัติมันเป็นเรื่องยาก (และบางครั้งเป็นไปไม่ได้) ที่จะเติบโตสแต็ค เพื่อให้เข้าใจว่าทำไมต้องมีความเข้าใจหน่วยความจำเสมือน
ใน Ye Olde Days ของแอปพลิเคชันแบบเธรดเดี่ยวและหน่วยความจำที่ต่อเนื่องกันสามรายการมีสามองค์ประกอบของพื้นที่ที่อยู่กระบวนการ: โค้ดฮีปและสแต็ก วิธีการจัดวางทั้งสามนั้นขึ้นอยู่กับระบบปฏิบัติการ แต่โดยทั่วไปแล้วรหัสจะมาก่อนเริ่มที่ด้านล่างของหน่วยความจำฮีปมาถัดไปและโตขึ้นและสแต็กก็เริ่มที่ด้านบนของหน่วยความจำและขยายตัวลง นอกจากนี้ยังมีหน่วยความจำบางส่วนที่สงวนไว้สำหรับระบบปฏิบัติการ แต่เราสามารถเพิกเฉยได้ โปรแกรมในสมัยนั้นค่อนข้างล้นสแต็กอย่างมาก: สแต็กจะชนเข้ากับฮีปและขึ้นอยู่กับว่าได้รับการอัปเดตก่อนคุณจะทำงานกับข้อมูลที่ไม่ดีหรือส่งคืนจากรูทีนย่อยไปยังหน่วยความจำบางส่วน
การจัดการหน่วยความจำเปลี่ยนโมเดลนี้ค่อนข้าง: จากมุมมองของโปรแกรมคุณยังมีองค์ประกอบสามส่วนของแผนที่หน่วยความจำกระบวนการและโดยทั่วไปแล้วพวกเขาก็จัดระเบียบแบบเดียวกัน แต่ตอนนี้องค์ประกอบแต่ละส่วนได้รับการจัดการในฐานะส่วนอิสระและ MMU จะส่งสัญญาณ OS หากโปรแกรมพยายามเข้าถึงหน่วยความจำนอกเซกเมนต์ เมื่อคุณมีหน่วยความจำเสมือนไม่จำเป็นต้องมีหรือไม่ต้องการให้โปรแกรมเข้าถึงพื้นที่ที่อยู่ทั้งหมด ดังนั้นส่วนที่ได้รับมอบหมายขอบเขตคงที่
เหตุใดจึงไม่เป็นที่พึงปรารถนาที่จะให้โปรแกรมเข้าถึงพื้นที่ที่อยู่เต็มของโปรแกรม เพราะหน่วยความจำนั้นถือว่าเป็น "กระทำการคิด" ต่อการแลกเปลี่ยน; เมื่อใดก็ตามที่หน่วยความจำใด ๆ หรือทั้งหมดสำหรับโปรแกรมหนึ่งอาจต้องเขียนเพื่อสลับเพื่อให้มีที่ว่างสำหรับหน่วยความจำของโปรแกรมอื่น หากทุกโปรแกรมอาจใช้การแลกเปลี่ยน 2GB คุณต้องเตรียมการสับเปลี่ยนให้เพียงพอสำหรับโปรแกรมทั้งหมดของคุณหรือใช้โอกาสที่โปรแกรมสองโปรแกรมต้องการมากกว่าที่จะได้รับ
ณ จุดนี้สมมติว่ามีพื้นที่ที่อยู่เสมือนเพียงพอคุณสามารถขยายเซ็กเมนต์เหล่านี้ได้ถ้าต้องการและเซ็กเมนต์ข้อมูล (ฮีป) มีอยู่จริงเมื่อเวลาผ่านไป: คุณเริ่มจากเซ็กเมนต์ข้อมูลขนาดเล็กและเมื่อตัวจัดสรรหน่วยความจำร้องขอพื้นที่เพิ่มเติมเมื่อ มันจำเป็น ณ จุดนี้ด้วยสแต็คเดียวมันจะเป็นไปได้ทางกายภาพที่จะขยายส่วนสแต็ก: ระบบปฏิบัติการสามารถดักจับความพยายามที่จะผลักบางสิ่งบางอย่างนอกส่วนและเพิ่มหน่วยความจำเพิ่มเติม แต่สิ่งนี้ก็ไม่เป็นที่ต้องการเช่นกัน
ป้อนหลายเธรด ในกรณีนี้แต่ละเธรดมีกลุ่มสแต็กอิสระขนาดคงที่อีกครั้ง แต่ตอนนี้มีการจัดวางเซกเมนต์ทีละส่วนในพื้นที่ที่อยู่เสมือนดังนั้นจึงไม่มีวิธีขยายเซ็กเมนต์หนึ่งโดยไม่ย้ายอีก - ซึ่งคุณไม่สามารถทำได้เนื่องจากโปรแกรมอาจมีพอยน์เตอร์ไปยังหน่วยความจำในกองซ้อน คุณสามารถเว้นช่องว่างระหว่างเซกเมนต์ แต่ช่องว่างนั้นจะเสียเปล่าในเกือบทุกกรณี วิธีที่ดีกว่าคือการวางภาระให้กับผู้พัฒนาแอปพลิเคชัน: หากคุณต้องการสแต็คลึกจริง ๆ คุณสามารถระบุได้ว่าเมื่อสร้างเธรด
วันนี้ด้วยพื้นที่ที่อยู่เสมือนแบบ 64 บิตเราสามารถสร้างสแต็คที่ไม่มีที่สิ้นสุดได้อย่างมีประสิทธิภาพสำหรับจำนวนเธรดที่ไม่มีที่สิ้นสุดได้อย่างมีประสิทธิภาพ แต่ก็ไม่เป็นที่พึงปรารถนาโดยเฉพาะ: ในเกือบทุกกรณีสแต็คโอเวอร์โอเวอร์จะระบุบั๊กที่มีรหัสของคุณ ให้สแต็คขนาด 1 GB เพียงแค่ป้องกันการค้นพบบั๊กนั้น