簡體   English   中英

x86 配置上的最大可用 memory 大小?

[英]Maximum usable memory size on x86 configuration?

我用 x86 配置基於 C 語言構建了一個項目,如果我放了大約 3GB 堆棧,它會導致故障或結果不正確。

x86 配置上的最大可用 memory 尺寸是多少?

(開發環境有足夠的memory;Windows 64bit,16GB RAM。)

在 64 位 kernel 下,如果 32 位進程構建為“大地址感知”可執行文件,則可以使用整個 4GiB 虛擬地址空間,減去開銷。 否則只有 2GiB。

與做出不安全假設的代碼兼容時,默認情況下不啟用此功能。 開發人員在構建可執行文件時必須將標志傳遞給 linker。 該標志是 MSVC 上的/LARGEADDRESSAWARE和 MinGW 上--large-address-aware

當大型地址感知程序在啟用 /3GB 開關的 Windows 的 32 位版本上運行時,它將能夠 map 最多 3 GiB 的虛擬地址空間(剩余的高 1 GB 為內核保留)。 但是,在 64 位 Windows 系統上,它應該能夠 map 全部 4 GB,少一些開銷。

單個連續分配的大小將受到主要可執行文件和 DLL 映射到 memory(以及堆棧和任何其他隨機分配)的位置的限制,因為它當然必須在已使用的任何頁面之間進行 go。


如果沒有 large-address-aware ,在 Windows(無論是 32 位還是 64 位)上運行的 32 位程序默認只有 2 GB 的虛擬地址空間,無論 Windows 減去 Z50484AZFDF29 后有多少虛擬地址空間可用解決使用和雜項開銷。

特別是,您的程序將永遠不會收到超過 2 GB 標記的用戶模式虛擬地址映射,除非它通過聲明自己為大地址感知來選擇接收如此高的地址。

從歷史上看,32 位 Windows 曾經在 kernel 和用戶空間之間使用 2G:2G 的虛擬地址空間拆分。 某些程序可能取決於兩個指向不同對象的指針之間的差異,這些指針適合帶符號的正 integer,或者 ISO C 不能保證並且 LAA 會中斷的其他假設。 非大地址感知確保與此類程序的向后兼容性。 對 32 位 Windows 可執行文件使用 /LARGEADDRESSAWARE 的缺點?

您的問題不是 windows 中可用的 memory 的數量。 您只為堆棧請求了 3Gb(不是 memory,只是堆棧)。 這是非常罕見的。

例如,對於進程堆棧,FreeBSD(不是 windows)的正常限制是:

$ ulimit -a
number of pseudoterminals            (-P) unlimited
socket buffer size       (bytes, -b) unlimited
core file size          (blocks, -c) unlimited
data seg size           (kbytes, -d) 33554432
file size               (blocks, -f) unlimited
max kqueues                     (-k) unlimited
max locked memory       (kbytes, -l) unlimited
max memory size         (kbytes, -m) unlimited
open files                      (-n) 230121
pipe size            (512 bytes, -p) 1
stack size              (kbytes, -s) 524288     <<<<<<<<<<<<<<<
cpu time               (seconds, -t) unlimited
max user processes              (-u) 12042
virtual memory          (kbytes, -v) unlimited
swap size               (kbytes, -w) unlimited

如您所見,堆棧被系統限制為 524288 千字節,因此在這個系統上您可能也會失敗。

您的系統通常會遇到一些麻煩,因為您需要堆疊如此多的 memory。 所有操作系統都限制

認為每個進程的堆棧限制為 10Mb 是很常見的......所以你可能有一些設計問題。

你在你的程序中使用這樣的堆棧數量是什么?

(對不起,我沒有一台接近的 windows 機器來檢查這個,也不知道如何檢查堆棧段允許的最大數量)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM