進程空間分配和堆棧大小
阿新 • • 發佈:2018-02-15
windows -a 情況下 info 電腦 左右 inux 運行 str
1. Linux中進程空間的分配情況如下:
從上圖可以看出,進程的空間分配:與進程相關的數據結構(頁表、內核棧、task) ---> 物理內存 ---> 內核代碼和數據 ---> 用戶棧 ---> 共享庫的內存映射區 ---> 運行時堆 --->未初始化數據段.bss ---> 已初始化數據段.data ---> 代碼段.text
2. 進程的堆棧大小:
- 32位的Windows,一個進程棧的默認大小是1M,在vs中的編譯屬性可以修改程序運行時進程的棧大小。
- Linux下進程棧的默認大小是10M,可以通過 ulimit -s查看並修改默認棧大小。(測試最多開2G棧空間)
- 默認情況下一個線程要預留1M左右的棧大小,所有進程中有N個線程時,Windows下大概有N*M的棧大小。
- 堆的大小理論上大概等於進程虛擬空間大小-內核虛擬內存大小。windows下,進程的高位2G留給內核,低位2G留給用戶,所以進程堆的大小小於2G。Linux下,進程的高位1G留給內核,低位3G留給用戶,所以進程堆大小小於3G。
3. 進程的最大線程數:
- 32位windows下,一個進程空間4G,內核占2G,留給用戶只有2G,一個線程默認棧是1M,所以一個進程最大開2048個線程。當然內存不會完全拿來做線程的棧,所以最大線程數實際值要小於2048,大概2000個。
- 32位Linux下,一個進程空間4G,內核占1G,用戶留3G,一個線程默認8M,所以最多380個左右
進程空間分配和堆棧大小