linux的執行緒棧大小可以使用ulimit -s命令檢視,對於ubuntu 2.6的核心執行緒棧的預設大小為8m,如下:
root@npti:/# ulimit -s
32位的系統,虛擬記憶體空間是4g,其中高1g是核心空間使用者不可見,真正可以使用的記憶體空間大小是低3g的使用者空間,具體參考下表:
linux的記憶體模型,一般為:
位址作用
說=0xc000 0000
核心虛擬儲存器
使用者**不可見區域
<0xc000 0000
stack(使用者棧)
esp指向棧頂
空閒記憶體
>=0x4000 0000
檔案對映區
<0x4000 0000
空閒記憶體
heap(執行時堆)
通過brk/sbrk系統呼叫擴大堆,向上增長。
.data、.bss(讀寫段)
從可執行檔案中載入
>=0x0804 8000
.init、.text、.rodata(唯讀段)
從可執行檔案中載入
<0x0804 8000
保留區域
也就是說使用者可使用的記憶體空間就是0x00000000~0xc0000000的大小,這個空間的大小剛好是3g。
那麼程序中能建立的最大執行緒數就會受預設執行緒棧的大小限制,假設執行緒數n,則n*8m < 3*1024m一定要成立。
64位系統的位址空間不
是2^32, 也不是2^64,而一般是2^48。因為並不需要2^64那麼大的定址空間,過大的空間只會導致資源的浪費。64位linux一般使用48位來表示虛擬位址空間,使用40位來表示實體地址空間,可以通過cat /proc/cpuinfo來檢視
這兩個區間的特點是,第 47 位與 48~63 位相同,若這些位為 0 表示使用者空間,否則表示核心空間。
linux多執行緒預設棧大小和最大執行緒數
linux的執行緒棧大小可以使用ulimit s檢視,對於ubunt 2.6的核心執行緒棧的預設大小為8m,如下 shine shine bupt program c ulimit s 8192 32位的系統,虛擬記憶體空間是4g,其中1g是核心空間使用者不可見,真正可以使用的記憶體空間大小是3g,...
windows 和 linux 多執行緒
學習了幾天多執行緒技術,做個總結,便於記憶。一般 多執行緒傳遞引數 為 void 所以會有乙個強制轉換過程 int void 等,傳遞多個引數選擇 結構體指標。為了避免多個執行緒訪問資料衝突 會有乙個 叫做 臨界區 criticalsection 類 防止讀寫資料衝突,大概流程是 critical ...
linux建立執行緒失敗的原因是執行緒棧大小的設定
執行緒應用程式最常見導致建立執行緒失敗的原因是執行緒棧大小的設定。建立乙個新的執行緒,預設情況下系統為執行緒棧預留了2mb的定址空間。執行緒棧起始於程序虛擬 記憶體的高階位址,並向虛擬記憶體底端位址方向擴充套件。取決於執行緒本身的大小以及其它執行緒記憶體分配的情況,程序虛擬位址空間消耗過快可能導致建...