回覆列表
  • 1 # 使用者9175688961649

    1,在x86平臺32位系統,系統佔用2GB地址空間,使用者方式2GB。如果使用VS,連結程式開關/SACK 或者/F可以設定執行緒堆疊大小,預設分配一個執行緒的堆疊大小是1MB,當CreateThread引數的StackSize大小與連結程式設定的不一致時,採用的方法是誰大用誰的,所以用4KB修改當然不會有改變!理論上最大執行緒數=2GB/1MB=2048。實際上這個使用者方式的2GB並不會全部用作執行緒堆疊。首先程式的程式碼和資料、程序環境塊、執行緒環境塊、空指標區域等等也需要佔用一定的地址空間;再者2GB只是虛擬記憶體,如果非分頁記憶體被用完,就無法再建立執行緒,這個與特定機器有關,所以不同機器上做最大執行緒數測試得到的數字可能不一樣。2,作業系統給一個系統程序提供的空間是2GB ,而一個執行緒堆疊的空間預設在啟動的時候是1MB 那麼啟動完2000後,基本上就有2GB了,你可以減小預設堆疊的大小。3,預設情況下,一個執行緒的棧要預留1M的記憶體空間而一個程序中可用的記憶體空間只有2G,所以理論上一個程序中最多可以開2048個執行緒但是記憶體當然不可能完全拿來作執行緒的棧,所以實際數目要比這個值要小。你也可以透過連線時修改預設棧大小,將其改的比較小,這樣就可以多開一些執行緒。如將預設棧的大小改成512K,這樣理論上最多就可以開4096個執行緒。即使物理記憶體再大,一個程序中可以起的執行緒總要受到2GB這個記憶體空間的限制。比方說你的機器裝了64GB物理記憶體,但每個程序的記憶體空間還是4GB,其中使用者態可用的還是2GB。如果是同一臺機器內的話,能起多少執行緒也是受記憶體限制的。每個執行緒物件都要站用非頁面記憶體,而非頁面記憶體也是有限的,當非頁面記憶體被耗盡時,也就無法建立執行緒了。如果物理記憶體非常大,同一臺機器內可以跑的執行緒數目的限制值會越來越大。  在Windows下寫個程式,一個程序Fork出2000個左右執行緒就會異常退出了,為什麼?  這個問題的產生是因為windows32位系統,一個程序所能使用的最大虛擬記憶體為2G,而一個執行緒的預設執行緒棧StackSize為1024K(1M),這樣當執行緒數量逼近2000時,2000*1024K=2G(大約),記憶體資源就相當於耗盡。4,預設每執行緒1MB堆疊的話,只能開2048執行緒(如果你的其它系統資源足夠的話)。要想開更多執行緒,只能修改每個執行緒的堆疊,但實際中是不推薦這樣做的,因為如果你的執行緒因為一些工作因為執行緒堆疊不夠的話,會導致整個程序崩潰.修改堆疊的方法好像只在XP或以上系統有效,windows 2000中不支援。

  • 中秋節和大豐收的關聯?
  • 如果直接用USB延長線連線兩臺電腦會怎麼樣?