Trong thực tế, rất khó (và đôi khi không thể) để phát triển ngăn xếp. Để hiểu tại sao đòi hỏi một số hiểu biết về bộ nhớ ảo.
Trong Ye Olde Days của các ứng dụng đơn luồng và bộ nhớ liền kề, ba là ba thành phần của một không gian địa chỉ tiến trình: mã, heap và ngăn xếp. Làm thế nào ba cái đó được đặt ra phụ thuộc vào HĐH, nhưng nói chung, mã xuất hiện trước, bắt đầu từ dưới cùng của bộ nhớ, heap tiếp theo và lớn lên, và ngăn xếp bắt đầu ở trên cùng của bộ nhớ và tăng dần xuống. Cũng có một số bộ nhớ dành riêng cho hệ điều hành, nhưng chúng ta có thể bỏ qua điều đó. Các chương trình trong những ngày đó có phần tràn đầy kịch tính hơn: ngăn xếp sẽ bị rơi vào đống, và tùy thuộc vào việc được cập nhật trước, bạn sẽ làm việc với dữ liệu xấu hoặc trở về từ một chương trình con vào một phần bộ nhớ tùy ý.
Quản lý bộ nhớ đã thay đổi mô hình này phần nào: từ phối cảnh của chương trình, bạn vẫn có ba thành phần của bản đồ bộ nhớ quy trình và chúng thường được tổ chức theo cùng một cách, nhưng bây giờ mỗi thành phần được quản lý như một phân đoạn độc lập và MMU sẽ báo hiệu Hệ điều hành nếu chương trình cố gắng truy cập bộ nhớ ngoài một phân đoạn. Khi bạn đã có bộ nhớ ảo, không cần hoặc không muốn cung cấp cho chương trình quyền truy cập vào toàn bộ không gian địa chỉ của nó. Vì vậy, các phân khúc đã được chỉ định ranh giới cố định.
Vậy tại sao không mong muốn cung cấp cho chương trình quyền truy cập vào không gian địa chỉ đầy đủ của nó? Bởi vì bộ nhớ đó cấu thành một "phí cam kết" chống lại sự hoán đổi; bất cứ lúc nào, bất kỳ hoặc tất cả bộ nhớ cho một chương trình có thể phải được ghi để hoán đổi để nhường chỗ cho bộ nhớ của chương trình khác. Nếu mọi chương trình có khả năng tiêu thụ 2GB trao đổi, thì bạn sẽ phải cung cấp đủ số lượng trao đổi cho tất cả các chương trình của mình hoặc có cơ hội hai chương trình sẽ cần nhiều hơn số tiền họ có thể nhận được.
Tại thời điểm này, giả sử đủ không gian địa chỉ ảo, bạn có thể mở rộng các phân đoạn này nếu cần và phân đoạn dữ liệu (heap) thực tế tăng theo thời gian: bạn bắt đầu với một phân đoạn dữ liệu nhỏ và khi bộ cấp phát bộ nhớ yêu cầu nhiều không gian hơn khi nó cần thiết. Tại thời điểm này, với một ngăn xếp duy nhất, có thể mở rộng phân khúc ngăn xếp một cách vật lý: HĐH có thể bẫy nỗ lực đẩy thứ gì đó ra ngoài phân khúc và thêm bộ nhớ. Nhưng điều này cũng không đặc biệt mong muốn.
Nhập đa luồng. Trong trường hợp này, mỗi luồng có một phân đoạn ngăn xếp độc lập, một lần nữa kích thước cố định. Nhưng bây giờ các phân đoạn được đặt lần lượt trong không gian địa chỉ ảo, vì vậy không có cách nào để mở rộng một phân đoạn mà không di chuyển một phân đoạn khác - điều mà bạn không thể làm được vì chương trình sẽ có khả năng có con trỏ sống trong ngăn xếp. Bạn có thể thay thế để lại một số không gian giữa các phân khúc, nhưng không gian đó sẽ bị lãng phí trong hầu hết các trường hợp. Một cách tiếp cận tốt hơn là đặt gánh nặng lên nhà phát triển ứng dụng: nếu bạn thực sự cần các ngăn xếp sâu, bạn có thể chỉ định điều đó khi tạo luồng.
Ngày nay, với không gian địa chỉ ảo 64 bit, chúng ta có thể tạo các ngăn xếp vô hạn hiệu quả cho số lượng luồng vô hạn hiệu quả. Nhưng một lần nữa, điều đó không đặc biệt mong muốn: trong hầu hết các trường hợp, chồng quá mức cho thấy lỗi với mã của bạn. Cung cấp cho bạn ngăn xếp 1 GB chỉ đơn giản là trì hoãn việc phát hiện ra lỗi đó.