一直做windows伺服器向linux平台的移植工作,對於執行緒的棧空間也是似懂非懂,因而出現了一些問題和總結了部分經驗,供大家分享。
在我的伺服器上啟動了286個執行緒後,其後的執行緒啟動失敗了,返回的錯誤原因是12,經查詢定義如下:
#define
enomem 12 /* out of memory */
看來建立執行緒失敗的原因是分配記憶體失敗,同時程序占用的virt顯示也達到了3070mb,估計是虛擬記憶體不足了。
於是檢視了兩個平台關於執行緒堆疊空間方面的內容,列舉如下:
在windows中,createthread函式的引數dwstacksize是將要分配給新執行緒的以位元組為單位的棧大小。棧大小應該是4kb的非零整數倍,最小為8kb。堆疊預設的大小1mb。
stack size (kbytes, -s) 10240
怪不得使用了如此多的虛擬記憶體呢,286*10m=2860m,再加上其他部分消耗的,所以虛擬記憶體就不足了。
另外查閱文件,反映linux平台的棧預設大小應該是8192kb,而不是10m;但我這台伺服器是否被別人修改了就不清楚了。
linux平台使用如下函式操作posix執行緒棧空間:
int pthread_attr_setstacksize(pthread_attr_t *threadattr, int stack_size);//設定
int pthread_attr_getstacksize(pthread_attr_t *threadattr, int stack_size);//取得
馬上使用上述函式進行了測試,流程如下:
把執行緒棧空間設定為2m後進行了測試,確認成功減小了建立執行緒消耗的虛擬記憶體了。
執行緒棧空間的大小
一直做windows伺服器向linux平台的移植工作,對於執行緒的棧空間也是似懂非懂,因而出現了一些問題和總結了部分經驗,供大家分享。在我的伺服器上啟動了286個執行緒後,其後的執行緒啟動失敗了,返回的錯誤原因是12,經查詢定義如下 define enomem 12 out of memory 看來...
測試棧空間的大小
比如區域性變數是儲存在棧空間中的,今天突然在想棧的上限是多大呢,什麼時候才會棧溢位?ulimit 命令 linux下使用ulimit 命令可以檢視系統的很多上限值。可以看到系統設定棧的上限是8m 測試 現在我們寫個程式測試一下 兩種方法 1 第一種方法 最簡單的是在函式或直接在main 函式裡定義多...
棧空間大小限制
不同系統的棧空間大小不同,可通過如下方法檢視系統棧大小限制 cat proc 1 limits 該檔案列出了系統資源限制情況 ubuntu 16.04 limit soft limit hard limit units max cpu time unlimited unlimited seconds...