Trên thực tế, kích thước ngăn xếp ảo của bạn là 8388608 byte (8 MB). Tất nhiên, thật tự nhiên khi kết luận rằng điều này không thể đúng, bởi vì đó là một lượng lớn bộ nhớ cho mỗi luồng tiêu thụ cho ngăn xếp của nó khi 99% thời gian một vài KB có lẽ là tất cả những gì họ cần.
Tin tốt là chủ đề của bạn chỉ sử dụng lượng bộ nhớ vật lý mà nó thực sự cần. Đây là một trong những sức mạnh kỳ diệu mà HĐH của bạn có được từ việc sử dụng Bộ quản lý bộ nhớ phần cứng (MMU) trong bộ xử lý của bạn. Đây là những gì xảy ra:
HĐH phân bổ 8 MB bộ nhớ ảo cho ngăn xếp của bạn bằng cách thiết lập các bảng trang của MMU cho luồng của bạn. Điều này đòi hỏi rất ít RAM để chỉ giữ các mục trong bảng trang.
Khi luồng của bạn chạy và cố gắng truy cập một địa chỉ ảo trên ngăn xếp chưa có trang vật lý được gán cho nó, một ngoại lệ phần cứng được gọi là "lỗi trang" được MMU kích hoạt.
Lõi CPU đáp ứng với ngoại lệ lỗi trang bằng cách chuyển sang chế độ thực thi đặc quyền (có ngăn xếp riêng) và gọi hàm xử lý ngoại lệ lỗi trang bên trong kernel.
Nhân phân bổ một trang RAM vật lý cho trang bộ nhớ ảo đó và quay trở lại luồng không gian người dùng.
Các luồng không gian người dùng không thấy công việc đó. Từ quan điểm của nó, nó chỉ sử dụng ngăn xếp như thể bộ nhớ ở đó cùng. Trong khi đó, ngăn xếp tự động phát triển (hoặc không) để đáp ứng nhu cầu của luồng.
MMU là một phần quan trọng trong phần cứng của các hệ thống máy tính ngày nay. Đặc biệt, nó chịu trách nhiệm cho rất nhiều "ma thuật" trong hệ thống, vì vậy tôi khuyên bạn nên tìm hiểu thêm về những gì MMU làm và về bộ nhớ ảo nói chung. Ngoài ra, nếu ứng dụng của bạn nhạy cảm với hiệu suất và xử lý một lượng dữ liệu đáng kể, bạn nên hiểu cách thức hoạt động của TLB (bộ đệm bảng trang của MMU) và cách bạn có thể cơ cấu lại dữ liệu hoặc thuật toán của mình để tối đa hóa tốc độ truy cập TLB.
8388608 / 1024 = 8192
.