新聞中心
深入理解 linux c 線程棧大小及其影響

目前成都創(chuàng)新互聯(lián)公司已為超過千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)頁空間、網(wǎng)站托管、服務(wù)器托管、企業(yè)網(wǎng)站設(shè)計(jì)、郊區(qū)網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
在計(jì)算機(jī)編程的世界里,線程是一個(gè)既常見又重要的概念,而 Linux 操作系統(tǒng)則被廣泛應(yīng)用于各種開發(fā)環(huán)境中。在 Linux C 編程中,線程棧是一個(gè)重要的部分,它對(duì)程序的運(yùn)行效率和可靠性都有著重要的影響。本文將深入理解 Linux C 線程棧大小及其影響。
一、線程棧的概念
線程棧(或稱函數(shù)調(diào)用棧)是計(jì)算機(jī)程序中的一種特殊數(shù)據(jù)結(jié)構(gòu),它用于存儲(chǔ)當(dāng)前函數(shù)的局部變量、參數(shù)以及其他信息。當(dāng)一個(gè)新的函數(shù)被調(diào)用時(shí),系統(tǒng)會(huì)為其分配一個(gè)新的棧幀,并將其入棧,所以棧幀是堆棧中一個(gè)函數(shù)執(zhí)行過程中的一塊內(nèi)存空間,其中包含了該函數(shù)的參數(shù)、返回地址、局部變量等信息,函數(shù)執(zhí)行結(jié)束后棧幀將被出棧。
二、線程棧的大小
在 Linux C 編程中,線程棧大小通常由系統(tǒng)配置文件指定(/etc/security/limits.conf),默認(rèn)情況下線程棧大小為 8MB。不過,程序員可以使用 pthread_attr_setstacksize() 函數(shù)來設(shè)置線程棧大小,從而達(dá)到調(diào)整程序性能和資源利用的目的。
三、線程棧大小對(duì)性能的影響
線程棧大小的設(shè)定與程序的性能和資源使用效率密切相關(guān)。如果線程棧太小,可能會(huì)導(dǎo)致程序崩潰或出現(xiàn)非法訪問錯(cuò)誤,例如棧溢出等。如果線程棧太大,會(huì)浪費(fèi)大量內(nèi)存,并可能導(dǎo)致程序性能下降。
可根據(jù)程序的實(shí)際情況進(jìn)行線程棧大小的調(diào)整。一般來說,棧大小的更佳值應(yīng)該能夠更大限度地充分利用可用資源,同時(shí)避免浪費(fèi),同時(shí)還要讓程序的性能達(dá)到更佳狀態(tài)。因此,在程序開發(fā)過程中,需要對(duì)更多的因素進(jìn)行權(quán)衡和對(duì)比,以便達(dá)到更好的效果。
四、線程棧大小對(duì)資源的消耗
線程棧大小的設(shè)定也會(huì)影響系統(tǒng)資源的消耗。線程棧過大會(huì)增加系統(tǒng)內(nèi)存的占用,甚至可能導(dǎo)致系統(tǒng)耗盡內(nèi)存而影響其它運(yùn)行的應(yīng)用程序。因此,使用合適的線程棧大小應(yīng)該綜合考慮應(yīng)用程序所需的線程數(shù)量等因素,盡量減少系統(tǒng)資源的占用。
五、線程棧大小的實(shí)現(xiàn)
在 Linux 中,線程棧的實(shí)現(xiàn)通常是基于動(dòng)態(tài)分配內(nèi)存的方式,通過 malloc() 或 mmap() 等函數(shù)來分配堆內(nèi)存并將其設(shè)為線程棧。
下面是 malloc() 和 mmap() 兩個(gè)函數(shù)的用法示例:
“`C
#include
#include
#include
#define STACKSIZE 1024*1024 // 線程棧大小為 1MB
void* thread(void* arg) {
int i;
int* p = (int*)arg;
printf(“Thread Start! arg = %d\n”, *p);
for (i = 0; i
printf(“Thread Doing %dth step!\n”, i + 1);
sleep(1);
}
printf(“Thread End!\n”);
free(arg); // 釋放線程的參數(shù)內(nèi)存
pthread_exit(NULL);
}
int mn() {
pthread_t tid;
int* arg = (int*)malloc(sizeof(int)); // 動(dòng)態(tài)分配內(nèi)存
*arg = 666;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setstacksize(&attr, STACKSIZE); // 設(shè)置線程棧大小
pthread_create(&tid, &attr, thread, arg);
pthread_attr_destroy(&attr);
pthread_join(tid, NULL);
return 0;
}
“`
mmap() 函數(shù)比 malloc() 更加靈活,它可以為線程棧預(yù)留一段內(nèi)存空間,進(jìn)行更加有效的內(nèi)存管理。下面是 mmap() 函數(shù)的示例代碼:
“`C
#define STACKSIZE (1024 * 1024) // 線程棧大小為 1MB
…
void* thread(void* arg) {
…
}
int mn() {
pthread_t tid;
int* arg = (int*)malloc(sizeof(int)); // 動(dòng)態(tài)分配內(nèi)存
*arg = 666;
void* stack = mmap(NULL, STACKSIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_STACK, -1, 0);
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setstack(&attr, stack, STACKSIZE); // 設(shè)置線程棧
pthread_create(&tid, &attr, thread, arg);
pthread_attr_destroy(&attr);
pthread_join(tid, NULL);
munmap(stack, STACKSIZE); // 釋放線程棧內(nèi)存
free(arg); // 釋放線程的參數(shù)內(nèi)存
return 0;
}
“`
相關(guān)問題拓展閱讀:
- Linux 怎么增大可以創(chuàng)建的更大線程數(shù)
- linux 一個(gè)進(jìn)程 最多開多少線程
Linux 怎么增大可以創(chuàng)建的更大線程數(shù)
檢查ulimit -a 的結(jié)果,敬正擾查看stack size:
stack size(kbytes, -s) 8192
8192KB 就是棧的大小。不能超過這個(gè)棧的數(shù)目,因此上面2)分配的buf大小超過了棧限制,得到了setmentation fault。
LInux上,更大線程數(shù)目是:
number of threads = total virtual memory / (stack size*1024*1024)
在32位系統(tǒng)上,進(jìn)程空間是4G,其中0-3G是用戶空間(0x0-0xBFFFFFFF), 3G-4G是內(nèi)核空間。
因此理論上講,用戶空間大小/棧大小=更大線程數(shù)。3072M/8M=384,亮旦考慮到系統(tǒng)的占用,主線程等,我的系統(tǒng)上是380. 也許在你的系統(tǒng)上是382.
我們可以減小棧限制或者增大虛擬內(nèi)存使得線程的數(shù)目增加。
檢查虛擬內(nèi)存: ulimit -v
檢查棧大小: ulimit -s
設(shè)置虛擬內(nèi)存:ulimit -v 新值
設(shè)置棧大?。呵灞?ulimit -s 新值
linux 一個(gè)進(jìn)程 最多開多少線程
32為linux系統(tǒng)更大內(nèi)存地址4G,0-3GB的給用戶進(jìn)程(User Space)使用,3-4GB給內(nèi)核使用
stack size (kbytes, -s) 10240表示線程堆棧大小
3G/10M=更大線程數(shù),但實(shí)際會(huì)比這個(gè)數(shù)小一點(diǎn),因?yàn)槌绦虮旧碚純?nèi)存,還有些管理敗棗猜線程
可以使用ulimit -s來設(shè)置stack size,設(shè)置的小一點(diǎn)開辟的線程就多。
同時(shí)/usr/include/bits/local_lim.h中的PTHREAD_THREADS_MAX限制了進(jìn)程的更大線程數(shù)
/proc/sys/kernel/threads-max中限制了系統(tǒng)的更大線程數(shù)
你自己寫個(gè)簡單的察型代碼就能測試出自己系統(tǒng)更大可以巖猛開多少線程
#include
#include
#include
#include
void *foo(void *param)
{
}
int main()
{
int i = 0;
pthread_t thread;
while(1)
{
if(pthread_create(&thread,NULL,foo,NULL) != 0)
break;
i++;
}
printf(“i=%d\n”,i);
return 0;
}
linux c 線程棧大小的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于linux c 線程棧大小,「深入理解」Linux C 線程棧大小及其影響,Linux 怎么增大可以創(chuàng)建的更大線程數(shù),linux 一個(gè)進(jìn)程 最多開多少線程的信息別忘了在本站進(jìn)行查找喔。
創(chuàng)新互聯(lián)服務(wù)器托管擁有成都T3+級(jí)標(biāo)準(zhǔn)機(jī)房資源,具備完善的安防設(shè)施、三線及BGP網(wǎng)絡(luò)接入帶寬達(dá)10T,機(jī)柜接入千兆交換機(jī),能夠有效保證服務(wù)器托管業(yè)務(wù)安全、可靠、穩(wěn)定、高效運(yùn)行;創(chuàng)新互聯(lián)專注于成都服務(wù)器托管租用十余年,得到成都等地區(qū)行業(yè)客戶的一致認(rèn)可。
網(wǎng)頁題目:「深入理解」LinuxC線程棧大小及其影響(linuxc線程棧大小)
網(wǎng)址分享:http://m.fisionsoft.com.cn/article/coidgpj.html


咨詢
建站咨詢
