深入理解 linux c 线程栈大小及其影响
目前成都创新互联公司已为超过千家的企业提供了网站建设、域名、网页空间、网站托管、服务器托管、企业网站设计、郊区网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。
在计算机编程的世界里,线程是一个既常见又重要的概念,而 Linux 操作系统则被广泛应用于各种开发环境中。在 Linux C 编程中,线程栈是一个重要的部分,它对程序的运行效率和可靠性都有着重要的影响。本文将深入理解 Linux C 线程栈大小及其影响。
一、线程栈的概念
线程栈(或称函数调用栈)是计算机程序中的一种特殊数据结构,它用于存储当前函数的局部变量、参数以及其他信息。当一个新的函数被调用时,系统会为其分配一个新的栈帧,并将其入栈,所以栈帧是堆栈中一个函数执行过程中的一块内存空间,其中包含了该函数的参数、返回地址、局部变量等信息,函数执行结束后栈帧将被出栈。
二、线程栈的大小
在 Linux C 编程中,线程栈大小通常由系统配置文件指定(/etc/security/limits.conf),默认情况下线程栈大小为 8MB。不过,程序员可以使用 pthread_attr_setstacksize() 函数来设置线程栈大小,从而达到调整程序性能和资源利用的目的。
三、线程栈大小对性能的影响
线程栈大小的设定与程序的性能和资源使用效率密切相关。如果线程栈太小,可能会导致程序崩溃或出现非法访问错误,例如栈溢出等。如果线程栈太大,会浪费大量内存,并可能导致程序性能下降。
可根据程序的实际情况进行线程栈大小的调整。一般来说,栈大小的更佳值应该能够更大限度地充分利用可用资源,同时避免浪费,同时还要让程序的性能达到更佳状态。因此,在程序开发过程中,需要对更多的因素进行权衡和对比,以便达到更好的效果。
四、线程栈大小对资源的消耗
线程栈大小的设定也会影响系统资源的消耗。线程栈过大会增加系统内存的占用,甚至可能导致系统耗尽内存而影响其它运行的应用程序。因此,使用合适的线程栈大小应该综合考虑应用程序所需的线程数量等因素,尽量减少系统资源的占用。
五、线程栈大小的实现
在 Linux 中,线程栈的实现通常是基于动态分配内存的方式,通过 malloc() 或 mmap() 等函数来分配堆内存并将其设为线程栈。
下面是 malloc() 和 mmap() 两个函数的用法示例:
“`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); // 释放线程的参数内存
pthread_exit(NULL);
}
int mn() {
pthread_t tid;
int* arg = (int*)malloc(sizeof(int)); // 动态分配内存
*arg = 666;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setstacksize(&attr, STACKSIZE); // 设置线程栈大小
pthread_create(&tid, &attr, thread, arg);
pthread_attr_destroy(&attr);
pthread_join(tid, NULL);
return 0;
}
“`
mmap() 函数比 malloc() 更加灵活,它可以为线程栈预留一段内存空间,进行更加有效的内存管理。下面是 mmap() 函数的示例代码:
“`C
#define STACKSIZE (1024 * 1024) // 线程栈大小为 1MB
…
void* thread(void* arg) {
…
}
int mn() {
pthread_t tid;
int* arg = (int*)malloc(sizeof(int)); // 动态分配内存
*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); // 设置线程栈
pthread_create(&tid, &attr, thread, arg);
pthread_attr_destroy(&attr);
pthread_join(tid, NULL);
munmap(stack, STACKSIZE); // 释放线程栈内存
free(arg); // 释放线程的参数内存
return 0;
}
“`
相关问题拓展阅读:
检查ulimit -a 的结果,敬正扰查看stack size:
stack size(kbytes, -s) 8192
8192KB 就是栈的大小。不能超过这个栈的数目,因此上面2)分配的buf大小超过了栈限制,得到了setmentation fault。
LInux上,更大线程数目是:
number of threads = total virtual memory / (stack size*1024*1024)
在32位系统上,进程空间是4G,其中0-3G是用户空间(0x0-0xBFFFFFFF), 3G-4G是内核空间。
因此理论上讲,用户空间大小/栈大小=更大线程数。3072M/8M=384,亮旦考虑到系统的占用,主线程等,我的系统上是380. 也许在你的系统上是382.
我们可以减小栈限制或者增大虚拟内存使得线程的数目增加。
检查虚拟内存: ulimit -v
检查栈大小: ulimit -s
设置虚拟内存:ulimit -v 新值
设置栈大小:清雹 ulimit -s 新值
32为linux系统更大内存地址4G,0-3GB的给用户进程(User Space)使用,3-4GB给内核使用
stack size (kbytes, -s) 10240表示线程堆栈大小
3G/10M=更大线程数,但实际会比这个数小一点,因为程序本身占内存,还有些管理败枣猜线程
可以使用ulimit -s来设置stack size,设置的小一点开辟的线程就多。
同时/usr/include/bits/local_lim.h中的PTHREAD_THREADS_MAX限制了进程的更大线程数
/proc/sys/kernel/threads-max中限制了系统的更大线程数
你自己写个简单的察型代码就能测试出自己系统更大可以岩猛开多少线程
#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 线程栈大小的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于linux c 线程栈大小,「深入理解」Linux C 线程栈大小及其影响,Linux 怎么增大可以创建的更大线程数,linux 一个进程 最多开多少线程的信息别忘了在本站进行查找喔。
创新互联服务器托管拥有成都T3+级标准机房资源,具备完善的安防设施、三线及BGP网络接入带宽达10T,机柜接入千兆交换机,能够有效保证服务器托管业务安全、可靠、稳定、高效运行;创新互联专注于成都服务器托管租用十余年,得到成都等地区行业客户的一致认可。
网站名称:「深入理解」LinuxC线程栈大小及其影响(linuxc线程栈大小)
文章位置:http://www.mswzjz.cn/qtweb/news26/23626.html
攀枝花网站建设、攀枝花网站运维推广公司-贝锐智能,是专注品牌与效果的网络营销公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 贝锐智能