1. 程式人生 > >進程空間分配和堆棧大小

進程空間分配和堆棧大小

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個左右
    線程。
    ps:ulimit -a 查看電腦的最大進程數,大概7000多個)



進程空間分配和堆棧大小