一個程序最多可以建立執行緒的數目
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中不支援。
相關推薦
[c/c++] 一個程序有多個執行緒,用什麼方法讓主執行緒不退出更好,佔用資源最少,效率最高?
[c/c++] 一個程序有多個執行緒,用什麼方法讓主執行緒不退出更好,要求佔用資源最少,效率最高? 我所知道的不讓主執行緒退出的方法有: 一,死迴圈:while(1);/ for(;;); 二,pause(); 讓主執行緒暫停等待訊號使其退出 三,另一種死迴圈whil
一個程序最多可以建立執行緒的數目
1,在x86平臺32位系統,系統佔用2GB地址空間,使用者方式2GB。如果使用VS,連結程式開關/SACK 或者/F可以設定執行緒堆疊大小,預設分配一個執行緒的堆疊大小是1MB,當CreateThread引數的StackSize大小與連結程式設定的不一致時,採用的方法是誰
Linux多執行緒程式設計時如何檢視一個程序中的某個執行緒是否存活
pthread_kill: 別被名字嚇到,pthread_kill可不是kill,而是向執行緒傳送signal。還記得signal嗎,大部分signal的預設動作是終止程序的執行,所以,我們才要用signal()去抓訊號並加上處理函式。 int pthread_kil
如何定位消耗CPU最多的執行緒
之前有朋友反饋說發的內容希望有個梯度,逐步加深,前面發了幾篇關於jvm原始碼分析的文章,可能我覺得我已經把內容寫得淺顯易懂了,但是對於某些沒怎麼接觸的同學來說還是比較難理解,這個我以後慢慢改進吧,今天發篇輕鬆點的文章,可能大家在工作過程中也會可能碰到類似的問題,或許有經驗的同學看到這個題目就
同一程序內多個執行緒狀態的檢視
今天發現伺服器上程式執行異常,整個程式是在執行,但從日誌看只有部分執行緒在執行,而另一部分執行緒沒執行。然後我就在程式碼中加入了一些更詳細的日誌,然而問題發生時,程式還是那種異常。於是就上網搜了一些檢視
如何檢視一個程序中的某個執行緒是否存活?
pthread_kill: 別被名字嚇到,pthread_kill可不是kill,而是向執行緒傳送signal。還記得signal嗎,大部分signal的預設動作是終止程序的執行,所以,我們才要用signal()去抓訊號並加上處理函式。 int pthread_
linux下一個程序中多執行緒的資源共享
在說執行緒資源共享之前,我們先來說來說一下執行緒的概念,執行緒是程序內部的一條執行序列(即執行流),一個程序至少有一個執行緒,即main函式代表的執行流。當然我們也可以通過執行緒庫來建立新的執行緒,這種執行緒我們稱之為函式執行緒,同一個程序中的所有普執行緒是併發執行的。而這些
-1-5 java 多執行緒 概念 程序 執行緒區別聯絡 java建立執行緒方式 執行緒組 執行緒池概念 執行緒安全 同步 同步程式碼塊 Lock鎖 sleep()和wait()方法的區別 為什麼wait(),notify(),notifyAll()等方法都定義在O
本文關鍵詞: java 多執行緒 概念 程序 執行緒區別聯絡 java建立執行緒方式 執行緒組 執行緒池概念 執行緒安全 同步 同步程式碼塊 Lock鎖 sleep()和wait()方法的區別 為什麼wait(),notify(),notifyAll()等方法都定義在Object類中 多執行緒
多執行緒1-建立執行緒-Thread&Runnable
大綱: Thread建立執行緒。 Runnable建立執行緒。 小結。 一、java建立執行緒--繼承Thead類 建立一個類繼承Thead類,並重寫run方法。 class Test { public static void main(String[]
Python多工(利用threading建立執行緒時傳入引數--args引數)
target : 指定 這個執行緒去哪個函式裡面去執行程式碼 args: 指定將來呼叫 函式的時候 傳遞什麼資料過去 &n
Python多工(2.執行緒(建立執行緒的兩種方式))
Python中threading模組 可以總結出: (1)當呼叫Thread的時候,不會建立執行緒 (2)呼叫Thread創建出來的例項物件的start方法的時候,才會建立執行緒以及讓這個執行緒開始執行  
究極難題 :一個執行10秒以上至無窮的呼叫函式,成功後有返回值。在多工執行緒中怎麼實現呼叫不卡住該執行緒?
究極難題 :一個執行10秒以上至無窮的呼叫函式,成功後有返回值。在多工執行緒中怎麼實現呼叫不卡住該執行緒? Note:一旦呼叫函式,中途無法取消。 思路一:讓其執行在獨立執行緒內。加超時時間。 1. 在超時時間內函式有返回值,則函式執行結束。則獨立執行緒結束。 2. 在超時時
Java基礎之多執行緒之原理、實現方式及匿名內部類建立執行緒方法
一、概念 程序:作業系統當中正在執行的一個程式。例如正在執行一個QQ。 執行緒:程序之內多工的執行單位。例如迅雷當中正在下載的多個電影。 JVM當中:棧(Stack)記憶體是執行緒獨立的,堆(Heap)記憶體是執行緒共享的。 (1)Java程式執行的時候至少有兩個執行緒: 1)主
java實現多個執行緒達到一個闕伐值後一起執行
給大家推薦個靠譜的公眾號程式設計師探索之路,大家一起加油 1. CountDownLatch 1.1 簡介 CountDownLatch是一個同步輔助類,通過它可以完成類似於阻塞當前執行緒的功能,即:一個執行緒或多個執行緒一直等待,直到其他執行緒執行的操作完成。CountDownLatch用
java多執行緒:2 建立執行緒
如何建立一個多執行緒: Java提供了java.lang.Thread類,這就是執行緒的定義類,包含了:執行緒的優先順序,執行緒id、執行緒狀態等執行緒的基本資訊。 通過Thread類的說明,可以知道建立執行緒的兩種方式:1 extends Thread類,2 implements
多執行緒(一):建立執行緒的幾種方法
概括來說就是兩種:1、繼承Thread類,重寫run方法,然後start。不推薦這種,因為java的單繼承特性。 2、Thread類的建構函式中可以接受Runnable任務,所以只要是Runnable例項就可以作為引數給Thread 一般有兩種建立Runnable例項的方法(1)實現Runn
java多執行緒(二):建立執行緒的三種方式以及優缺點總結
一、Java中建立執行緒主要有三種方式: 1、繼承Thread類建立執行緒類 步驟: (1)定義Thread類的子類,並重寫該類的run方法,該run方法的方法體就代表了執行緒要完成的任務。因此把run()方法稱為執行體。 (2)建立Thread子類的例項,即建立了執行緒物件。
python只使用Queue和Thread自己實現一個最簡單的執行緒池
我的思路就是就是寫一個TifCutting類繼承自Thread,這個類裡有個屬性Queue;有一個addTask新增任務的方法,這個方法是把需要執行的函式放到Queue裡;因為繼承自Thread類,一定有一個重寫的run方法,這個方法是從自己的Queue屬性裡
java 多執行緒之利用Thread類建立執行緒(Day02)
前言:在一個程式中,如果一次只完成一件事情,很容易實現,但現實生活中很多事情都是同時進行的,所以在java中為了模擬這種狀態,引入了執行緒機制,簡單的說,當程式同時完成很多事情時,就是所謂的多執行緒。 實現執行緒的兩種方式:一是通過繼承Thread類來建立執行緒,另一種方法
python 建立多個執行緒並啟動
建立多個執行緒並啟動這些執行緒 th_num : 15 th_num = conf["crawl_threads"] self._thread_list = [] self.